【发布时间】:2018-10-06 03:54:03
【问题描述】:
这种说法很奇怪,但想不出更好的标题。
我知道在一定程度上,使用 LINQ/Entity/SqlParam/etc 有助于防止 SQL 注入。我的客户询问是否允许中级 DBA 人员从 Management Studio 运行 SQL 查询意外运行已作为值存储在 DB 中的恶意代码。
我不认为这会是一个问题,但后来我想到了一些更高级的查询,其中您有循环等,它可能会读取电子邮件字段的值,该值可能具有以下值:
--Let's say this value already is stored in the database
--since Linq/Entities/SqlParams prevented it from running in code
--but it obviously still stored it inside of the field.
x'; DROP TABLE members; --
...然后也许对它做一些可能导致它执行的事情。在给出答案之前,我想我最好问问周围的一些意见。
【问题讨论】:
-
可能会注入一个写得不好的存储过程,但这取决于特定的代码。
-
我也在想同样的事情。我只是讨厌给出这样的答案,“好吧,一切皆有可能。”。在这种情况下,我想我可以附上,“有可能……可能不会……但是执行不当的 SP 可能会导致这种情况发生……”
-
问题是,如果发生这种攻击,那是来自内部的攻击,来自管理层高度信任的人。另一方面,来自外部的 SQL 注入,例如通过恶意 AJAX 请求,是另一回事。在这种情况下,我们从一开始就不会信任这个人。
-
这不是“一切皆有可能”,这对于写得不好的 SP 来说是真正的可能性。然而,真正的问题是:为什么中级 DBA 甚至需要费心弄清楚如何运行恶意代码?他们可以直接在 Management Studio 中简单地运行恶意查询。那么这里有什么意义呢?你想把你家的钥匙给别人,但你不信任他们,你害怕他们会从窗户闯进来偷东西? :)
-
我明白了,所以这不是信任 DBA,而是信任数据库中的数据条目。再次,是的,这是一个真正的可能性,但这不是运行 SP 的 DBA 的错,而是编写 SP 的人的错。在编写 SP 时,您需要考虑类似于在应用程序代码中编写查询时的 SQL 注入。您永远不应该将字符串参数连接到内联 SQL 并执行它,您必须先清理它们。
标签: sql sql-server stored-procedures sql-injection