php - que - sql injection ejemplos reales
¿Mysql_real_escape_string() TOTALMENTE protege contra la inyección de SQL? (4)
Como otros han demostrado, mysql_real_escape_string()
se puede omitir en casos de bordes oscuros . Esa es una estrategia conocida para eludir la lógica de escape, pero podría haber otras vulnerabilidades desconocidas que aún no se han descubierto.
La forma simple y efectiva de evitar la inyección de SQL en PHP es usar declaraciones preparadas donde se pueda, y una lista blanca muy estricta donde no se pueda.
Las declaraciones preparadas, cuando realmente se usan y no son emuladas por el controlador PDO, son probablemente seguras (al menos en lo que respecta a la inyección SQL), ya que resuelven un problema fundamental con la seguridad de la aplicación: separan los datos de las instrucciones que operan en los datos. Se envían en paquetes separados; los valores parametrizados nunca tienen la posibilidad de manchar la cadena de consulta.
Es 2015. No escapes y concatenes nunca más. Aún debe validar sus entradas de acuerdo con la lógica de la aplicación (y del negocio), pero solo use las declaraciones preparadas.
En http://www.justinshattuck.com/2007/01/18/mysql-injection-cheat-sheet/?akst_action=share-this , hay una sección que afirma que se puede omitir mysql_real_escape_string con ciertas codificaciones de caracteres asiáticos
Pasando por alto mysql_real_escape_string () con BIG5 o GBK
"cadena de inyección"
に す す 追加 情報 情報:los caracteres anteriores son chinos Big5
¿Es esto realmente cierto? Y si es así, ¿cómo protegerías tu sitio web de esto, si no tuvieras acceso a las declaraciones preparadas?
Este es un error del servidor MySQL que, según los informes, fue reparado en mayo de 2006.
Ver:
- Error # 8303 de MySQL : los literales de cadenas con caracteres de varios bytes que contienen / están lexed incorrectamente
- Error # 8317 de MySQL : introductor de conjunto de caracteres en la consulta no puede anular el conjunto de caracteres de conexión
- Error # 8378 de MySQL : cadena escapada incorrectamente con el juego de caracteres del cliente ''gbk''
- MySQL 5.1.11 changelog
El error fue reportado fijo en MySQL 4.1.20, 5.0.22, 5.1.11.
Si usa 4.1.x, 5.0.x o 5.1.x, asegúrese de haber actualizado al menos los números de revisión menores.
Como solución NO_BACKSLASH_ESCAPES
, también puede habilitar el modo SQL NO_BACKSLASH_ESCAPES
que deshabilita la barra diagonal inversa como un carácter de escape de comillas.
Estoy bastante seguro de que solo no funciona si usa SQL para cambiar la codificación de caracteres.
Según Stefan Esser, " mysql_real_escape_string()
[no] es seguro cuando se usa SET NAMES
".
Su explicación, desde su blog :
SET NAMES se usa generalmente para cambiar la codificación de lo que es predeterminado a lo que necesita la aplicación. Esto se hace de una manera que
mysql_real_escape_string
no sabe acerca de esto. Esto significa que si cambias a una codificación de varios bytes que permite la barra invertida como 2º 3º 4º ... byte te encuentras con problemas, porquemysql_real_escape_string
no escapa correctamente. UTF-8 es seguro ...Una forma segura de cambiar la codificación es
mysql_set_charset
, pero eso solo está disponible en las nuevas versiones de PHP
Sin embargo, menciona que UTF-8 es seguro.