2012-04-21 22 views
5

Estoy desarrollando mi sitio web personal utilizando php. todo está bien, pero acabo de leer el manual en mysql_real_escape_stringphp.net y encontró dos cosas:preguntas sobre mysql_real_escape_string

  1. Esta función debe siempre (con pocas excepciones) se utiliza para hacer que los datos de seguridad antes de enviar una consulta a MySQL.
  2. mysql_real_escape_string() no escapa% y _. Estos son comodines en MySQL si se combinan con LIKE, GRANT o REVOKE.

Tengo dos preguntas: 1-
¿cuáles son estas excepciones?
2- ¿cómo escapar de esos personajes?

+1

Debe usar [PDO] (http://php.net/manual/en/book.pdo.php). Hacer su sitio web personal es una gran oportunidad para aprenderlo. – kapa

+0

El punto 2 se refiere a las cláusulas 'LIKE', y no es relevante para usar datos de cadena en otros contextos. – mario

+0

una de las excepciones podría ser una cadena ya escapada. – hjpotter92

Respuesta

5

Esta función debe usarse siempre (con algunas excepciones) para proteger los datos antes de enviar una consulta a MySQL.

Para mi gran decepción, la página del manual dice basura completa, y they refuse to make it correct.
Por el contrario, son pocos los casos en los que necesita esta función. Por ejemplo, para decir SOLO UNA: cuando agrega una cadena en la consulta SQL.

mysql_real_escape_string() no escapa% y _. Estos son comodines en MySQL si se combinan con LIKE, GRANT o REVOKE.

No importa demasiado. Siempre que use el operador LIKE a propósito, estos caracteres no causarán ningún daño.

Pero si quieres escapar de la cadena va a gustar declaración, puede utilizar este código

$like = addCslashes($like,'\%_'); 

(observe la barra -. También se requiere que se escapó como un manual que indica que también tenga en cuenta el C letra en el nombre de la función).
Después de este procedimiento, puede usar la variable resultante $like de cualquier forma que esté utilizando para crear sus consultas, citarlas y escapárselas o usarlas en la declaración preparada.

+0

gracias, pero ¿cómo escapar de ellos ('%', '_')? – undone

+1

simplemente con la misma barra inclinada. 'addCslashes ($ data,"% _ ");' hará el truco –

+1

Pero solo hazlo para las piezas que entran en un contexto de coincidencia de patrones. De lo contrario, verá un literal '\%' en su SQL. – Matthew

3

No estoy seguro de a qué excepciones se refiere el manual cuando se trata de hacer que los datos sean seguros. Se podría decir que la excepción es cuando los datos ya se sabe que son seguros. Por ejemplo, aquí hay algunos casos que vienen a la mente:

  • los datos se escribe como un número (esto es realmente una especialización del siguiente punto)
  • que ya sabe que no contiene ningún carácter que necesita ser escapado (por ejemplo, se trata de buscar algo en una matriz de "lista blanca" que contiene algunas opciones que usted codificados)

Por ejemplo, si usted tiene $id = intval($_GET['id']) entonces no es necesario para escapar $id antes de inyectarlo en una consulta.

¡Sin embargo! Nunca le puede hacer daño escaparse entrada, y hacerlo elimina la posibilidad de que introduzca vulnerabilidades en su código (por ejemplo, si olvida escaparse, si los requisitos cambian, o algo realmente). Por lo tanto, recomiendo adquirir el hábito de escapar de todo y olvidarse de las "excepciones".

En cuanto a los % y _ personajes como parte de la entrada, éstos no necesitan ser escapado a menos que se va a alimentar a esta entrada a un comando que les reconoce. Así, por ejemplo, si tiene una consulta como esta:

$term = $_GET['term']; 
$sql = sprintf("SELECT FROM table WHERE column LIKE '%%s%'", 
       mysql_real_escape_string($term)); 

En este caso, si el usuario escribe una % como parte de $term que es razonable suponer que quieren buscar en realidad para un literal %. Por lo tanto, en tales casos, debe escapar % reemplazándolo por \% (\ es el carácter de escape predeterminado). str_replace o strtr son dos buenas opciones para esto.

+0

mysql_real_escape_string no tiene nada que ver con * safety *. Son asuntos completamente diferentes (ampliamente confundidos por gente de PHP, tengo que admitirlo). Como cuestión de hecho, escapar, pero simplemente una instalación de formato de cadena y nada más. Incluso los datos "seguros" pueden contener un salto de línea que debe ser reemplazado para la legibilidad de los registros. sin mencionar que al identificador inseguro no servirá para nada. –

+0

@YourCommonSense: envolver entre comillas + 'mysql_real_escape_string' = seguro. Tiene * todo * que ver con seguridad * indirectamente *, porque es un requisito previo para lo que proporciona seguridad * directamente * (citando). Gracias por el DV de todos modos. – Jon

+0

'¡Sin embargo! Nunca puede lastimarte escapar de todas las aportaciones, "felicidades, ¡acabas de inventar la función' comillas mágicas'! –

1

Puede write your own function;) Consulte this thread para obtener más información.

Si no, puede usar el PDO library o cualquier otra biblioteca de este tipo.

+0

primer enlace es para 'MSSQL' no' mysql' :-) – undone

+0

Sí, eso fue solo para dar una idea de cómo implementar la lógica para escribir una función manualmente para mysql. La misma lógica se puede implementar también para MySQL. – gopi1410