【发布时间】:2019-02-07 06:09:54
【问题描述】:
我在这个页面Are PDO prepared statements sufficient to prevent SQL injection? 上阅读了关于二阶 MySQL 注入的信息。
它带来了很多关于charset 的问题,我不确定我的代码对于 MySQL 注入是否安全
在我的代码中,我在进行查询时从不使用字符集,
我只是这样做
$pdo = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASSWORD, [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_PERSISTENT => false]);
$stmt = $pdo->prepare("SELECT * FROM keywords WHERE keyword_name = ? || keyword_name = ?");
$stmt->execute(["hello","world"]);
rows = $stmt->fetchAll();
// show the data on webpage
$pdo = null;
我发现在 pdo 中 set 和 charset 有两种不同的方式
$pdo = new PDO("mysql:host=" . DB_HOST . ";charset=utf8;......);
和
$pdo->exec("set names utf8");
根据@ircmaxell 在此链接Are PDO prepared statements sufficient to prevent SQL injection? 上的回答。第一种方法应该用来防止二阶SQL注入...
但我的代码中有never set charset(如第一个代码所示),所以我有几个问题
- 对于我没有设置任何字符集的第一个代码,默认字符集是什么,它是否安全?
- 是否与数据库的字符集有关,因为我的数据库字符集(排序规则)是
ut8_general_ci(在phpmyadmin->操作中找到)? - 对于二阶注入,
utf8字符集是否安全,即$pdo = new PDO("mysql:host=" . DB_HOST . ";charset=utf8;......);已针对所有类型的 mysql 注入完成了工作?
【问题讨论】:
标签: php mysql pdo utf-8 sql-injection