如何在SQL准备语句中转义单引号和双引号?

如何在SQL准备语句中转义单引号和双引号?

问题描述:

我也有类似的用Perl如下所示的SQL语句:如何在SQL准备语句中转义单引号和双引号?

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

的$一个是它可以包含任何东西,包括单引号,双引号,后台和前台斜线字符等自由文本

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

谢谢。

+3

'$ a'和'$ b'具有与'sort'功能相关的特殊含义。使用它们通常不是一个好主意。除了代码示例中的简短变量名称。 – daotoad 2010-01-05 03:27:16

+0

除了[perl]标签,[停止SQL注入PHP的最佳方法] dup(http://stackoverflow.com/q/60174/90527)。唯一的实际区别在于代码示例。另外,dup [避免SQL注入攻击的最佳方法是什么?](http://stackoverflow.com/q/1973/)。 – outis 2012-04-27 22:36:31

您可以使用->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); 
+0

我很抱歉不清楚。我正在调用存储过程。这个例子应该如下所示:my $ sql =“DBName..ProcName'$ a','$ b'”; – Sam 2010-01-05 01:39:36

+5

使用绑定参数仍然适用于存储过程调用。 – mopoke 2010-01-05 01:40:25

+0

如果不是很明显,如果您一直使用绑定参数,并且在执行插入操作之前已经手动转义了您的值的单引号,那么列值将以每个单引号的两个连续单引号结尾。 – RTF 2015-09-21 13:29:27

使用准备好的语句。用?替换变量。从DBI手册页中挑选一个示例:

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

将用户输入内插到您的SQL中需要安全漏洞。

+0

我很抱歉不清楚。我正在调用存储过程。这个例子应该是这样的: 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; 

我倾向于做同样的单引号和逗号也只是为了安全起见。

似乎为我工作得很好......!