php - usar - La mejor forma de defenderse contra la inyección de mysql y la creación de scripts entre sitios
php basico pdf (4)
¡No ! Usar mysql_real_escape_string
es suficiente para protegerte contra la inyección de SQL y las stropslashes
que estás haciendo te stropslashes
vulnerable a la inyección de SQL. Si realmente lo quieres, ponlo antes como en:
function madSafety($string)
{
$string = stripslashes($string);
$string = strip_tags($string);
$string = mysql_real_escape_string($string);
return $string;
}
stripslashes
no es realmente útil si estás haciendo mysql_real_escape_string
.
strip_tags
protege contra inyección HTML / XML, no SQL.
Lo importante a tener en cuenta es que debes escapar de tus cadenas de manera diferente según el uso que le hagas.
Cuando está haciendo solicitudes MYSQL, use mysql_real_escape_string
. Cuando está sacando páginas web, use htmlentities
. Para construir enlaces web usa urlencode
...
Como notó vartec, si puedes usar marcadores de posición por todos los medios, hazlo.
Por el momento, aplico un método de ''tirar todo a la pared y ver qué pega'' para detener los problemas antes mencionados. A continuación se muestra la función que he improvisado:
function madSafety($string)
{
$string = mysql_real_escape_string($string);
$string = stripslashes($string);
$string = strip_tags($string);
return $string;
}
Sin embargo, estoy convencido de que hay una mejor manera de hacerlo. Estoy usando FILTER_ SANITIZE_STRING y esto no parece totalmente seguro.
Supongo que estoy preguntando, ¿qué métodos emplean y qué tan exitosos son? Gracias
La mejor manera contra la inyección de SQL es vincular variables, en lugar de "inyectarlas" en una cadena. http://www.php.net/manual/en/mysqli-stmt.bind-param.php
¡Este tema es tan incorrecto!
¡NO debe filtrar la entrada del usuario! Es información que ha sido ingresada por él. ¿Qué vas a hacer si quiero que mi contraseña sea como: ''"''>s3cr3t<script>alert()</script>
Filtra los personajes y déjame una contraseña modificada, ¿así que ni siquiera puedo tener éxito en mi primer inicio de sesión? Esto es malo.
La solución adecuada es usar declaraciones preparadas o mysql_real_escape_string()
para evitar las inyecciones de sql y utilizar el escape de los caracteres contextualizado para evitar que el código html se arruine.
Déjame recordarte que la web es solo una de las formas en que puedes representar la información ingresada por el usuario. ¿Aceptarías tal desvinculación si algún software de escritorio lo hace? Espero que tu respuesta sea NO y entiendas por qué esta no es la manera correcta.
Tenga en cuenta que en un contexto diferente, se deben escapar diferentes caracteres. Por ejemplo, si necesita mostrar el nombre del usuario como información sobre herramientas, usará algo como:
<span title="{$user->firstName}">{$user->firstName}</span>
Sin embargo, si el usuario ha establecido su nombre para ser como ''"><script>window.document.location.href="http://google.com"</script>
¿qué vas a hacer? ¿Eliminar las comillas? ¡Esto sería tan incorrecto! En lugar de hacer esto sin sentido, considere escaparse de las comillas mientras procesa los datos, ¡no mientras persiste!
Otro contexto que debe considerar es al generar el valor en sí mismo. Considere el código html usado anteriormente e imagine que el nombre del usuario sea como <textarea>
. Esto incluiría todo el código html que sigue en este elemento textarea, y así dividiría toda la página.
Una vez más, considere escaparse de los datos según el contexto en el que lo esté utilizando.
PD: No estoy seguro de cómo reaccionar ante esos votos negativos. ¿Estás, gente, en realidad leyendo mi respuesta?
Simplemente haciendo muchas cosas que realmente no entiendes, no te ayudará. Debe comprender qué son los ataques de inyección y exactamente cómo y dónde debe hacer qué.
En viñetas:
- Deshabilitar comillas mágicas Son una solución inadecuada y confunden las cosas.
- Nunca inserte cadenas directamente en SQL. Use los parámetros vinculados, o escape (usando
mysql_real_escape_string
). - No desapegue (por ej.,
stripslashes
) cuando recupere datos de la base de datos. - Cuando incrusta cadenas en html (por ejemplo, cuando hace
echo
), debehtmlentities
la cadena (Usarhtmlentities
conENT_QUOTES
). - Si necesita incrustar html-strings en html, debe considerar el origen de la cadena. Si no es de confianza, debe canalizarlo a través de un filtro.
strip_tags
es, en teoría, lo que deberías usar, pero está defectuoso; Use HtmlPurifier en su lugar.
Ver también: ¿Cuál es el mejor método para desinfectar la entrada del usuario con PHP?