【发布时间】:2013-09-17 18:07:45
【问题描述】:
我的一个客户使用动态 SQL 作为存储过程的一部分。他们不想改变这一点。我正在构建应该使用有风险的存储过程的 MVC 网站。因此,在实体框架中使用参数并不能解决问题。
当我使用旧的和好的 SQL 助手时,我检查了 ExecuteQuery 函数中的所有参数并试图找到有风险的关键字。但是现在,当我使用本机 .NET Entity Framework 5 时,我没有共享功能,我可以在那里检查。
对每个特定字段都使用验证器对我不利。是否有一个选项可以为执行 SP 的实体框架部分制作过度添加功能或任何其他想法如何解决该问题?
【问题讨论】:
-
我不了解 EF5,但总的来说没有快速修复。扫描列入黑名单的关键字几乎完全是在浪费时间——要么你会阻止人们可能使用的完全合法的词(例如
OR),要么你会错过各种各样的攻击。可能两者兼而有之。 -
检查存储过程代码,看看你有什么类型的注入。如果它只是注入字符串文字,那么禁止在所有形式的输入中使用撇号将是您的第一步。如果他们为整数注入不带引号的变量,请确保所有这些字段都是整数。如果它们是列名,请将输入锁定为已知良好的值。这是一种蹩脚的、不可扩展的、脆弱的开发方式,但如果你真的无法更改现有的损坏代码,那么这就是你所拥有的一切。 :-(
-
您可以做的另一件事是将所有输入中的撇号转义为替换([参数],“'”,“''”),然后进行sql注入攻击,单引号被转义,整个值被视为字符串并保持不变,而不做它打算做的事情。
-
我通常会避免对输入进行转义。当您在与需要转义的上下文不同的上下文中使用输入时,即使忽略从中获得的修改,它也不一定是无懈可击的。例如,如果一个字符串在
'->''转义后被替换、切片或(最常见的是隐式)截断,则可能会丢弃其中一个撇号,从而为同一查询中的另一个字段打开可能性进行注射。 -
您能否用一个关于如何在 SP 中构建动态 SQL 查询的示例来更新您的问题?
标签: sql asp.net-mvc entity-framework security entity-framework-5