Me gustaría tener una función que se comporte como mysql_real_escape_string sin conectarme a la base de datos, ya que a veces necesito hacer pruebas en seco sin conexión a la base de datos. mysql_escape_string está obsoleto y, por lo tanto, no es deseable. Algunos de mis hallazgos:
http://www.gamedev.net/community/forums/topic.asp?topic_id=448909
Respuestas:
Es imposible escapar de forma segura de una cadena sin una conexión DB.
mysql_real_escape_string()
y las declaraciones preparadas necesitan una conexión a la base de datos para que puedan escapar de la cadena usando el juego de caracteres apropiado; de lo contrario, los ataques de inyección SQL aún son posibles usando caracteres de múltiples bytes.Si solo está probando , entonces también puede usar
mysql_escape_string()
, no está 100% garantizado contra ataques de inyección de SQL, pero es imposible construir algo más seguro sin una conexión de base de datos.fuente
mysql_escape_string
sin conexión (todavía estoy tratando de averiguar por qué). Dado que esa función está en desuso, me pregunto cómo puedo reemplazarla. Ciertamente parece razonable que se pueda especificar el "juego de caracteres apropiado" en cualquier función que lo reemplace sin abrir una conexión.Bueno, de acuerdo con la página de referencia de la función mysql_real_escape_string : "mysql_real_escape_string () llama a la función de biblioteca de MySQL mysql_real_escape_string, que escapa a los siguientes caracteres: \ x00, \ n, \ r, \, '," y \ x1a ".
Con eso en mente, entonces la función dada en el segundo enlace que publicó debería hacer exactamente lo que necesita:
fuente
mb_strpos()
(ymb_substr()
crear un comportamiento similar asubstr_replace()
) para hacer esto?En oposición directa a mi otra respuesta, esta función siguiente probablemente sea segura, incluso con caracteres de varios bytes.
Espero que alguien con más conocimientos que yo pueda decirme por qué el código anterior no funciona ...
fuente
De investigaciones posteriores, encontré:
http://dev.mysql.com/doc/refman/5.1/en/news-5-1-11.html
Corrección de seguridad:
Se ha encontrado un agujero de seguridad de inyección SQL en el procesamiento de codificación multibyte. El error estaba en el servidor, el análisis incorrecto de la cadena escapó con la función de API de C mysql_real_escape_string ().
Esta vulnerabilidad fue descubierta e informada por Josh Berkus y Tom Lane como parte de la colaboración de seguridad entre proyectos del consorcio OSDB. Para obtener más información sobre la inyección SQL, consulte el siguiente texto.
Discusión. Se ha encontrado un agujero de seguridad de inyección SQL en el procesamiento de codificación multibyte. Un agujero de seguridad de inyección de SQL puede incluir una situación en la que cuando un usuario proporciona datos para ser insertados en una base de datos, el usuario puede inyectar sentencias de SQL en los datos que ejecutará el servidor. Con respecto a esta vulnerabilidad, cuando se utiliza un escape sin conocimiento del conjunto de caracteres (por ejemplo, añade barras () en PHP), es posible omitir el escape en algunos conjuntos de caracteres de varios bytes (por ejemplo, SJIS, BIG5 y GBK). Como resultado, una función como addedlashes () no puede prevenir ataques de inyección de SQL. Es imposible arreglar esto en el lado del servidor. La mejor solución es que las aplicaciones utilicen el escape con reconocimiento de conjuntos de caracteres que ofrece una función como mysql_real_escape_string ().
Sin embargo, se detectó un error en cómo el servidor MySQL analiza la salida de mysql_real_escape_string (). Como resultado, incluso cuando se usó la función mysql_real_escape_string () consciente del juego de caracteres, la inyección de SQL fue posible. Este error se ha corregido.
Soluciones alternativas. Si no puede actualizar MySQL a una versión que incluye la solución para el error en el análisis de mysql_real_escape_string (), pero ejecuta MySQL 5.0.1 o superior, puede usar el modo SQL NO_BACKSLASH_ESCAPES como solución. (Este modo se introdujo en MySQL 5.0.1.) NO_BACKSLASH_ESCAPES habilita un modo de compatibilidad estándar SQL, donde la barra invertida no se considera un carácter especial. El resultado será que las consultas fallarán.
Para configurar este modo para la conexión actual, ingrese la siguiente instrucción SQL:
También puede configurar el modo globalmente para todos los clientes:
Este modo SQL también se puede habilitar automáticamente cuando el servidor se inicia usando la opción de línea de comandos --sql-mode = NO_BACKSLASH_ESCAPES o configurando sql-mode = NO_BACKSLASH_ESCAPES en el archivo de opciones del servidor (por ejemplo, my.cnf o my.ini , dependiendo de su sistema). (Error # 8378, CVE-2006-2753)
Consulte también el error n. ° 8303.
fuente
NO_BACKSLASH_ESCAPES
introduce otras vulnerabilidades .