PDO - 连接 - 如何保护

Posted

技术标签:

【中文标题】PDO - 连接 - 如何保护【英文标题】:PDO - connection - how to protect 【发布时间】: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 注入吗?

【问题讨论】:

【参考方案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。管理员有一个表格来放置访问数据。适合他使用安装过程而不是编辑配置文件。

以上是关于PDO - 连接 - 如何保护的主要内容,如果未能解决你的问题,请参考以下文章

使用 PDO 准备参数化查询

如何使用 PDO 跨两个数据库运行连接查询

如何从 PDO 对象获取连接资源?

如何连接来自两个不同 PDO 对象的表?

如何正确设置 PDO 连接

如何在不同文件中使用 PDO 连接对象[重复]