从 SQL Management Studio 触发的意外 SQL 注入
Accidental SQL Injection Triggered from SQL Management Studio
奇怪的命名方式,但想不出更好的命名方式。
我在一定程度上知道,使用 LINQ/Entity/SqlParam/etc 有助于防止 SQL 注入。我的客户询问是否存在 任何责任风险,允许 运行正在从 Management Studio 查询 SQL 的中级 DBA 人员不小心 运行已作为值存储在数据库中的恶意代码。
我认为这不是问题,但后来我想到了一些更高级的查询,其中有循环等,它可能会读取电子邮件字段的值,该字段可能具有以下值:
--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; --
...然后也许对它做一些可能导致它执行的事情。我想我最好在回答这个问题之前征求一些意见。
编写存储过程时,必须考虑 SQL 注入,这与在应用程序代码中编写查询时类似。您永远不应该将字符串参数连接到内联 SQL 并直接执行它,您必须先清理它们。
事实上,内联查询很糟糕,应尽可能避免,无论是在应用程序代码中还是在存储过程中。但是,有时我们确实需要在存储过程中使用它们,在这种情况下,您必须先清理所有参数或数据库值,然后再将它们连接到内联查询。如果你没有正确地做到这一点,那么就会有 SQL 注入这些存储过程的真正风险。
奇怪的命名方式,但想不出更好的命名方式。
我在一定程度上知道,使用 LINQ/Entity/SqlParam/etc 有助于防止 SQL 注入。我的客户询问是否存在 任何责任风险,允许 运行正在从 Management Studio 查询 SQL 的中级 DBA 人员不小心 运行已作为值存储在数据库中的恶意代码。
我认为这不是问题,但后来我想到了一些更高级的查询,其中有循环等,它可能会读取电子邮件字段的值,该字段可能具有以下值:
--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; --
...然后也许对它做一些可能导致它执行的事情。我想我最好在回答这个问题之前征求一些意见。
编写存储过程时,必须考虑 SQL 注入,这与在应用程序代码中编写查询时类似。您永远不应该将字符串参数连接到内联 SQL 并直接执行它,您必须先清理它们。
事实上,内联查询很糟糕,应尽可能避免,无论是在应用程序代码中还是在存储过程中。但是,有时我们确实需要在存储过程中使用它们,在这种情况下,您必须先清理所有参数或数据库值,然后再将它们连接到内联查询。如果你没有正确地做到这一点,那么就会有 SQL 注入这些存储过程的真正风险。