1

你能给我建议吗?我搜索了问题,但没有找到与我相似的问题。

当我打算在 SQL 查询中使用我的用户输入时,如何使它们自动转义?我不喜欢在我的代码中充满类似的东西

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

假设我有执行 mysql_real_escape_string 的 Escape 方法的数据库类

但我也不能在 SQL 查询上设置自动转义,因为它会破坏插入查询:

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

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

它使他们成为\'xxx\'。这是不正确的。

我想做的最后一件事是制作参数化语句,因为它会使系统更加复杂。当没有其他东西时,我会考虑这个选项。

简而言之 - 如何制作适用于整个查询并仅转义值的智能自动转义?

4

4 回答 4

4

事实上,您应该考虑的一件事也是唯一一件事(我们这里显然不是在谈论测试项目)是使用参数化语句。这是唯一的方法(当然,当 SQL 语法允许它们时)。如果做得好,这些不会使您的系统更复杂,但它们使其更健壮。

于 2009-04-08T10:20:38.967 回答
2

对不起,你不能自动任何东西。当你连接字符串时,你总是会遇到字符转义问题;这不是您可以“解决”一次就不必再考虑的事情。

如果你这样做:

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

然后,您的查询字符串包含作为字符串文字中真正撇号的撇号和作为字符串定界符的撇号:

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

一个人需要逃脱;另一个不能。你怎么知道哪个是哪个?您不能,该信息将永远丢失。你必须改为说:

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

(或任何其他转义函数更适合您正在使用的数据库。)

丑陋?地狱是的。这就是我们使用参数化查询的原因。这摆脱了字符串连接的所有麻烦。

字符串连接看起来很简单。人们认为他们理解将字符串连接在一起。但实际上,他们没有。

于 2009-04-08T10:38:46.067 回答
1

我使用这种方法:

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

这里$db->set()方法自动转义值(即第二个参数)。

使用 PHP 5,您还可以这样做:

$db->set('name',$name)->set('title',$title)->insert('users');
于 2009-04-08T10:22:56.947 回答
0

我想做的最后一件事是制作参数化语句,因为它会使系统更加复杂。当没有其他东西时,我会考虑这个选项。

想解释一下您关于参数化查询“更复杂”的说法吗?我不会将外部数据连接到查询中——从来没有——这是世界上最简单的事情,并且比任何转义技术都更接近“防弹”。

于 2009-04-08T10:54:29.213 回答