代码之家  ›  专栏  ›  技术社区  ›  Codo

用于高度安全的web应用程序的工具和技术[关闭]

  •  6
  • Codo  · 技术社区  · 14 年前

    我们正计划构建一个需要高度安全的web应用程序,因为大量资金和声誉都面临风险。因此,我正在寻找有助于这一努力的工具和技术。这些工具和技术应该有助于防止SQL注入、跨站点脚本漏洞、远程代码执行等。

    我们的团队对这些漏洞有很好的了解。但是每个开发人员都会犯错,一个简单的错误不应该导致安全漏洞。web应用程序框架、应用服务器、编程语言、安全库、代码分析器等都需要对其进行防范或检测。

    如果将数据插入HTML,则需要对其进行转义,以便正确显示数据,而不是将其用于注入脚本。一些web应用程序框架给开发人员带来了这种负担。如果他们忘了在一个地方逃跑,他们就有安全问题了。一个好的工具不只是自动地进行转义,它甚至会阻止开发人员强制地进行转义。

    寻找关于防火墙(我们有一个很好的),强化操作系统(这是计划的一部分),使用加密通信(这将是唯一的选择)和安全认证(将使用硬件令牌)的建议。相反,建议应该围绕应用程序服务器和要构建的web应用程序软件。

    我应该提到,我们对Java和.NET有一定的偏见。

    那么,您可以向我们推荐哪些工具和技术或它们的组合呢?

    6 回复  |  直到 14 年前
        1
  •  13
  •   Community CDub    8 年前

    背景

    您提到的漏洞都源于数据与控件(或者代码,如果您愿意的话)的混淆。它们出现在实践中是因为许多编程语言和api没有配备对特定领域语言(如SQL、HTML和systemshell)的语义进行编码。例如,几乎所有XSS漏洞都是因为程序员打印出未经清理的字符串,而编程语言或API没有足够的信息来检测该字符串是用户提交的,并且应该对其控制字符进行转义。幸运的是,有一些语言扩展和api可以将数据和控件分开,并且可以消除几乎所有这些攻击。

    SQL注入

    • 准备好的陈述。 这个 JDBC prepared statement
    • 查询生成器。 不必将查询指定为字符串,您可以将其表示为一系列方法调用,这些方法调用以生成器模式的方式逐渐构建对象。您可能认为它是手动构建AST,然后将其序列化为查询字符串。有一个 paper 由罗伯逊和维格纳,说明了一些例子在哈斯克尔。
    • 林克。 这是特定于.NET的。查询实际上是语言的一部分,因此解析器可以区分查询关键字和数据。同样,这允许语言只安全地转义数据。由于我缺乏使用LINQ的经验,我不能说更多,但是大概数据值是用 SqlParameter
    • ORM框架。 在SQL注入之上,ORM框架旨在抽象掉DBMS的大部分细节,包括查询本身。他们可以在幕后使用准备好的语句,甚至公开一个准备好的语句,比如API,以便更直接地访问数据库(例如,Hibernate的 SQLQuery ).

    • 大多数流行的模板语言似乎都是针对PHP、Python或Ruby的。不过,也有一些 for Java for .NET . 模板通常由HTML和占位符组成。然后将数据传递到模板引擎,它将全部转义,然后呈现模板,并用经过清理的数据替换占位符。
    • DOM树生成器。 与SQL查询生成器类似,您可以使用类似DOM的API构造一个页面来创建新元素和文本节点,最后将它们序列化为HTML字符串。值得商榷的是,标准domapi对于这种方法来说太冗长了。
    • Scala does so does VB9 . Facebook有一个开源PHP扩展名为 XHP 这也提供了一些软件工程的好处,包括组件重用和能够为自定义标记指定内容模型。
    • 启发式和检测。 这并不是一种可靠的防火措施,但有些系统会检查HTML输出并猜测是否嵌入了恶意脚本。然而,正如人们在IE8中发现的那样,这可以 enable attacks
    • 仅HTTP Cookie。 这是 对XSS的防御,但它可以防止相当多的攻击。当服务器设置cookie时,它可以将其标记为 HTTP-only ,这意味着受支持的浏览器不允许页面上的JavaScript访问该cookie。因此,即使攻击者能够在你的网站上嵌入恶意脚本,只要他们有一个相当现代的浏览器(甚至IE6+counts!),他们也无法窃取你用户的cookies。

    system() -尽可能地喜欢打电话。如果必须调用其他二进制文件,请应用良好的安全实践,如在可能的情况下使用白名单,并在适当的情况下使用经过良好审查的清理功能。一些api,比如Python的 Popen ,很好地确保参数不被视为shell控件字符。最后,使用Java和C#,利用缓冲区溢出的可能性很小。这不是一个正式的保证,但数十亿美元的公司一直在运行Java服务器。

    最佳实践

    最后,您应该考虑使用为手头的任务设计的API或语言特性,无论是创建SQL查询还是构建HTML页面。这些语言和api不仅增加了您对安全性的信心,而且通常也有助于编程。与连接一堆字符串的旧式策略相比,我们现在拥有LINQ和XML文本,可以说它们使代码更易于编写、阅读和验证。我是一个语言增强和API的球迷,提高代码质量和程序员的生产力!

        2
  •  4
  •   driis    14 年前

    我最好的建议是要求对所有编写的代码进行结对编程或代码评审。作为一个开发人员,很容易错过一些东西或忘记一个安全措施——但是如果发生这种情况,应该在代码评审时进行评审,特别是当评审人员意识到安全性对于应用程序来说是至关重要的时。

    Google Skipfish . 它允许您对应用程序运行一套全面的测试,告诉您哪些地方可能需要注意。

        3
  •  1
  •   Akash Kava    14 年前

    标准产品存在风险

    例如,大多数攻击来自于开放源代码系统和标准产品,如果您使用的是WordPress,并且任何php脚本都可能导致sql注入攻击,那么您的网站当然很容易受到攻击。

    1. 目录浏览是关闭的,就像没有人可以爬网你的网页,除非你打算这样做
    2. 开放源代码或标准工具(如SQL Server、WordPress或任何此类第三方工具)不应在终端客户机上保持打开状态
    3. 实现DTO模式,即使用数据传输对象,考虑传输数据,但不考虑逻辑
    4. 使用令牌安全性而不是UI安全性,仅仅阻止用户的UI元素是永远不安全的

    最重要的是,您的业务逻辑(即使是最小的逻辑,如登录和注册)应该而且只应该在您控制的前提下执行。

    团队战争

    划分您的团队,并告诉团队攻击并击落或破解其他团队的代码,作为测试的一部分,始终记住,了解您的业务逻辑、访问位置的人比任何现有病毒或特洛伊木马或网络攻击者都更危险。

        4
  •  1
  •   Joeri Sebrechts    14 年前

    安全性是质量的一个方面,质量取决于您的过程,而不是您的工具(为过程服务)。

    具体来说,如果你想构建一个高度安全的web应用,你需要采用一个安全的开发过程,比如 OWASP ASVS Microsoft SDL

    这个 blog post

        5
  •  0
  •   Dead Programmer    14 年前

    最好与办公室以外的人一起测试你的web应用程序,比如google的可信测试人员,有专门的安全顾问。他们可能会测试出现成的想法,并提出了很多漏洞,有时建议你良好的实施。

        6
  •  0
  •   Parag Patel    10 年前

    http://www.websecurify.com/

    该工具可以检测各种安全漏洞。其中包括:

    • 跨站点脚本(XSS)
    • 系统路径泄漏漏洞
    • SQl注入
    • Cookies问题信息披露和
    • 许多流行的和鲜为人知的漏洞。