Perl和参数化语句

Perl和参数化语句,perl,sql-injection,Perl,Sql Injection,我希望确认参数化语句没有正确执行。目前的代码如下: $ywant = "user supplied integer"; $select = "SELECT a.Authors, a.PublicationYear, a.Title, a.URL, a.ArticleID, f.Format ". "FROM tbl_ETI_Article a, tbl_ETI_Format f ". &qu

我希望确认参数化语句没有正确执行。目前的代码如下:

$ywant = "user supplied integer";
$select = "SELECT a.Authors, a.PublicationYear, a.Title, a.URL, a.ArticleID, f.Format ".
          "FROM   tbl_ETI_Article a, tbl_ETI_Format f  ".
          "WHERE  a.PublicationYear = '".$ywant."' ".
          "AND a.FID = f.FID ".
          "ORDER BY a.PublicationYear DESC, a.Title ASC";

$sth = $dbh->prepare( " $select " );
$sth->execute();
我知道select字符串中的$ywant变量应该替换为占位符“?”,然后用户提供的数据将作为参数放在execute语句中

我的问题是,上述措施是否仍能防止注射攻击,因为它仍在“准备中”

我的问题是,上述措施是否仍能防止注射攻击,因为它仍在“准备中”

没有


使用参数可以防止SQL注入。准备好的语句没有(除非它们允许使用参数)。

这是一个有风险的SQL,因为如果您不信任$ywant的源代码,$ywant可能包含恶意代码。因此,这样做要好得多:

$ywant = "user supplied integer";
$select = qq{SELECT a.Authors, a.PublicationYear, a.Title, a.URL, a.ArticleID, f.Format
FROM   tbl_ETI_Article a, tbl_ETI_Format f
WHERE  a.PublicationYear = ?
AND a.FID = f.FID
ORDER BY a.PublicationYear DESC, a.Title ASC};

$sth = $dbh->prepare($select);
$sth->execute($ywant);

并避免任何SQL注入潜在的问题。prepare语句本身无法保护您免受此类攻击

如果这是生产代码,那么除了SQL注入风险之外,还有一些问题。我认为它没有
use strict
,因为变量不是用
my
词汇声明的。当您将它传递给
prepare
时,无需在
$select
周围加引号。如果我在代码评审中得到了这段代码,我就不会把它传递出去。所有的语句都必须准备好,不管你是否显式调用这个方法。直截了当地说它并没有提供任何保护,所以非常感谢,我只是想得到确认,因为我认为它并没有提供任何保护。这是一个相当容易的解决办法。谢谢非常感谢,我将根据您的示例更改有问题的代码。或者,
$ywant
包含有效年份。但是简单地使用参数是如此的简单和安全。