我在这页上读到了关于二阶mysql注入的文章,pdo准备的语句是否足以阻止sql注入?。
它带来了许多关于 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;
我发现有两种不同的方法 set
这个 charset
在pdo中
$pdo = new PDO("mysql:host=" . DB_HOST . ";charset=utf8;......);
以及
$pdo->exec("set names utf8");
根据@ircmaxell,这个链接上的答案是pdo准备的语句足以防止sql注入吗?。第一种方法应该用来防止二阶sql注入。。。
但我有 never set
这个 charset
在我的代码中(如第一个代码所示),所以我有几个问题
对于我没有设置任何字符集的第一个代码,默认的字符集是什么,安全吗?
它是否与数据库的字符集有关,因为我的数据库字符集(排序规则)是 ut8_general_ci
(在phpmyadmin->操作中发现)?
是 utf8
用于二级注入的安全字符集,即 $pdo = new PDO("mysql:host=" . DB_HOST . ";charset=utf8;......);
对所有的mysql注入都做了吗?
1条答案
按热度按时间f5emj3cl1#
选择
character_set_client
是mysql用于客户端发送的查询和数据的字符集。mysql 5.5、5.6和5.7中的默认值是utf8,8.0中的默认值是utf8mb4。
它也可以在my.cnf options文件中全局更改,也可以通过set names语句在每个会话中更改。
最好在连接时显式设置选项,这样就不必假定它的默认值。
请回复您的意见:
恐怕您混淆了sql注入的两种不同情况。使用这些特定的五个字符集是有风险的,但与二阶sql注入无关。
字符集风险是由于某些多字节字符集造成的。通常插入反斜杠来转义文字引号字符。但在某些字符集中,反斜杠字节合并到前面的字节中,形成多字节字符。这使得这句话没有被取代。
二阶sql注入是完全不同的。它可以出现在任何字符集上。这是指攻击者通过合法手段(如填写表单)将数据添加到数据库中。插入数据不会出错。但是,它们插入的值包含的语法是为了利用一些后来的sql查询而设计的。
它依赖于开发人员相信已经安全地保存到数据库中的数据在某种程度上是“安全的”,可以在没有适当参数化的情况下使用。
二阶sql注入的一个例子是,一个人的姓是“o'reilly”,代码读取这个名字并在随后的查询中使用,这只是偶然的,而不是恶意的。
如果名称包含一个文字撇号,则会弄乱该示例中的第二个查询。