php - remove - strip_tags()
Desinfección de datos del usuario en GET por PHP. (4)
¿Cómo se sanean los datos en $ _GET -variables by PHP?
Desinfecto solo una variable en GET por strip_tags
. No estoy seguro de si debo desinfectar todo o no, porque la última vez que puse datos en Postgres, el problema se resolvió más fácilmente mediante el uso de pg_prepare
.
¿Cómo se sanean los datos en $ _GET -variables de PHP?
No desinfectas los datos en $ _GET. Este es un enfoque común en los scripts PHP, pero es completamente incorrecto *.
Todas las variables deben permanecer en formato de texto sin formato hasta el momento en que las incruste en otro tipo de cadena. No existe una forma única de escape o "desinfección" que pueda cubrir todos los tipos posibles de cadenas en las que podría incrustar sus valores.
Entonces, si está incrustando una cadena en una consulta SQL, necesita escapar de ella al salir:
$sql= "SELECT * FROM accounts WHERE username=''".pg_escape_string($_GET[''username''])."''";
Y si estás escupiendo la cadena en HTML, necesitas escapar de ella:
Cannot log in as <?php echo(htmlspecialchars($_GET[''username''], ENT_QUOTES)) ?>.
Si realizó estos dos pasos de escape en la matriz $ _GET al comienzo, como lo recomiendan las personas que no saben lo que están haciendo:
$_GET[''username'']= htmlspecialchars(pg_escape_string($_GET[''username'']));
Luego, cuando tenías un ''&'' en tu nombre de usuario, se convertiría misteriosamente en ''& amp;'' en su base de datos, y si tuviera un apóstrofe en su nombre de usuario, se convertiría en dos apóstrofes en la página. Entonces, cuando tiene un formulario con estos caracteres, es fácil terminar con cosas que se escapan dos veces cuando se editan, por lo que tantos CMS de PHP malos terminan con títulos de artículos rotos como "Nuevos libros de O //// ///////////////// "Reilly".
Naturalmente, recordar a pg_escape_string o mysql_real_escape_string, y htmlspecialchars cada vez que envías una variable es un poco tedioso, por eso todos quieren hacerlo (incorrectamente) en un lugar al comienzo del guión. Para la salida HTML, al menos puede guardar algo de escritura definiendo una función con un nombre corto que haga eco (htmlspecialchars (...)).
Para SQL, es mejor utilizar consultas parametrizadas. Para Postgres hay pg_query_params . O, de hecho, prepare declaraciones como mencionó (aunque personalmente las encuentro menos manejables). De cualquier manera, puede olvidarse de ''desinfectar'' o escapar para SQL, pero aún debe escapar si inserta en otros tipos de cadena, incluido HTML.
strip_tags () no es una buena manera de tratar la entrada para la visualización HTML. En el pasado ha tenido problemas de seguridad, ya que los analizadores del navegador son en realidad mucho más complicados en su interpretación de lo que puede ser una etiqueta de lo que podría pensar. htmlspecialchars () es casi siempre lo correcto que se debe usar, por lo que si alguien escribe un signo menos que realmente obtendrá un signo menos que literal y no encontrará la mitad de su texto desapareciendo misteriosamente.
(*: de todos modos, como enfoque general para resolver problemas de inyección. Naturalmente, hay controles específicos de dominio que vale la pena realizar en campos particulares, y hay tareas de limpieza útiles que puede hacer como eliminar todos los caracteres de control de los valores enviados. Pero esto es no es lo que la mayoría de los codificadores de PHP quieren decir con saneamiento.)
Debe limpiar todas las solicitudes, no solo POST como GET.
Puede usar la función htmlentities() , la función preg_replace () con expresiones regulares, o filtrar por conversión:
<?
$id = (int)$_GET[''id''];
?>
[] ''s
Desinfecte sus entradas de acuerdo a dónde va.
- Si lo muestra (en una página o como un valor de campo de entrada), use
htmlspecialchars
y / ostr_replace
. - Si lo usas como otro tipo, úsalo.
- Si lo incluye en la consulta SQL, escúchelo utilizando la función apropiada, tal vez elimine las etiquetas html si desea eliminarlas por completo (lo que no es lo mismo que escapar).
Lo mismo para POST o incluso datos de su base de datos, ya que los datos dentro de su base de datos generalmente no deben escaparse.
Dos cosas que debes comprobar:
- Codificación de su entrada frente a sus scripts PHP / salida / tabla DB
- Si tiene
[magic_quotes_gpc][1]
habilitado, debe deshabilitarlo (siempre que pueda) o con lasstripslashes()
valores GET, POST y COOKIE.magic_quotes_gpc
está en desuso, debe desinfectar los datos que manipula, dependiendo del uso de esos datos.
Si está hablando de desinfectar la salida, recomendaría almacenar el contenido en su base de datos en su forma completa, sin escaparse, y luego escapar de ella ( htmlspecialchars o algo así) cuando está haciendo eco de los datos, de esa manera tiene más opciones para la salida. Vea this pregunta para una discusión sobre el contenido de la base de datos de desinfección / escape.
En términos de almacenamiento en postgres, use pg_escape_string en cada variable en la consulta, para evitar comillas, y generalmente protéjase contra la inyección de SQL.
Editar:
Mis pasos habituales para almacenar datos en una base de datos y luego recuperarlos son:
Llame a la función de escape de datos de la base de datos (pg_escape_string, mysql_escape_string, etc.) para escapar de cada variable $ _GET entrante utilizada en su consulta. Tenga en cuenta que el uso de estas funciones en lugar de las barras de suma no permite tener barras adicionales en el texto cuando se almacena en la base de datos.
Cuando obtiene los datos de vuelta de la base de datos, puede usar htmlspecialchars en cualquier dato generado, sin necesidad de usar tiras de barras, ya que no debería haber barras adicionales.