我是否需要逃脱子查询?

时间:2011-11-14 12:59:11

标签: mysql code-injection

我有一个SQL查询,如下所示:

UPDATE User SET flag='Y' WHERE email=(SELECT email FROM Forum WHERE id='$id');

因为电子邮件地址可以包含单引号和一些特殊字符(s * a'{f`%$。= * +〜& ^#| g!/ hd @ [66.112 .45.34]和vy。“(),:;<> []”。VY。“vy \\ \ @ \”vy“.unal @ str.exe.com都是有效的电子邮件地址),我不是确定是否有必要单独执行子查询,转义输出,然后在主查询中使用它。

你的建议是什么?

ADD注意:$id是一个安全号码。

3 个答案:

答案 0 :(得分:1)

您不需要转义任何内容,因为有子查询,但当然您需要转义id值才能将其放入字符串中。

如果可能,您应该使用参数化查询,而不是将值连接到字符串中。然后你不必逃避任何事情。

答案 1 :(得分:1)

您不应该在子查询中转义任何内容。但是,无论查询是否将电子邮件最初插入数据库都需要转义该字段。当您添加或修改email字段时,应该取消转义。

答案 2 :(得分:1)

需要回答的信息是:“$ id来自哪里?”

如果可以在外部进行修改,则需要引用它。如果它是作为GET参数http://www.foo.com/foo.php?id=222传递的,则需要引用它(对于POST来说是相同的)。

通过一点引用,参数可以关闭子查询,并且可以执行每个查询,例如:例如,通过提供"'); DELETE * FROM User; --作为$id的值:

UPDATE User SET flag='Y' WHERE email=(SELECT email FROM Forum WHERE id=''); 
DELETE * FROM User; --');