检查所有参数以防止注入攻击是一种好习惯吗?

时间:2015-07-20 08:21:41

标签: java security spring-mvc owasp

背景

  • 应用程序基于:Spring MVC
  • Java8
  • 主要使用拦截器过滤掉请求。

问题

我测试了我的应用程序,每个用户输入都容易受到HTML /脚本注入攻击。我在客户端使用某种方法来阻止它们,但如果我们在将表单值发布到服务器之前操作了表单值,则注册成功完成并损坏了我的网站。因此,我的首要任务是在服务器端使用相同的检测方法。我应该做这个预告片,但无论如何还有一些原因......

我在想什么

是检查拦截器中的每个参数。拦截器将验证页面提供用户输入和表单的所有参数。

有点像这样

public class ParameterFilteringInterceptor {
     // 1. get all request parameters..
     // 2. check every values..
     // 3. if illegal characters exist in one of them, 
     //    converting or escaping them will start and change them to acceptable values.

     // Getting and setting on request parameters is going to occur frequently.

     // If good to go, return true
     // Or return false with a proper error message.
}

像这样设置

    <interceptor>
        <mapping path="/addform" />
        <mapping path="/editform" />
        <mapping path="/post" />
        <mapping path="/newarticle" />
        <mapping path="/newcomment" />
            .
            .
            .
            <!-- Depend on the volume of a web application,
            these mapping paths could be sooooooooo many. -->
        <beans:bean class="com.company.web.interceptor.AuthenticatingInterceptor"></beans:bean>         
    </interceptor>

所以......我想问的是...... &#34;上面有什么好看的想法?&#34;

1 个答案:

答案 0 :(得分:3)

试图逃避或以其他方式拒绝提交cross-site scripting (XSS)次尝试并不是一个好主意。这种方法存在一些问题:

  • 逃避用户输入的正确方法取决于您要注入的位置。使用不正确转义的内容可能会导致显示问题 - 用户看到垃圾 - 或意外的XSS漏洞。
  • 由于您的用户内容已被转义以进行展示,因此您必须避免再次转发它。这意味着您必须在模板中以不同方式处理来自数据库的用户输入和来自其他来源的用户输入,否则您将遇到与上述相同的问题。
  • 当您不想将其用于显示时,数据库中已转储的内容需要特殊处理,因为您需要对其进行处理。这会增加不必要的样板代码,降低互操作性,并可能导致错误。
  • 很难区分合法的XSS攻击和无害使用保留字符,例如&lt;,&gt;,&#34;或者&#39;。标记剥离(即删除看起来像HTML标记的所有内容)等方法可能会破坏用户内容。

相反,您应该在显示内容时适当地转义 。这里有一个pretty good writeup,详细说明了为什么逃避输入是一个坏主意。

Spring支持的模板框架具有转义内容的快捷方式。

就我个人而言,我建议使用Thymeleaf:默认情况下,它会为HTML内容和属性转义用户输入 - 否则需要使用specific Thymeleaf attribute - 并且它有shortcuts for escaping input用于JavaScript或JSON嵌入式在页面上(见下)。

如果您正在使用其他模板框架(或JSP),请查阅其文档以了解如何在显示中转义内容。请注意,某些模板框架默认情况下不会转义和/或不提供不同的转义方法。当你忘记在某处忘记输入时,前者会导致XSS漏洞,后者的后果已经在上面描述过了。