¿Cómo se desinfecte datos en $ _GET variables- por PHP?
Usted no desinfectar datos en $ _GET. Este es un enfoque común en los scripts de PHP, pero está completamente mal *.
Todas sus variables deben permanecer en forma de texto sin formato hasta el momento en que las incruste en otro tipo de cadena. No hay ninguna forma de escape o "desinfección" que pueda abarcar todos los tipos de cadenas posibles en las que pueda incrustar sus valores.
Así que si estás incrustación de una cadena en una consulta SQL, tiene que escapar de ella a la salida:
$sql= "SELECT * FROM accounts WHERE username='".pg_escape_string($_GET['username'])."'";
Y si estás escupiendo la cadena a cabo en HTML, tiene que escapar entonces:
Cannot log in as <?php echo(htmlspecialchars($_GET['username'], ENT_QUOTES)) ?>.
Si no ambos pasos se escapan de la matriz $ _GET al principio, según lo recomendado por personas que no saben lo que están haciendo:
$_GET['username']= htmlspecialchars(pg_escape_string($_GET['username']));
Luego, cuando tenía un '&' en su nombre de usuario, misteriosamente se convertiría en '& amp;' en su base de datos, y si tenía un apóstrofo en su nombre de usuario, se convertiría en dos apóstrofes en la página. Luego, cuando tienes un formulario con estos personajes, es fácil terminar escapando cosas cuando se editan, razón por la cual muchos CMS PHP malos terminan con títulos de artículos rotos como "Libros nuevos de O \\\\". \\\\\\\\\\\\ '' Reilly ''.
Naturalmente, recordar pg_escape_string o mysql_real_escape_string y htmlspecialchars cada vez que envía una variable es un poco tedioso, por lo que todos quieren hacerlo (incorrectamente) en un lugar al comienzo del script. Para la salida HTML, al menos puede guardar algunos tipeos definiendo una función con un nombre corto que haga eco (htmlspecialchars (...)).
Para SQL, es mejor utilizar consultas con parámetros. Para Postgres, hay pg_query_params. O, de hecho, declaraciones preparadas como usted mencionó (aunque personalmente las encuentro menos manejables). De cualquier manera, puede olvidarse de "desinfectar" o escaparse para SQL, pero igualmente debe escapar si incorpora otros tipos de cadena, incluido HTML.
strip_tags() no es una buena forma de tratar la entrada para la visualización de 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 para usar, de modo que si alguien escribe un signo menos de lo que realmente obtendrán un signo literal de menos de no encontrar la mitad de su texto desapareciendo misteriosamente.
(*: como un enfoque general para resolver problemas de inyección, naturalmente. Hay controles específicos de dominio que vale la pena hacer 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 no es lo que la mayoría de los codificadores de PHP significan por sanitización.)
Desinfección para evitar inyecciones de SQL o ataques XSS? –