二阶 SQL 注入保护

信息安全 sql注入 mysql
2021-08-13 06:52:38

正常的 SQL 注入是没有问题的,因为我总是使用准备好的语句,但是如何保护自己免受二阶 SQL 注入呢?

2个回答

二阶 SQL 注入是有效负载已经存储在数据库中的注入(而不是说在 GET 参数中传递)。从这个意义上说,它有点类似于存储型 XSS(普通的“一阶”SQL 注入类似于反射型 XSS)。

它是如何工作的?假设您让用户选择任何用户名。因此攻击者可以选择名称'; DROP TABLE Users; --如果您天真地将此用户名连接到 SQL 查询中以检索有关该用户的信息,您就会遇到问题:

sql = "SELECT * FROM Users WHERE UserName = '" + $username + "'";

那么,您如何处理呢?

总是使用参数化的查询,总是,总是,总是。将所有变量视为不受信任的用户数据,即使它们来自数据库。假装一切都是 GET 参数,并通过将它们绑定为参数来实现相应的行为。

您还可以在将输入存储到数据库之前以及从数据库中检索之后对输入进行清理和限制(例如,仅允许使用字母数字用户名)。但我不会把它作为我唯一的防线,所以也要使用参数化查询。

这里没有什么“特别”的。所谓的“二阶”SQL 注入就是同一个 SQL 注入,只是内容来自数据库内部而不是用户直接输入的数据。相同的规则适用

  • 始终清理输入数据,无论它来自何处(用户、文件、数据库等)

  • 切勿使用字符串连接来构建可执行命令。使用准备好的语句等。

经验法则是永远不要相信任何输入数据,无论您认为它有多安全。您不能相信用户可能输入的内容,您需要假设即使是您自己的数据存储库(即您的数据库)也可能已以某种方式受到损害或已将“坏数据”嵌入其中。假设您在一个敌对的环境中运行,就像现实一样,编写您的代码。

顺便说一句,我看到 Oracle 的文档没有改进!这是关于 SQl 注入的一个非常糟糕的措辞和解释不清的宣传。