我正在收紧我的网络应用程序,现在我正在使用SQL。我已经有sql参数,加倍撇号,剥离javascript和编码html。除了上面的内容之外,还有其他我需要担心的事情吗?
答案 0 :(得分:7)
如果您使用参数化查询,那么您不需要执行您在帖子中描述的任何内容。 This article似乎是关于这个主题的非常好的讨论。
重申重点,防止SQL注入攻击的银弹是仅通过参数化查询将用户输入传递给sql。
答案 1 :(得分:4)
仅当您使用来自用户的数据动态生成查询时,才需要参数化查询。
在像oracle这样的东西上使用这些查询会有好处,这也很有用。
您可以做的其他事情是确保连接到数据库的用户拥有所需的最少权限。
您可以在此处查看有关防止SQL注入的一些建议: http://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
根据您的偏执,您可以使用存储过程来进行访问,但如果您需要进行动态查询,则会更加困难。
对于select,您可以使用视图,除非您在视图上有触发器,否则无法使用该查询来更改数据库中的任何数据。
可以使用的另一个页面是: http://www.wwwcoder.com/Directory/tabid/68/type/art/site/2966/parentid/258/Default.aspx
但是,提供更多的安全性是没有意义的,所以你应该权衡你正在保护的东西以及要走多远。
例如,加密某些列是否值得?这会导致更多关于如何保护密钥的问题,但是,如果您担心有人入侵您的计算机并获取可能需要考虑的数据库文件。
答案 2 :(得分:3)
从技术上讲,Javascript和HTML与SQL注入攻击无关,但它们是注入攻击。
我不同意剥离,至少在没有通知用户您已经这样做的情况下。例如,实际输入实际上可能是有效的,删除某些字符实际上可能会改变输入的语义,并且通常无法确定存储时是否可以在每个介质上呈现该值。那么URL,LDAP,XML或文件路径注入攻击呢。
你会发现很多安全“牧师”(我说的是鹦鹉)认为SQL注入最好通过剥离可能导致输入数据损坏的字符来保护。只要您不接受O'Brian作为exmaple的有效输入,那就好了直到罚款。如果他们宣传正确的编码会更好,因为所有这些努力可能已用于解决一大堆注入攻击。
实际上,我曾经不得不处理由MS安全专家编写的代码,这些专家写了类似的东西:
userInput = userInput.Replace(“ - ”,“”)。Replace(“'”,“”);
为了公平对待他,他是一个非常聪明的家伙,我相信他今天不会写这个,但是你能看到“MyName -'- SELECT * FROM User”是如何实际绕过这种保护的吗? / p>
如果您不阻止有效值,那么您可以接受一系列字符以及其他您不会接受的字符。 <也是一个有效的数学运算符,或者用户可能需要输入示例HTML代码。值的上下文决定了什么是有效的,什么不是有效的。
然后,如果您获得包含不允许的字符的值,则向用户显示错误,告诉他们有关无效值的信息,并要求他们在重新发送之前修复它。这可以在以后节省很多麻烦,这与数据验证同样重要,并确保您的程序功能与安全性相关。是的,您需要在客户端检查这一点以保持流量下降,并在服务器端防止攻击。
然后每当你渲染时,值都会适当地编码。参数化查询适用于解决SQL注入问题,但它们不适用于呈现HTML,URL和javascript。正确的SQL值编码(例如你提到双引号)同样安全,在某些情况下更可取(假设你有合理的DBA,他们不坚持所有东西都必须是存储过程并允许正确编码的动态SQL)。
另一点,System.Web HTML和URL编码功能有一些缺陷。有一个Microsoft团队生成了Anti Cross Site Scripting库来解决这些问题,并提供了更具体的编码选项。我认为它叫做Anti-XSS之类的东西。绝对值得一看。我想知道它是否已纳入.Net 4?
答案 3 :(得分:2)
我建议您下载自动Microsoft Source Code Analyzer for SQL Injection并让它首先分析您的代码,您可能会收获一些廉价的低成果。
答案 4 :(得分:1)
确保所有输入都包含在引号中。如果你有......接受= 1或年龄= 30 ......你可能会有一个安全漏洞:...接受= 1; DELETE ....
编辑:是的,攻击者可以使用1“;删除,但这不适用于转义输入。
答案 5 :(得分:0)
cyberpunk可以通过串联从uri查询中获取perl shell。 3个解决方案是使用存储过程,preparedstatements或gql代替。
答案 6 :(得分:0)
参数化查询在保持坏人方面有很长的路要走,但要确保他们背后没有奇怪的,可注入的动态sql混合物来打开新的漏洞。
其他,疯狂的边缘想法:不要运行流行的开源软件包,特别是那些用P语言编写的软件包。