如何在SQL准备语句中转义单引号和双引号?
我也有类似的用Perl如下所示的SQL语句:如何在SQL准备语句中转义单引号和双引号?
my $sql="abc..TableName '$a','$b' ";
的$一个是它可以包含任何东西,包括单引号,双引号,后台和前台斜线字符等自由文本
这些字符如何转义以使SQL语句有效?
谢谢。
您可以使用->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);
使用准备好的语句。用?替换变量。从DBI手册页中挑选一个示例:
$sql = 'SELECT * FROM people WHERE lastname = ?';
$sth = $dbh->prepare($sql);
$sth->execute($user_input_here);
将用户输入内插到您的SQL中需要安全漏洞。
我很抱歉不清楚。我正在调用存储过程。这个例子应该是这样的: my $ sql =“DBName..ProcName'$ a','$ b'”; – Sam 2010-01-05 01:38:19
如果使用查询参数占位符,则不必转义字符串的内容。
my $sql="DBName..ProcName ?, ?";
$sth = $dbh->prepare($sql);
$sth->execute($a, $b);
如果DBI使用真正的查询参数,它将参数值分别从SQL语句发送到RDBMS。这些值永远不会与SQL语句字符串结合使用,因此这些值从来没有机会导致SQL注入。
如果DBI通过将变量插入查询字符串来“模拟”预备语句,那么DBI应该处理正确的转义逻辑,因此您不必这样做。让专家(编写和测试DBI的人)担心如何去做。
如果你不想使用 - >报价(出于某种原因,该功能不会对我的版本DBI的运行),那么试试这个:
$query=~s/\"/\\\"/g;
我倾向于做同样的单引号和逗号也只是为了安全起见。
似乎为我工作得很好......!
'$ a'和'$ b'具有与'sort'功能相关的特殊含义。使用它们通常不是一个好主意。除了代码示例中的简短变量名称。 – daotoad 2010-01-05 03:27:16
除了[perl]标签,[停止SQL注入PHP的最佳方法] dup(http://stackoverflow.com/q/60174/90527)。唯一的实际区别在于代码示例。另外,dup [避免SQL注入攻击的最佳方法是什么?](http://stackoverflow.com/q/1973/)。 – outis 2012-04-27 22:36:31