从SQL Management Studio触发的意外SQL注入

从SQL Management Studio触发的意外SQL注入,sql,sql-server,stored-procedures,sql-injection,Sql,Sql Server,Stored Procedures,Sql Injection,奇怪的说法,但是想不出更好的方法来命名这个 我知道在某种程度上,使用LINQ/Entity/SqlParam/etc有助于防止SQL注入。我的客户询问,允许从Management Studio运行SQL查询的中级DBA人员意外运行已作为值存储在数据库中的恶意代码,是否存在责任风险 我不认为这会是一个问题,但后来我想到了一些更高级的查询,其中有循环等,它可以读取电子邮件字段的值,该字段可能具有以下值: --Let's say this value already is stored in the

奇怪的说法,但是想不出更好的方法来命名这个

我知道在某种程度上,使用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注入的真正风险。

在编写存储过程时,您必须考虑SQL注入,就像在应用程序代码中编写查询一样。您永远不应该将字符串参数连接到内联SQL并执行它,您必须首先对它们进行清理


事实上,内联查询是不好的,无论是在应用程序的代码中还是在存储过程中,都应该尽可能避免内联查询。然而,有时我们确实需要在存储过程中使用它们,在这种情况下,您必须在将任何参数或数据库值连接到内联查询之前对其进行清理。如果您没有正确地执行此操作,那么这些存储过程将存在SQL注入的真正风险。

可能会注入编写不好的存储过程,但这取决于特定的代码。我也在想同样的事情。我只是讨厌回答“什么都有可能”。在这种情况下,我想我可以附加一句话:“很可能……可能不是……但执行不好的SP可能会导致这种情况发生……”问题是,如果发生这种攻击,那就是来自内部的攻击,来自管理层高度信任的人。另一方面,来自外部的SQL注入(例如通过恶意AJAX请求)是另一回事。在这种情况下,我们从一开始就不信任此人。这不是“任何事情都有可能”,对于编写糟糕的SP来说,这是一种真正的可能性。然而,真正的问题是:为什么中层DBA甚至需要费心弄清楚如何运行恶意代码?他们可以直接在ManagementStudio中运行恶意查询。那么这里的重点是什么?你想把你房子的钥匙给别人,但你不信任他们,你害怕他们会从窗户闯进来偷东西?:)我明白了,所以这不是关于信任DBA,而是数据库中的数据项。同样,这是一种真正的可能性,但这不是运行SP的DBA的错,而是编写SP的人的错。在编写SP时,您需要考虑类似于在应用程序代码中编写查询时的SQL注入。您永远不应该将字符串参数连接到内联SQL并直接执行它,您必须首先对它们进行清理。可能会注入编写不好的存储过程,但这取决于特定的代码。我也这么认为。我只是讨厌回答“什么都有可能”。在这种情况下,我想我可以附加一句话:“很可能……可能不是……但执行不好的SP可能会导致这种情况发生……”问题是,如果发生这种攻击,那就是来自内部的攻击,来自管理层高度信任的人。另一方面,来自外部的SQL注入(例如通过恶意AJAX请求)是另一回事。在这种情况下,我们从一开始就不信任此人。这不是“任何事情都有可能”,对于编写糟糕的SP来说,这是一种真正的可能性。然而,真正的问题是:为什么中层DBA甚至需要费心弄清楚如何运行恶意代码?他们可以直接在ManagementStudio中运行恶意查询。那么这里的重点是什么?你想把你房子的钥匙给别人,但你不信任他们,你害怕他们会从窗户闯进来偷东西?:)我明白了,所以这不是关于信任DBA,而是数据库中的数据项。同样,这是一种真正的可能性,但这不是运行SP的DBA的错,而是编写SP的人的错。在编写SP时,您需要考虑类似于在应用程序代码中编写查询时的SQL注入。您永远不应该将字符串参数连接到内联SQL并执行它,您必须首先清理它们。清理参数几乎总是一件坏事。使用参数化查询代替,并将“卫生处理”视为不接受参数(例如DDL)的查询的最后手段。@ AljaDrRo我完全同意,但是如果您仔细阅读我的答案,我在讨论存储过程中的一个内联字符串查询。遗憾的是,您不能在那里使用参数化查询。这就是为什么我说尽可能避免它(这类似于你说的“作为最后手段”),但我需要在存储过程中使用内联字符串查询,你必须清理查询中使用的参数和数据库值,这是没有办法的。有系统存储过程
sp_executesql