MySQL“;插入“;和SQL注入

MySQL“;插入“;和SQL注入,mysql,sql,security,sql-injection,Mysql,Sql,Security,Sql Injection,我有一个简单的mysql查询: INSERT INTO table (col1, col2) VALUES ('1', '2') col1和col2是另一个表的外键,因此col1和col2的任何值必须存在于另一个表中,否则该行将不会插入 在这种情况下仍然存在SQL注入的风险吗?如果我从PHP POST收到这些col值,我是否仍然需要在插入数据库之前绑定它们,或者它们已经是安全的,因为col是外键?是。所有来自用户的输入都需要进行消毒检查。例如,如果用户向您发送一个类似于'2')的字符串;将ta

我有一个简单的mysql查询:

INSERT INTO table (col1, col2) VALUES ('1', '2')
col1
col2
是另一个表的外键,因此
col1
col2
的任何值必须存在于另一个表中,否则该行将不会插入


在这种情况下仍然存在SQL注入的风险吗?如果我从PHP POST收到这些col值,我是否仍然需要在插入数据库之前绑定它们,或者它们已经是安全的,因为col是外键?

是。所有来自用户的输入都需要进行消毒检查。例如,如果用户向您发送一个类似于
'2')的字符串;将table
作为第二个值,它可能会被执行,并给您带来一些惊喜。(字符串可能无法准确工作,但我想你明白了)

它确实易于SQL注入,因为例如,用户可以中断您的查询,在错误消息中获取有关RDBMS和数据库架构的信息,并使用它准备对应用程序的另一次攻击


有很多方法可以探索SQL注入问题。

是的,即使有外键约束,也总是存在注入风险。如果我知道什么是有效的col1和col2值,我可以使用这些值来构造攻击。最好总是清除用户输入,并假设用户试图破坏您的数据库

在PHP中构造数据库查询时,请使用一个接口,该接口允许您为数据使用占位符,从而自动处理任何转义。例如,您的查询如下所示:

INSERT INTO table (col1, col2) VALUES (:col1, :col2)
然后,您可以在PDO之类的驱动程序中使用适当的方法来绑定它。如果您对用户数据使用占位符有严格的要求,那么发生SQL注入错误的可能性非常低


用户输入有多种方法,但您必须确保在所有用户数据上使用它们,没有例外。一个简单的错误就足以让你的网站大开方便之门。

我不认为你在寻找“理智”这个词。所有来自用户的输入都需要清理。愚蠢的语言。但至少它很接近;)更新的答案。只需使用适当的“准备”查询,许多“问题”就会消失。如果您总是使用带有“动态”参数的“准备好的”查询,那么您将是“安全的”。您必须“验证”所有输入,但如果“不常用的内容”进入数据库,则不会“有害”。首先,我并不担心“效率”。唯一可以接受的方法是,如果您知道输入不可能包含恶意代码。不幸的是,如果您依赖于最终用户的输入,甚至是现有的数据库值,就无法真正了解这一点。出于所有实际目的,请始终假设最终用户做得不好,并且不要相信他们的任何输入是干净的。请阅读以下内容:+1。这有多困难可能完全是另一个话题(如果外键是数字的,而不是GUID/UUID的,可能更容易实现),但是正确处理数据插入要容易得多。这取决于,如果这些键在某个地方公开,比如在下拉列表中,无论他们采用什么格式,这都很容易。但是,您是对的,如果密钥从未显示在服务器之外,那么破解ad GUID/UUID将非常困难。如果我不知道它们的键,但可以通过生成错误来获取约束上的表名,我可以执行“插入到表(col1,col2)值('1',(从中选择col2));删除表…”