我有一个类似于Perl中所示的SQL语句:
my $sql="abc..TableName '$a','$b' ";
$ a是免费文本,可以包含单引号,双引号,反斜杠和斜杠字符等。
如何转义这些字符以使SQL语句有效?
感谢。
答案 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;
我倾向于用单引号和逗号做同样的事情,只是为了安全。
似乎对我有用......!