【问题标题】:Is it possible to perform an SQL Injection attack where the malicious SQL is stored in a database table?是否可以执行 SQL 注入攻击,其中恶意 SQL 存储在数据库表中?
【发布时间】:2014-05-10 00:10:10
【问题描述】:
我正在努力确保正确地防止 SQL 注入。
如果我有一个包含列 C1 的 MySQL 表 T1,并且存储在 C1 中的一行的值是一些 SQL,是否有任何可以存储的 SQL 可以在选择时执行?
如果它包含“SELECT * FROM T2”,那么选择 C1 只会返回那个 SQL 字符串,但我只是想知道是否有任何方法可以执行存储的 SQL?
我不想将来自用户的未经验证的数据存储在 db 表中,这样当我选择它时,期望它是 First Name 或类似的东西,它会执行一些恶意 SQL。
谢谢,
保罗
【问题讨论】:
标签:
mysql
security
sql-injection
【解决方案2】:
被选中时会执行吗?
不,如果您所做的只是选择内容,则不会。
只有在随后以不安全的方式将 SQL 复制到另一个字符串中并将该字符串作为查询执行时,才能执行该 SQL。
例如:
$sql1 = "SELECT name FROM users";
$name = $pdo->query($sql1)->fetchColumn();
// the following is unsafe:
$sql2 = "SELECT * FROM user_activity WHERE user_name = '$name'";
$stmt = $pdo->query($sql2);
这称为“二阶 SQL 注入”,并不少见。该修复与 SQL 查询中的任何其他动态值相同:使用查询参数。
$sql2 = "SELECT * FROM user_activity WHERE user_name = ?";
$stmt = $pdo->prepare($sql2);
$stmt->execute(array($name));