php - 通过来自转义数据库条目的输入的 SQL 注入(inject)可能吗?

标签 php mysql sql sql-injection

在开发 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->e​​scape 的作用。我的猜测是它只是简单地清理传入的变量,以便它们对输入是“安全的”?如果是这样,您仍然容易在第二个查询中受到 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/

相关文章:

javascript - 使用 javascript 从共享 iCloud 获取数据

php - PDO 不绑定(bind)变量

mysql - phpmyadmin - 获取 FK 有关删除和更新操作的信息

SQL 结果在同一列上排序两次

php - 如何访问另一个页面上另一个类中的mysqli连接?

php - 从 JOIN 查询获取输出的问题

mysql - 在 MySQL 中创建简单数据库

php - 在 MySQL 中更改文本的特定字符

sql - 在表中插入一行并将其范围标识存储在存储过程的变量中

php - SimpleXMLElement::addChild() 不工作