我来到一家已经有一个完全成熟的项目的公司...但是在我之前在这里工作的程序员没有遵循约定,也没有使用参数化的SQL查询……因此,在一个非常庞大的项目中,有超过1000个地方可能容易受到SQL注入的攻击……
我需要找到一个解决方案,它将自动检测代码中是否有SQL注入。例如,有一个表单允许用户输入关于产品的评论,这些评论将在提交时发送到数据库...我们如何确保用户没有输入有害的查询,而不是正常的文本?
有没有什么高级代码/正则表达式/魔术可以检测这个文本是否包含一段SQL查询,而不是普通的无害文本?我会接受任何链接,任何语言的代码片段,甚至商业软件,将为我做这件事。
谢谢
发布于 2010-09-22 14:32:33
这里没有银弹。SQL注入可能有许多模糊的形式,并试图在防火墙中使用正则表达式或其他形式来检测它们,或者应用程序可以保护您免受最简单形式的SQL注入,但经验丰富的黑客会简单地通过。正如AdaTheDev已经注意到的,检查您的代码的自动化工具,例如MS代码分析工具,可能会给您一个良好的开端,但也没有什么灵丹妙药。您将需要检查整个应用程序。
当这是大量的工作时,你应该制定一个计划。首先,制定一个指南,说明如何减轻这些类型的攻击。也要试着把你的应用程序分成不同的部分,从非常关键到次要。这样,您可以更好地估计修复bug的成本,并让管理层决定可能的成本以及他们愿意承担的风险。未经身份验证的用户可以访问的应用程序部分最为关键。如果每个人(在世界上)都可以在您的应用程序中创建帐户,那么这些用户可以访问的所有功能都非常关键。人口越少,你越信任这些用户,风险就越小。您也许可以在以后修复这些部分。但永远不要低估一个优秀的黑客。他/她可能会危害具有高权限的用户的帐户,并使用该帐户开始测试SQL注入的可能性。
总是试着有一个纵深的防御策略,有多层(或许多层)的防御。例如,千万不要在应用程序中以SA的身份与数据库连接。创建一个仅具有所需权限的帐户,甚至可以创建多个SQL帐户,每个角色(或一组角色)一个帐户。虽然限制数据库的特权在降低风险方面有很大帮助,但同样,不要把它当作单一的防御层。例如,This article解释了黑客如何在能够进行SQL注入时滥用较低权限的帐户。
你在这里问这个问题是令人钦佩的,因为我在过去见过许多不想知道的开发人员,这是非常可怕的,因为企业通常信任它的开发人员(这也很可怕)。
祝你好运。
发布于 2010-09-22 04:25:08
为了真正做到这一点,你只需要分割应用程序,一次浏览一个模块/页面/类/任何东西。
这将使您不仅可以修复问题,还可以在总体上更加熟悉代码库。
更新
根据我的评论,我想再添加一件事:
工具唯一能做的就是说,看,这是一些未经清理的输入……最有可能的是,你的应用程序中的每一个查询。这意味着您将有大约3000个需要修复的文件的列表。
在这一点上,您唯一能做的就是指定一天,比如星期五,作为Fix Sql day。划分工作,然后让每个人花一天(甚至几个小时)在几页上重写查询。
在某种程度上,你要么完成,要么发现足够多的其他错误,以确定重新开始是否是一个好主意。
发布于 2010-09-22 04:26:47
你可以给MS Code Analysis Tool一个旋转(引用):
CAT.NET是一种二进制代码分析工具,可帮助识别某些常见漏洞的常见变体,这些漏洞可能会导致常见的攻击载体,如跨站点脚本(XSS)、SQL注入和XPath注入。
我自己从来没有用过它,但可能值得一试。
https://stackoverflow.com/questions/3764105
复制相似问题