【问题标题】:Is there an equivalent of PHP's mysql_real_escape_string() for Perl's DBI?对于 Perl 的 DBI,是否有相当于 PHP 的 mysql_real_escape_string()?
【发布时间】:2011-01-13 12:57:23
【问题描述】:

能否告诉我是否有一个函数与来自DBI 模块的 Perl 的 PHP 的 mysql_real_escape_string() 相同?

【问题讨论】:

    标签: perl dbi mysql-real-escape-string


    【解决方案1】:

    数据库句柄方法“引用”

    my $dbh = DBI->connect( ... );
    $sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
              $dbh->quote("Don't");
    

    http://metacpan.org/pod/DBI#quote

    【讨论】:

      【解决方案2】:

      不要。逃脱。 SQL。

      不要。引用。 SQL。

      使用 SQL 占位符/参数 (?)。 SQL语句的结构和占位符表示的数据值是完全分开发送到数据库的,所以(除非数据库引擎或DBD模块有bug)数据值绝对不能解释为SQL命令。

      my $name = "Robert'); DROP TABLE Students; --";
      my $sth = $dbh->prepare('SELECT id, age FROM Students WHERE name = ?');
      $sth->execute($name);  # Finds Little Bobby Tables without harming the db
      

      另外一个好处是,如果您重复使用 SQL 语句(它只需要准备一次),使用占位符也会更有效,如果您不这样做(如果您不显式调用 prepare,在执行查询之前它仍然会被隐式调用)。

      【讨论】:

      • 占位符不能用于值是业务逻辑结果的IN ('a', 'b', 'c') 子句。在这里,我需要自己逃避这些价值观。能写会很棒:... where ID IN ?, ->execute(\@someIDs) 但那是不可能的......
      • @PeterV.Mørch 确实,您不能说 ID IN ?,但您可以'ID IN (' . join(',', ('?')x@someIDs) . ')' 以动态创建一个查询,其中包含正确数量的占位符数据。
      【解决方案3】:

      喜欢quote

      如果您担心 utf8,我还建议您阅读 DBD::MySQL 的文档。

      【讨论】:

        【解决方案4】:

        你应该使用placeholders and bind values

        【讨论】:

        • DBH->bind() 是直接等价的,但就像思南所说,不要那样做。正确使用占位符和绑定值。
        【解决方案5】:

        来自http://www.stonehenge.com/merlyn/UnixReview/col58.html

        使用 SQL::Abstract; ... 我的 $sqa = SQL::Abstract->new; 我的 ($owner, $account_type) = @_; # 来自输入 我的 ($sql, @bind) = $sqa->select('account_data', # 表 [qw(account_id balance)], # 字段 { account_owner => $所有者, account_type => $account_type }, # “在哪里” ); 我的 $sth = $dbh->prepare_cached($sql); # 如果可以的话,重用 SQL $sth->执行(@bind); # 为这个查询执行它

        【讨论】:

        • 这是 Randal Schwartz 的文章“避免 SQL 注入攻击”。不错。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-18
        • 1970-01-01
        • 2011-03-25
        • 2011-02-17
        • 1970-01-01
        相关资源
        最近更新 更多