如何在SQL预处理语句中转义单引号和双引号?

时间:2010-01-05 01:28:17

标签: sql perl string sybase quotes

我有一个类似于Perl中所示的SQL语句:

my $sql="abc..TableName '$a','$b' ";

$ a是免费文本,可以包含单引号,双引号,反斜杠和斜杠字符等。

如何转义这些字符以使SQL语句有效?

感谢。

4 个答案:

答案 0 :(得分:21)

您可以使用->quote方法(假设您使用的是DBI):

my $oldValue = $dbh->quote('oldValue');
my $newValue = $dbh->quote('newValue');
$dbh->do("UPDATE myTable SET myValue=$newValue where myValue=$oldValue");

更好的是,最佳做法是使用绑定值:

my $sth = $dbh->prepare('UPDATE myTable SET myValue=? WHERE myValue=?');

$sth->execute('newValue','oldValue');

这也适用于存储过程调用,假设字符串扩展后的语句是有效的SQL。这可能是驱动程序/数据库特定的,因此YMMV。

my $sth = $dbh->prepare("DBName..ProcName ?,? ");
$sth->execute($a, $b);

答案 1 :(得分:9)

使用准备好的声明。用?替换变量。从DBI联机帮助页中获取示例:

$sql = 'SELECT * FROM people WHERE lastname = ?';
$sth = $dbh->prepare($sql);
$sth->execute($user_input_here);

将用户输入内插到SQL中是在寻找安全漏洞。

答案 2 :(得分:6)

如果使用查询参数占位符,则不必转义字符串的内容。

my $sql="DBName..ProcName ?, ?";
$sth = $dbh->prepare($sql);
$sth->execute($a, $b);

如果DBI使用的是真正的查询参数,它会将参数值与SQL语句分开发送到RDBMS。这些值永远不会与SQL语句字符串组合在一起,因此这些值永远不会有机会导致SQL注入。

如果DBI通过将变量插入到查询字符串中来“模拟”预处理语句,那么DBI应该处理正确的转义逻辑,因此您不必这样做。让专家(那些编写和测试DBI的人)担心如何去做。

答案 3 :(得分:3)

如果您不想使用 - >引用(出于某种原因,此功能无法在我的DBI版本上运行),请尝试以下操作:

$query=~s/\"/\\\"/g;

我倾向于用单引号和逗号做同样的事情,只是为了安全。

似乎对我有用......!