Pergunta

Você pode por favor me dê aconselhar? Procurei perguntas, mas não encontrei algo semelhante ao meu.

Como posso fazer minhas entradas do usuário escapou automaticamente quando eles são destinados ao uso em consultas SQL? Eu não gosto no meu código preenchido com algo como

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

Supondo que eu tenho classe de banco de dados com o método de fuga que realiza mysql_real_escape_string

Mas eu não posso definir fuga auto na consulta SQL, bem como, porque quebra inserção consultas:

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

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

Fá-los \ 'xxx \'. o que é incorreto.

A última coisa que eu quero fazer é parametrizado declarações, uma vez que irá tornar o sistema mais complicado. Eu vou considerar esta opção quando nada mais vai para a esquerda.

Em suma - como para fazer inteligente auto-escape que trabalha com consulta inteira e escapa apenas valores

Foi útil?

Solução

Na verdade, o único e a única coisa que você nunca deve considerar (não estamos falando de projetos de teste aqui, obviamente) é usar declarações parametrizadas. Esta é a única maneira (quando synax SQL permite para eles, é claro). Feito corretamente, estes não irá tornar o sistema mais complicado, mas eles irá torná-lo mais robusto.

Outras dicas

Desculpe, você não pode auto nada. Quando você está concatenando cordas, você sempre terá caráter escapar problemas lá; isso não é algo que você pode ‘resolver’ uma vez e nunca tem que pensar novamente.

Se você fizer isso:

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

Em seguida, a cadeia de consulta contém apóstrofos que são apóstrofos reais em strings literais e apóstrofos que são delimitadores de strings:

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

Um precisa de ser escapado; o outro deve não. Como você pode dizer qual é qual? Você não pode, que a informação é perdida para sempre. em vez disso você deve dizer:

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

(ou qualquer outra função de escape é mais adequado para o banco de dados você está usando.)

Feio? Isso aí. É por isso que usar consultas parametrizadas em vez. Isso fica longe de concatenação com todos os seus problemas.

concatenação de String parece fácil. As pessoas pensam que eles entendem cordas clodging juntos. Mas, realmente, não.

Eu uso este método:

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

Aqui o método $db->set() escapa automaticamente o valor (isto é, o segundo argumento).

Com PHP 5, você também pode fazer isso:

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

última coisa que eu quero fazer é fazer declarações parametrizadas, como ele vai fazer sistema mais complicado. Eu vou considerar esta opção quando nada mais vai para a esquerda.

Cuidados para explicar sua afirmação de que consultas parametrizadas são "mais complicado"? Eu não faço dados externos concatenate em consultas - nunca - e é a coisa mais simples do mundo para fazer, bem como ser muito mais perto "à prova de balas" do que qualquer técnica de escapar é sempre susceptível de ser.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top