我有这个简单的mysql查询:
INSERT INTO table (col1, col2) VALUES ('1', '2')
col1
和col2
是另一个表的外键,因此col1
和col2
的任何值都必须出现在另一个表中,否则该行将不会出现插入
在这种情况下是否还存在SQL注入的风险?如果我从PHP POST收到这些col值,在插入数据库之前是否还需要绑定它们,或者它们已经安全,因为cols是外键?
答案 0 :(得分:6)
是。用户的所有输入都需要检查是否已清理。例如。如果用户向您发送了一个类似'2'); drop table <table>
的字符串作为您的第二个值,它可能会被执行并给您一些惊喜。 (字符串可能不完全正常,但我认为你明白了这一点)
答案 1 :(得分:2)
它确实容易出现SQL注入,因为用户可能会在错误消息中破坏您的查询并获取有关您的RDBMS和数据库架构的信息,并使用它来准备对您的应用程序的其他攻击
有很多方法可以探索SQL注入问题。
答案 2 :(得分:2)
是的,即使有外键限制,也始终存在注射风险。如果我知道什么是有效的col1和col2值,我可以使用这些值来构造攻击。最好始终清理用户输入并假设用户试图伤害您的数据库。
答案 3 :(得分:1)
在PHP中构建数据库查询时,请使用一个接口,该接口允许您使用占位符来处理自动处理任何转义的数据。例如,您的查询将如下所示:
INSERT INTO table (col1, col2) VALUES (:col1, :col2)
然后你可以在像PDO这样的驱动程序中使用适当的方法绑定它。如果您对使用占位符来管理用户数据一直很严格,那么发生SQL注入错误的可能性非常低。
properly escape用户输入有多种方式,但您必须确保在所有用户数据上使用它们,没有例外。一个错误就足以破坏你的网站。