Error prohibido al enviar un formulario PHP simple

Tengo un problema no complicado … que parece ser más complicado de lo que debería ser.

Tengo un formulario simple que se usa para agregar contenido a un sitio web. Algunos de los campos necesitan tener html ingresado en ellos. Sin embargo, cuando ingresa ciertos elementos html en las diferentes partes del formulario, decide que lo odia y arroja un error 403 prohibido. Aquí está el formulario a continuación:

 <form action="?id=&action=edit" method="post"> 
Title: <input type="text" name="title" style="width: 300px;" value="" />
URL: <input type="text" name="url" style="width: 300px;" value="" />
Sub-Category: A B
Short Description:
Template:
Ads:
Keywords:
Questions:
Salary:
Jobs:
Meta Description: <input type="text" name="metaDescription" style="width: 300px;" value="" />
Meta Keywords: <input type="text" name="metaKeywords" style="width: 300px;" value="" />
 

Tengo otras formas que siguen este mismo patrón sin ningún problema. Para hacer esto aún más confuso, solo lanzará este error cuando se suministren elementos de 2 html en el área de texto (maneja muy bien un elemento html). Las áreas de texto son anuncios, palabras clave, salarios y trabajos. Las otras áreas de texto lo tomarán bien, pero estos 4 no lo harán. Si puedo hacer esto un poco más confuso, si simplemente ingreso texto en esos campos y lo guardo, se ejecuta sin problemas.

Para manejar los datos de la publicación, solo uso mysql_real_escape_string () para manejar los datos, no hago una strip_tags () ya que necesito el html allí.

¿Es este un extraño error de Apache que se puede arreglar con .htaccess? ¿Hay algún módulo en PHP que esté en conflicto con esto?

——- EDITAR AQUÍ ES LA RESPUESTA ——–

Ben sacó una respuesta fantástica que probablemente sea el problema y no puedo solucionarlo por falta de privilegios. Así que creé un evento onsubmit a partir de una idea que Gerben me dio y escribí el siguiente javascript.

 function awesome() { elements = document.forms[0].elements; for(var i = 0; i < elements.length; i++) { switch(elements[i].name) { case "ads": case "shortDescription": case "template": case "questions": case "salary": case "jobs": str = elements[i].value; elements[i].value = str.replace(/</g,"#@!"); break; } } return true; } 

Luego, en el extremo de recepción, hice un str_replace para reemplazar # @! volviendo a un <y eso al menos hizo que la cosa funcionara.

Estoy a caballo … ¡hyaa!

Gracias por toda tu ayuda. 🙂

Dado que puede publicar, y que su administración posterior es aparentemente extremadamente simple y que es poco probable que arroje errores 403 o redireccione a directorios prohibidos, voy a arriesgarme a suponer que está ejecutando un nivel de Apache. cortafuegos Eche un vistazo a los archivos de configuración de Apache y compruebe si está ejecutando mod_security o cualquier otro módulo de firewall cargado. Hay varias formas en que mod_security se puede configurar, incluyendo el escaneo de datos POST para contenido html y reactjsndo en consecuencia. Si está configurado para evitar la inyección html, este puede ser su problema (consulte los detalles de configuración aquí: http://www.modsecurity.org/projects/modsecurity/apache/feature_content_injection.html ).

Para probar esto, intente agregar un archivo htaccess en su raíz web (suponiendo que se le permite anular la configuración de Apache con htaccess) y establecer:

 SecFilterEngine Off 

Reinicie apache y luego vea si todavía está sucediendo.

Si este es un host compartido, o si no tiene la capacidad de modificar la configuración de Apache, puede intentar una solución usando javascript que base64 codifique todos los datos antes de enviar (onsubmit), y luego base64_decode ($ _ POST [key]) en el script php que lo procesa.

Solo tuve el mismo tipo de problema al enviar el error 403, pero para mí fue simple porque el formulario era demasiado grande y desencadenó una regla en mod_security.

También vale la pena boost php.ini post_max_size y probar el tamaño usando: $_SERVER['CONTENT_LENGTH']

Podría ser un poco tarde, pero hoy me enfrenté a un problema similar al intentar enviar un formulario a través de POST. No me permitiría enviar un texto con un enlace y arrojaría un error de Prohibición de acceso prohibido 403. Deshabilitando modsecurity (lo hice desde el panel de control) lo resolvió!