2010-10-29 23 views
7

¿Por qué mucha gente usa ambas funciones en una cadena? Veo un montón de stripslashes(strip_tags($field)); (o al revés)Datos de escape - stripslashes, strip_tags

¿No es strip_tags suficiente para filtrar cualquier cosa xss y cosas por el estilo?

Respuesta

9

Escapar de los datos no tiene nada que ver con strip_tags o stripslashes. Estas funciones filtran ciertos caracteres de una cadena mientras que "escapando" codifica ciertos caracteres para que no sean interpretados por un navegador o base de datos.

Puede usar strip_tags para eliminar las etiquetas HTML de las cadenas que se envían a PHP desde el navegador. Mejor aún, también podría almacenar con seguridad los mismos datos sin pasarlos por strip_tags si usa htmlspecialchars para escapar de cualquier carácter que pudiera delimitar las etiquetas cuando envíe los datos nuevamente al navegador.

stripslashes elimina las barras de una cadena, y solo tiene que preocuparse si las "comillas mágicas" están habilitadas. Es una retención de una época anterior cuando los desarrolladores de PHP ingenuamente asumieron que cada parte de los datos provenientes del navegador estaba destinada a una base de datos y que no se podía confiar en que los desarrolladores escaparan de la base de datos ellos mismos.

2

Cuando las comillas mágicas están activadas, se escaparán automáticamente las comillas de todas las variables POST, GET, etc. Stripslashes elimina los antes de usar los datos. Strip tags intenta para eliminar todas las etiquetas html.

5

¿No tiene strip_tags suficiente para filtrar cualquier cosa xss y cosas por el estilo?

Nop. La única forma segura de filtrar cosas XSS es htmlspecialchars(), aunque veo muchas recomendaciones para usar strip_tags() además.

Véase p. discusión en esta pregunta: Is preventing XSS and SQL Injection as easy as does this…

Lo que el stripslashes se supone que debe hacer en este contexto, no tengo ni idea. Probablemente sea un intento de deshacer los efectos de la función magic quotes ahora en desuso, pero esto nunca debe aplicarse sin verificar primero si esa función en particular está habilitada.

0

stripslashes() se usa normalmente para los servidores que tienen Magic Quotes habilitadas. Como Magic Quotes está en desuso (y no se recomienda) lo que probablemente esté buscando es addslashes(), que es para evitar inyecciones de SQL. Por ejemplo, si la instrucción SQL lee:

SELECT * FROM users WHERE username='$username' AND password = '$password' 

sin addslashes(), se puede hacer una inyección de SQL estableciendo el nombre de usuario para:

admin'-- 

lo tanto, en otras palabras, addslashes() - o mejor aún, mysql_real_escape_string() - es para evitar la inyección de SQL, mientras que strip_tags() es para evitar la inyección de XSS.

+1

es probable que te estés refiriendo a 'addslashes()'. Pero eso nunca debe usarse para sanitizar una declaración de SQL. Utilice siempre la función de escape nativa de la envoltura de la base de datos, para las funciones 'mysql_ *', como usted dice, que es 'mysql_real_escape_string()'. –

+1

'stripslashes' no hace esto en absoluto, y no tiene nada que ver con la preparación de datos para una base de datos ... – meagar

+1

lo siento, me confundí allí un momento. (sonrisa tímida) arreglado! – jusunlee

1

strip_tags() generalmente no es suficiente para evitar ataques XSS por sí mismo, por lo que es mejor tener precaución.

considerar lo siguiente:

$str = "' onclick='javascript:alert(0);' alt='"; 
echo "<a href='". strip_tags($str) ."'></a>"; 
// output is <a href='' onclick='javascript:alert(0);' alt=''></a> 

Uno no siempre necesita etiquetas HTML para ejecutar un ataque XSS. Puede ser un ataque menos efectivo, pero aún así es un vector de ataque potencial.

1

He notado que strip_tags() agrega barras invertidas para citar caracteres. Lo he verificado y magic_quotes_gpc NO está activado. La pregunta original de OP era por qué algunos codificadores rodean strip_tags() con stripslashes() y es por eso que lo hago, porque no quiero que la base de datos almacene barras diagonales inversas porque ya preparo mis datos antes de guardarlos en la base de datos.