【问题标题】:PDO - connection - how to protectPDO - 连接 - 如何保护
【发布时间】:2013-01-20 08:28:15
【问题描述】:

$_pdo = new Data('mysql:host='.$db_host.';dbname='.$db_name.';port='.$db_port, $db_user, $db_pass, array(PDO::MYSQL_ATTR_INIT_COMMAND = > 'SET NAMES '.$charset));

变量来自形式。 如果我不剥离这些变量,用户可以进行 sql 注入吗?

【问题讨论】:

    标签: sql pdo sql-injection


    【解决方案1】:

    如果您接受来自表单的输入来创建连接,我可能会在使用之前使用一些清理功能对其进行清理。如果将其存储在文本文件或数据库中,最好在保存之前以及在使用之前进行清理。

    http://php.net/manual/en/function.filter-var.php

    $db_host = filter_var($db_host,FILTER_SANITIZE_FULL_SPECIAL_CHARS);
    

    相当于调用带有 ENT_QUOTES 集的 htmlspecialchars()。编码 可以通过设置 FILTER_FLAG_NO_ENCODE_QUOTES 禁用引号。喜欢 htmlspecialchars(),这个过滤器知道 default_charset,如果 检测到构成无效字符的字节序列 当前字符集然后整个字符串被拒绝导致 在长度为 0 的字符串中。 http://www.php.net/manual/en/filter.filters.sanitize.php

    【讨论】:

      【解决方案2】:

      在任何情况下,连接凭据不应来自用户。
      您必须将它们存储在您的服务器中的某个配置文件中。然后与连接字符串一起使用。
      请注意,charset 应该在 DSN 中设置,而不是选项。

      include 'settings.php';
      $dsn = "mysql:host=$db_host;dbname=$db_name;port=$db_port;charset=$charset";
      $pdo = new Data($dsn, $db_user, $db_pass);
      

      【讨论】:

      • 但它是一个 CMS。管理员有一个表格来放置访问数据。适合他使用安装过程而不是编辑配置文件。
      猜你喜欢
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 2013-08-30
      • 2013-12-17
      • 1970-01-01
      相关资源
      最近更新 更多