为网站添加额外的安全性

时间:2015-03-12 14:12:46

标签: java spring security spring-security hybris

我正在运行基于Java Spring MVC的Web应用程序。它也基于Hybris平台。

现在,已经实现了身份验证和授权方面的基本功能。这意味着我们有会话过滤器,工作用户系统等

但是,我们目前没有针对诸如XSS和其他可能的攻击等内容的安全措施。 XSS可能是最大的担忧,因为它是最常见的攻击方式。

现在,我想知道......采取哪些步骤是明智的? 我看了一下,我看到像XSS-Filter这样的东西存在。 实现这样做非常简单,只需复制一下源代码并将其添加为tomcats web.xml。

但是我想知道这样过滤器的安全性是否令人满意?

还有更臃肿的解决方案,例如我可以使用spring-security。 然而,阅读文档,我觉得这是非常臃肿,其中很大一部分实现了已经实现的(例如,两个A')。我觉得将它配置为我需要它完成的工作量需要花费很多工作。 我错了吗?

您如何建议处理安全问题,例如XSS?您是否使用了某种适合您需求的预定义框架,或者您的安全性"手工制作"通过遵循cheat sheet

之类的内容

3 个答案:

答案 0 :(得分:6)

  1. 设置Anti-XSS标头(提示:使用Spring Security或自己制作Interceptor

    Content-Security-Policy: default-src 'self'   --only allow content from your own site
    
    X-XSS-Protection: 1; mode=block   --prevent some reflective attacks in some browsers
    
    X-Content-Type-Options: nosniff   --can't trick browser into detecting and running js in other content types
    
  2. 防止恶意入站HTML / JS / CSS

    在所有用户提供的字符串字段上使用Hibernate Validator(您不需要使用Hibernate ORM来使用它)和@SafeHtml注释。

    您可以在一个Interceptor中验证所有请求标头,post params和查询参数,以进行简单的XSS验证。

  3. 在输出中撤消所有用户提供的数据

    使用OWASP的Java Encoder Project <e:forHtml value="${attr}" />来转义输出或JSTL的<c:out value="${attr}"/>web.xml

    <context-param>
        <param-name>defaultHtmlEscape</param-name>
        <param-value>true</param-value>
    </context-param>
    

    如果转义HTML节点文本,它们同样安全,但OWASP对于HTML属性或<script>转义更安全。

    如果要编辑的文件太多,请考虑http://pukkaone.github.io/2011/01/03/jsp-cross-site-scripting-elresolver.html

  4. 使用JavaScript无法读取会话Cookie。在web.xml

    <session-config>
        <cookie-config>
            <!-- browser will disallow JavaScript access to session cookie -->
            <http-only>true</http-only>
        </cookie-config>
        <tracking-mode>COOKIE</tracking-mode>
    </session-config>
    
  5. 如果您要托管用户上传的文件,则需要使用其他域(不是子域)进行下载链接,这样恶意内容就无法破坏您的会话cookie(是的,即使它是httpOnly也会发生这种情况)

答案 1 :(得分:0)

我想添加这个答案,因为我认为这是一个简单而重要的注意事项:

在我的情况下,我意识到我不需要为用户输入允许任何类型的关键特殊字符。我分析了这种情况并意识到这没有任何意义,并且我的任何网页都没有必要这样做。

因此,我不需要在大约60k的现有代码行上实现适当的样式化XSS安全代码,而是可以简单地安装一个过滤器来清除所有特殊字符,我不想允许这样做。

你可以看到这在用户友好性方面有点关键,但它应该没问题。

所以:如果你意识到你不需要允许任何特殊字符,那么在一个可能的上下文(例如JS,HTML,属性......)中它们将是至关重要的,那么你可以安全地考虑到你处于和我相同的情况,很多工作。

如果您从头开始工作,显然实施Neil提到的步骤仍然是正确的方式。 如果人们在编写所有JS和JSP之前已经知道了这些步骤,他们肯定会实现它们,可能需要它们或者不需要它们。

答案 2 :(得分:0)

这是我在项目中完成的与hybrys安全相关的事情的列表:

初读文档

下面的链接中充满了资源以及有关Hybris安全性的详细信息。

XML解析器

我们经常需要从xml导入数据。

所有Sax解析器应使用以下功能:

它允许

  • 指示实现安全地处理XML。这可能会对XML构造设置限制,以避免出现诸如拒绝的条件 服务攻击。
  • 不包括外部一般实体。
  • 不包括外部参数实体或外部DTD子集
  • 如果传入文档包含DOCTYPE声明,则会引发致命错误

JSON

所有输入必须使用OWASP lib json-sanitizer进行验证。参见https://www.owasp.org/index.php/OWASP_JSON_Sanitizer

示例:

String wellFormedJson = JsonSanitizer.sanitize(jsonData);
try
{
    return new ObjectMapper().readValue(wellFormedJson, JsonNode.class).toString();
}
catch (final IOException ex)
{
     LOG.error("Incorrect json data : " + wellFormedJson, ex);
}

日志

来自应用程序外部的字符串不得直接记录,以防止日志注入。

控制箱

在Web上下文中,所有控制器都必须扩展BaseController。此类包含logParam方法,该方法应用于记录未知内容。

此方法使用YSanitizer.sanitize(input)

public class YSanitizer
{
    public static String sanitize(final String input) {
        String output = StringUtils.defaultString(input).trim();
        output = output.replaceAll("(\\r\\n|\\r|\\n)+", " ");
        output = StringEscapeUtils.escapeHtml(output);
        return output;
    }
}

其他情况

只需致电StringEscapeUtils.escapeJava(valToLog)

通过堆检查保护敏感数据

由于可以检查堆,因此不应将敏感数据存储在String对象中。

独立字符串是不可变的,可以在堆中保留一段时间。

为防止此问题,所有敏感字符串必须存储在char[]中。

(不需要该值时)应尽快用“ 0”填充此数组。

并不是说这种方法不是100%安全的,但是减少了在堆中查找密码的时间窗口。

跨站点脚本(XSS)

确保de.hybris.platform.servicelayer.web.XSSFilter在传入请求的过滤器列表中

部署检查(from Go-Live Checklist

  • 验证是否已更改所有用户的默认密码
  • 更改生产用管理员用户密码
  • 为禁用自动登录或预先填充的密码
    • 产品座舱
    • CMS座舱
    • CS座舱
    • hMC
  • 密码编码应为MD5或更好的SHA256
  • 更改默认密码编码器
  • 更改MD5和SHA256密码编码器的SALT
  • 验证数据库密码以及将其以纯文本格式存储在local.properties中的要求。
  • 验证用户帐户和结帐页面只能通过安全的SSL连接访问
  • 检查是否已安装Web应用程序防火墙
  • 执行代码检查以确保没有敏感数据(例如信用卡信息或密码)记录到日志文件中
  • 验证hybris应用程序服务器未以root用户身份运行
  • 保护已连接的JMX