我正在努力确保正确防范SQL注入。
如果我有一个包含列C1的MySQL表T1,并且存储在C1中的行是一些SQL,那么是否存在可以存储的SQL,当它被选中时会被执行?
如果它包含“SELECT * FROM T2”,那么选择C1将只返回该SQL字符串,但我只是想知道是否存在可以执行SQL存储的任何方式?
我不希望在db表中存储来自用户的未经验证的数据,这样当我选择它时,期望它是First Name或类似的东西时,它会执行一些恶意SQL。
谢谢,
保
答案 0 :(得分:1)
会在选中后执行吗?
没有
答案 1 :(得分:1)
会在选中后执行吗?
不,如果你所做的只是选择内容。
如果您随后以不安全的方式将其复制到另一个字符串并将该字符串作为查询执行,则只能执行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));