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

Tengo un formulario simple que se utiliza para añadir contenido a un sitio web. Algunos de los campos deben tener el código html introducido en ellos. Sin embargo, cuando se introduce ciertos elementos de html en las diferentes partes de la forma, se decide que te odia y lanza un error 403 prohibido. Aquí está el formulario de abajo:

<?php
$data = f("SELECT * FROM table WHERE id = '{$_GET['id']}'");
?>
<form action="<?=$_SERVER['PHP_SELF']?>?id=<?=$_GET['id']?>&action=edit" method="post">
<table cellspacing="0" cellpadding="2" border="0">
<tr>
<td><b>Title:</b></td>
<td><input type="text" name="title" style="width: 300px;" value="<?=$data['title']?>" /></td>
</tr>
<tr>
<td><b>URL:</b></td>
<td><input type="text" name="url" style="width: 300px;" value="<?=$data['url']?>" /></td>
</tr>
<tr>
<td><b>Sub-Category:</b></td>
<td>
<select name="subCategoryId">
<option value=""></option>
<option value="1">A</option>
<option value="2">B</option>
</select>
</td>
</tr>
<tr>
<td><b>Short Description:</b></td>
<td><textarea name="shortDescription" rows="6" cols="60"><?=$data['shortDescription']?></textarea></td>
</tr>
<tr>
<td><b>Template:</b></td>
<td><textarea name="template" rows="6" cols="60"><?=$data['template']?></textarea></td>
</tr>
<tr>
<td><b>Ads:</b></td>
<td><textarea name="ads" rows="6" cols="60"><?=$data['ads']?></textarea></td>
</tr>
<tr>
<td><b>Keywords:</b></td>
<td><textarea name="keywords" rows="6" cols="60"><?=$data['keywords']?></textarea></td>
</tr>
<tr>
<td><b>Questions:</b></td>
<td><textarea name="questions" rows="6" cols="60"><?=$data['questions']?></textarea></td>
</tr>
<tr>
<td><b>Salary:</b></td>
<td><textarea name="salary" rows="6" cols="60"><?=$data['salary']?></textarea></td>
</tr>
<tr>
<td><b>Jobs:</b></td>
<td><textarea name="jobs" rows="6" cols="60"><?=$data['jobs']?></textarea></td>
</tr>
<tr>
<td><b>Meta Description:</b></td>
<td><input type="text" name="metaDescription" style="width: 300px;" value="<?=$data['metaDescription']?>" /></td>
</tr>
<tr>
<td><b>Meta Keywords:</b></td>
<td><input type="text" name="metaKeywords" style="width: 300px;" value="<?=$data['metaKeywords']?>" /></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type="submit" name="submit" value="Edit Job" /></td>
</tr>
</table>
</form>

Tengo otras formas que siguen este mismo patrón, sin ningún problema. Para hacer aún más presente aún más confuso, sólo tira este error cuando cualquiera de los 2 elementos html son suministrados en el área de texto (se maneja un elemento html muy bien). Las áreas de texto son los anuncios, las palabras clave, los salarios y los puestos de trabajo. Las otras áreas de texto que va a tomar bien, pero estos 4 no. Si puedo hacer esto un poco más confuso, si me sencilla de entrar en el texto de los campos y guardar, se ejecuta sin problemas.

Para manejar los datos de envío, yo sólo uso mysql_real_escape_string() para manejar los datos, no hago strip_tags() como necesito el código html de allí.

Es este un extraño apache error que puede ser corregido .htaccess? Hay un módulo de PHP que está en conflicto con esto?

——- EDITAR, AQUÍ ESTÁ LA RESPUESTA——–

Ben trajo una fantástica respuesta que es probablemente el problema y no puedo solucionarlo por falta de privilegios. Así que he creado un evento onsubmit partir de una idea que Gerben me dio y escribió 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;    
}

A continuación, en el extremo receptor, hice un str_replace para reemplazar #@! de vuelta a un < y que al menos hizo que la cosa funcione.

Estoy en un caballo….hyaa!

Gracias por toda su ayuda. 🙂

También puede publicar el código que se encarga de procesar el envío? Esto puede ser una redirección o error de controlador problema generado por la validación de php.
¿La url de un aspecto diferente cuando se envía el formulario, como se supone a la dirección url de la página del formulario en sí?
el 403 se produce por la apache, por lo que no debería ser provocada por el php. Mi conjetura es que el POST no está permitido por su anfitrión de alguna manera. Esto es muy raro, aunque.
403 normalmente se produce por la apache, PHP pero puede causar por (a) intencionalmente, mediante el envío de error 403 encabezados; o (b) de activación de un apache 403 error al redirigir la página a un recurso prohibido. Sin embargo, dada la Luciérnaga de la respuesta, parece ser ni un _POST restricción o php gatillo dado lo que él está describiendo. Tengo una idea…
Lo siento, no leí tu pregunta muy bien. Trate de usar <?=htmlentities($data['xxxx'])?>

OriginalEl autor n0nag0n | 2012-01-11

5 Comentarios

  1. 7

    Dado que usted es capaz de publicar, y que su posterior manipulación es aparentemente muy sencillo y así de raro a tirar 403 errores o redirigir prohibida directorios, voy a aventurar una conjetura que usted está ejecutando un apache a nivel de firewall. Eche un vistazo a sus archivos de configuración de apache, y comprobar para ver si usted está ejecutando el mod_security o cualquier otro firewall módulo cargado. Hay un número de maneras de mod_security puede ser configurado, incluyendo el análisis POSTERIOR de los datos para el contenido html y reaccionar en consecuencia. Si está configurado para evitar la inyección de código html, este puede ser tu problema (consulte configuración de los detalles aquí: http://www.modsecurity.org/projects/modsecurity/apache/feature_content_injection.html).

    Para probar esto, trate de añadir un archivo htaccess en la raíz web (suponiendo que usted está autorizado a anular la configuración de apache con htaccess) y ajuste:

    SecFilterEngine Off

    Reiniciar apache y, a continuación, ver si sigue sucediendo.

    Si se trata de un host compartida, o de lo contrario no tienen la capacidad de modificar la configuración de apache, usted puede intentar una solución mediante javascript que codifica en base64 todos los datos antes de enviar (onsubmit) y, a continuación, base64_decode($_POST[key]) en el script php que procesa.

    Estoy pensando que no puede anular esa característica. Hice phpinfo(); y yo no veo nada acerca de firewall, o mod_security. Traté de introducir el código en un archivo htaccess y me dio un Internal Server Error 500. Es otro de los clientes de la cuenta, y están utilizando fastwebhost.com que….bloquea tu IP si usted respira mal.
    Gracias por tu ayuda. He descubierto con la suya y Gerben de ayuda.
    Esa es una gran idea. La mía es más……novato y…..sí, acaba de novato. 🙂

    OriginalEl autor Ben D

  2. 2

    Sólo tenía el mismo tipo de problema en enviar mostró 403 error, pero para mí fue sencillo debido a que la forma era demasiado grande como la activación de una regla en mod_security.

    También vale la pena el aumento de php.ini post_max_size y tamaño de la prueba utilizando: $_SERVER['CONTENT_LENGTH']

    OriginalEl autor John Magnolia

  3. 2
    <IfModule mod_security.c>
    SecFilterEngine Off
    SecFilterScanPOST Off
    </IfModule>

    Utilizar Este Código Creo Que Esta Solucionado Su Problema

    OriginalEl autor Anurag

  4. 0

    Podría ser un poco tarde, pero he tenido un problema similar al de hoy al intentar enviar un formulario por correo. No me permite enviar un texto con un enlace y lanzaría un 403 Prohibido el Acceso Denegado.
    La desactivación de modsecurity (lo hice desde el panel de control) resuelto!

    OriginalEl autor Moses Kirathe

  5. 0

    El problema es causado por el Apache Firewall mod, también puede ser fijado a través de .htaccess si no puede o no desea editar el httpd.conf.

    Crear o editar los existentes .htaccess en el directorio donde está el script se llama (por lo general, donde el index.php es) y añadir las siguientes líneas:

    <IfModule mod_security.c>
    #SecRuleEngine Off
    SecRequestBodyAccess Off
    </IfModule>

    OriginalEl autor sax

Dejar respuesta

Please enter your comment!
Please enter your name here