Pregunta

Puede usted por favor dame aconsejaría? Busqué preguntas, pero no encontré algo similar a la mía.

¿Cómo puedo hacer mis entradas del usuario escaparon de forma automática cuando se hayan destinado para su uso en consultas SQL? No me gusta en mi código llena con algo como

$var_x = $DB->Escape($_POST['var_x']);
$another_var = $DB->Escape($_POST['another_var']);
$some_string = $DB->Escape($_POST['some_string']);
...

Suponiendo que tengo la clase de base de datos con el método de escape que realiza mysql_real_escape_string

Pero no puedo fijar de escape de automóviles en la consulta SQL, así, ya que rompe las consultas de inserción:

function Exec($sql){
   $result = mysql_query($this->Escape($sql));
}

$q = $DB->Exec("SELECT * FROM table WHERE id = 'xxx'");

Los hace \ 'xxx \'. que es incorrecto.

La última cosa que quiero hacer es hacer declaraciones con parámetros, ya que hará que el sistema más complicado. Voy a considerar esta opción cuando nada más a la izquierda.

En pocas palabras -? Cómo hacer inteligente automático de escape que trabaja con toda consulta y se escapa sólo valores

¿Fue útil?

Solución

De hecho, la una y la única cosa en la que deberá tener en cuenta (no estamos hablando de proyectos de prueba aquí, obviamente) es el uso de instrucciones con parámetros. Esta es la única manera (cuando SYNAX SQL permite para ellos, por supuesto). Hecho correctamente, estos no hará que su sistema más complicado, pero hacerlo más robusto.

Otros consejos

En este momento, no se puede auto nada. Cuando está concatenación de cadenas, siempre tendrá carácter de escape de los problemas que hay; esto no es algo que se puede ‘resolver’ una vez y nunca tiene que pensar de nuevo.

Si lo hace:

$a= "a'b";
$query= "SELECT * FROM things WHERE name='$a'";

A continuación, la cadena de consulta contiene dos apóstrofes que son apóstrofes reales en los literales de cadena y apóstrofes que son delimitadores de cadenas:

SELECT * FROM things WHERE name='a'b'

Uno necesita ser escapado; el otro no debe. ¿Cómo puede saber cuál es cuál? No se puede, que la información se pierde para siempre. En su lugar, debe decir:

$query= "SELECT * FROM things WHERE name='".mysql_real_escape_string($a)."'";

(o cualquier otra función de escape es más adecuado para la base de datos que está utilizando.)

feo? Demonios si. Es por eso que utilizar consultas parametrizadas en su lugar. Esto se aleja de la concatenación de cadenas con todos sus problemas.

La concatenación de cadenas parece fácil. Las personas piensan que entienden cadenas clodging juntos. Pero, en realidad, no lo hacen.

Yo uso este método:

$db->set('name',$name);
$db->set('title',$title);
$db->insert('users');

A continuación, el método $db->set() escapa automáticamente el valor (es decir, el segundo argumento).

Con PHP 5, también se puede hacer esto:

$db->set('name',$name)->set('title',$title)->insert('users');
  

La última cosa que quiero hacer es hacer declaraciones con parámetros, ya que hará que el sistema más   Complicado. Voy a considerar esta opción cuando nada más a la izquierda.

Cuidado para explicar su afirmación de que parametrizar las consultas son "más complicado"? No concatenar datos externos en consultas - jamás - y es la cosa más sencilla del mundo para hacerlo, además de ser mucho más cercana a "prueba de balas" que cualquier técnica de escape es siempre probable que sea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top