2010-09-15 14 views
54

Estoy usando PDO después de migrar fuera de la biblioteca mysql. ¿Qué uso en lugar de la antigua función real_escape_string?cadena de escape real y PDO

Necesito escapar de comillas simples, así que entrarán en mi base de datos y creo que puede haber una mejor manera de manejar esto sin agregar barras a todas mis cadenas. ¿Puede alguien decirme lo que debería estar usando?

+1

Un poco tarde a la fiesta, pero se puede usar PDO :: quote() si el método de preparación() no es una opción (por ejemplo, cuando tiene que construir su propio modelo) –

Respuesta

30

Debe utilizar PDO Prepare

Desde el enlace:

Calling PDO :: prepare() y PDOStatement :: execute() para los estados que serán emitidas varias veces con diferentes valores de los parámetros optimiza el el rendimiento de su aplicación al permitir que el controlador negocie el almacenamiento en caché del cliente y/o del lado del servidor del plan de consulta y metainformación, y ayuda a prevenir ataques de inyección SQL al eliminar la necesidad de cotizar manualmente los parámetros.

+0

Gracias SteD. Lo leí hace un tiempo, pero desde entonces escuché que la preparación de PDO NO evitará la inyección de SQL. No estoy seguro de qué creer más. ¿Estás seguro de que la preparación detendrá los ataques de inyección? – John

+1

@John, es la primera vez que escucho que alguien escuchó que la preparación de PDO NO evitará la inyección de SQL. ¿Estás seguro de que realmente escuchaste eso? ¿Es su fuente más confiable que la documentación oficial? Y tenga en cuenta que siempre hay otra manera, diferente de preguntarle a alguien: usted mismo puede investigar ... –

+4

PDO previene la inyección SQL. (No ayuda a prevenir xss vunerabilities, pero tampoco lo hace mysql_real_escape) – nos

4

Utilice las declaraciones preparadas. Esos mantienen los datos y la sintaxis separados, lo que elimina la necesidad de escapar de los datos de MySQL. Ver p. this tutorial.

+0

Piskvor, gracias. Ya los estoy usando, pero no en donde obtengo los errores. Me preguntaba si la preparación realmente detiene los ataques de inyección. He oído lo contrario y parece que hay un gran debate al respecto. – John

+1

@John: Sí, las declaraciones preparadas detendrán los ataques de inyección de SQL. (Por supuesto, las inyecciones de SQL son solo un posible vector de ataque, por lo que evitarlas no es un polvo mágico "poof-your-website-is-now-fully-secure") – Piskvor

+1

@John no hay un solo debate. En realidad, eres solo tú quien lo debate. –

23

DOP ofrece una alternativa diseñada para reemplazar mysql_escape_string() con el método PDO::quote().

Aquí es un extracto de la página web de PHP:

<?php 
    $conn = new PDO('sqlite:/home/lynn/music.sql3'); 

    /* Simple string */ 
    $string = 'Nice'; 
    print "Unquoted string: $string\n"; 
    print "Quoted string: " . $conn->quote($string) . "\n"; 
?> 

Lo anterior salida de código de voluntad:

Unquoted string: Nice 
Quoted string: 'Nice' 
+6

Actualmente estoy en el proceso de migrar código antiguo para usar PDO y, aunque la solución es buena, las personas deben ser conscientes del hecho de que colocará comillas alrededor de la cadena. Entonces, si las personas están desarrollando consultas que ya tienen citas como '" SELECT * FROM usuarios DONDE username = '". $ Conn-> quote ($ username)."' ";', Las consultas inevitablemente fallarán. – user3158900

+5

La respuesta aceptada podría ser la recomendada y la mejor práctica, pero esta respuesta es la respuesta correcta a la pregunta real. a veces realmente necesita la antigua función mysql_escape_string, por ejemplo, si está creando un archivo para ejecutarlo más tarde. no puedes hacer eso con una declaración preparada. –