我有一个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
是一个安全号码。
答案 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; --');