在开发 PHP 应用程序时,我想到了这种情况:用户在表单中提交某种文本,在服务器端文本被转义并插入到数据库中。问题是:最后一个查询(使用来自数据库的值)中的 SQL 注入(inject)是否可能?
示例(我不认为我必须解释我的数据库类):
$db->query("INSERT INTO accounts SET test='".$db->escape($_POST["sometext"])."'");
好的,到目前为止我知道什么都不会发生,理论上我也可以用准备好的声明来做到这一点,没有什么区别。
有时以后需要在另一个脚本中使用列 test 的值,并且需要将该值插入其他地方。
因此该列被选中,随后被插入。
$db->query("SELECT test FROM accounts WHERE ... LIMIT 1");
$row = $db->fetchRow();
$db->query("INSERT INTO secoundtable SET test='".$row["test"]."'");
所以可以看到,最后一个Query中使用了数据库的值。我必须逃离这里吗?
最佳答案
这个问题的答案在很大程度上取决于函数 $db->escape 的作用。我的猜测是它只是简单地清理传入的变量,以便它们对输入是“安全的”?如果是这样,您仍然容易在第二个查询中受到 SQL 注入(inject)攻击,这仅仅是因为您信任用户数据。
通过运行脚本亲自测试一下:
//First query shouldn't cause you any issues (I'm assuming your function is safe).
$test = "'";
$db->query("INSERT INTO accounts SET test='" . $db->escape($test) . "'");
//Second query will cause you issues because you're taking the single quote from your
//table column and inserting it directly into the last query.
$db->query("SELECT test FROM accounts WHERE ... LIMIT 1");
$row = $db->fetchRow();
$db->query("INSERT INTO secoundtable SET test='".$row["test"]."'");
顺便说一下,如果您想要完全安全地防止 SQL 注入(inject),您应该考虑使用准备好的语句。 This topic here非常值得一读。
关于php - 通过来自转义数据库条目的输入的 SQL 注入(inject)可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16570244/