我正在设计高安全性应用程序(涉及财务信息,个人信息等)。我需要确定将实施哪些安全措施(应用程序级别)。该应用程序将涉及向数据库发送数据,用户登录,导入导出到csv,txt文件和打印功能。
我需要为此类应用程序考虑哪些安全功能。 (初学者的SQL注入)?
另外,如果我想确保合法用户在页面之间移动,我是否必须检查每个页面if (UserLogin.IsValid)
等?这可能需要一些我猜的服务器点击次数。
答案 0 :(得分:8)
首先要做的是构建威胁模型。只有在您理解后:
考虑一下多管齐下的解决方案,一旦有了资源,漏洞,动机和威胁列表,就会变得明显。我可以:
请注意,一个好的解决方案深度防御。不要只是停在那里。寻找更多漏洞。寻找更多使攻击者失去动力的方法。寻找更多降低成功攻击成本的方法。但所有这一切都取决于拥有一个准确的威胁模型,所以首先要这样做。
以下是一些可以帮助您入门的资源:
http://www.microsoft.com/security/sdl/getstarted/threatmodeling.aspx
答案 1 :(得分:4)
引用https://stackoverflow.com/questions/72394的链接是一个好的开始。但是,您需要更进一步。
具体来说,加密所有级别的所有数据。在途中通过ssl(我说最小4KB密钥长度)。静止时通过加密文件系统和加密数据库。例如,MS SQL Server允许您加密整个数据库,而不仅仅是密码。
不要使用内联sql,坚持使用存储过程。如果你正确地逃避了事情,我不在乎。内联sql意味着您在某处打开密码(通常在配置文件中),允许应用程序执行它想要的任何 sql调用。如果您的网络应用程序被破解,他们将拥有完全访问权限。
通过将您的网站限制为仅执行存储过程将增加进行质量选择/删除/任何操作的难度。此外,您可以在执行任何操作之前首先检查作为参数传入的凭据,从而在s'procs本身旁边强制执行安全模型。这让数据库保护自己,暗示你甚至不相信自己的网络服务器。
确保您的服务器受到物理保护。我看到盒子变黑了,当有人检查时,他们发现了服务器所在的空白点。通过视频监控安全访问将有所帮助。
另外,记录一切。谁访问了什么,在登录尝试时使用了什么ip等等。当客户端调用并询问“记录X时发生了什么?”时,这很好。我说“根据日志,比尔史密斯在4月3日从他家中删除了它。”
接下来,研究入侵检测系统。它们监视流入的流量,根据流量类型对其进行解析,并且通常可以在有趣的事情发生时提醒您,例如对sql server的登录尝试失败。
测试重放攻击,也称为会话劫持。在每个帖子上确认的cookie值中加入一个标记。确认后,将令牌更改为不可猜测的值。重复直到用户注销。每当你看到不匹配的令牌时,让应用程序大声尖叫。
确保服务器到服务器的通信也是加密的。如果在Windows上,这意味着设置好的域策略,在线路上强制执行kerberos加密。我曾经去过几个地方,在那里我提出了一个能够并且能够轻松嗅探从数据库和电子邮件密码到实际的sql事务和响应的所有内容。沿着这些方向,确保正确配置所涉及的所有路由器。作为旁注,向首席执行官展示他在审计15分钟后的电子邮件密码是证明需要进行安全审计的一种方式。
最后,当您完成并准备部署外部和信誉良好的公司(如IBM)进行全面的安全审核,包括PEN(渗透)测试。我现在没有,也没有为IBM工作过。但是,我看到他们编写的一些报告。他们是彻底的。
答案 2 :(得分:2)
很少有初步想法:
我的安全链接建议您阅读:
答案 3 :(得分:1)
您提到了SQL注入攻击。避免SQL注入攻击的最可靠的方法是通过存储过程对应用程序中的数据库进行任何和所有调用,并且只通过参数调用这些过程。确保您的存储过程不在任何地方使用动态SQL,因为这也打开了SQL注入的大门。同样可以肯定LINQ to SQL还提供了抵御攻击的安全性。
编辑:当我谈到动态SQL时,我的意思并不在你的源代码中,因为这会隐含地违反我的LINQ建议。我的意思是不要在你的存储过程中构造一个SQL语句并动态执行它,因为即使过程本身的参数被清除,这也会为注入攻击留下空间。
答案 4 :(得分:0)
您必须测试所有内容。第一步是在软件开发中使用vulnerability scanner。您应该在开发期间定期运行扫描,这将在出现问题时识别问题,并且您可以让开发人员对缺陷负责,希望他们不会再次编写。
问题总会在裂缝中滑落。确保您的渗透测试人员更高。我可以告诉你,作为该领域的钢笔测试员,这是阻止你的系统在现实世界中拥有的最有效手段。