0

$_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 注入吗?

4

2 回答 2

1

在任何情况下,连接凭据都不应来自用户。
您必须将它们存储在您的服务器中的某个配置文件中。然后与连接字符串一起使用。
请注意,字符集应该在 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);
于 2013-02-05T12:21:30.230 回答
0

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

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

$db_host = filter_var($db_host,FILTER_SANITIZE_FULL_SPECIAL_CHARS);

相当于调用 htmlspecialchars() 并设置了 ENT_QUOTES。可以通过设置 FILTER_FLAG_NO_ENCODE_QUOTES 来禁用编码引号。与 htmlspecialchars() 一样,此过滤器知道 default_charset,如果检测到构成当前字符集中无效字符的字节序列,则整个字符串将被拒绝,从而导致长度为 0 的字符串。 http://www.php.net/manual/en/filter.filters.sanitize.php

于 2013-02-05T23:05:31.857 回答