当前位置: 首页 > 面试题库 >

如何在Jersey 2中修改QueryParam和PathParam

甄成弘
2023-03-14
问题内容

我试图过滤/修改Post和Put调用,以确保从HTML和JS代码中过滤出用户提供的所有参数,以防止XSS攻击。我想确保这是在API级别上实现的,因此无论使用什么客户端,它都将受到保护。

对于Jersey
1.x,可以通过实现ContainerRequestFilter并在将它们与请求的servlet匹配之前修改request.getQueryParameters()来实现。示例:http://codehustler.org/blog/jersey-cross-site-scripting-xss-filter-for-
java-web-apps/

但是,对于Jersey
2,实现相同的接口是不可能的,因为我们不能再使用getQueryParameters()或getPathParameters(),而是只能使用getUriInfo(),但是由于查询参数是不可变的,因此它是无用的。我调查了泽西岛的过滤器和拦截器,但不幸的是,它们仅限于提供标题和cookie的访问权限。

我花了很多时间进行研究,但找不到我想要的东西。

有没有其他方法可以过滤路径和查询参数?有什么我想念的吗?

谢谢!


问题答案:

我在下面添加了一个适用于Jersey 2.x的过滤器。但是,它没有对Cookies进行XSS修复,因为我还没有找到html" target="_blank">修改它们的方法。

需要注意的重要一点是,这需要与POJO属性上的@SafeHtml结合使用,以清理这些值。

@PreMatching
public class XSSFilter implements ContainerRequestFilter
{
    /**
     * @see ContainerRequestFilter#filter(ContainerRequest)
     */
    @Override
    public void filter( ContainerRequestContext request )
    {
        cleanQueryParams( request );
        cleanHeaders( request.getHeaders() );
    }


    /**
     * Replace the existing query parameters with ones stripped of XSS vulnerabilities
     * @param request
     */
    private void cleanQueryParams( ContainerRequestContext request )
    {
        UriBuilder builder = request.getUriInfo().getRequestUriBuilder();
        MultivaluedMap<String, String> queries = request.getUriInfo().getQueryParameters();

        for( Map.Entry<String, List<String>> query : queries.entrySet() )
        {
            String key = query.getKey();
            List<String> values = query.getValue();

            builder.replaceQueryParam( key );
            for( String value : values ) {
                builder.replaceQueryParam( key, Utils.stripXSS( value ) );
            }

        }

        request.setRequestUri( builder.build() );
    }


    /**
     * Replace the existing headers with ones stripped of XSS vulnerabilities
     * @param headers
     */
    private void cleanHeaders( MultivaluedMap<String, String> headers )
    {
        for( Map.Entry<String, List<String>> header : headers.entrySet() )
        {
            String key = header.getKey();
            List<String> values = header.getValue();

            List<String> cleanValues = new ArrayList<String>();
            for( String value : values ) {
                cleanValues.add( Utils.stripXSS( value ) );
            }

            headers.put( key, cleanValues );
        }
    }
}

stripXSS函数如下:

/**
 * Strips any potential XSS threats out of the value
 *
 * @param value
 * @return
 */
public static String stripXSS( String value )
{
    return stripXSS( value, Whitelist.none() );
}


/**
 * Strips any potential XSS threats out of the value excluding
 * the white listed HTML
 *
 * @param value
 * @param whitelist
 * @return
 */
public static String stripXSS( String value, Whitelist whitelist )
{
    if( StringUtils.isBlank( value ) )
        return value;

    // Use the ESAPI library to avoid encoded attacks.
    value = ESAPI.encoder().canonicalize( value );

    // Avoid null characters
    value = value.replaceAll("\0", "");

    // Clean out HTML
    Document.OutputSettings outputSettings = new Document.OutputSettings();
    outputSettings.escapeMode( EscapeMode.xhtml );
    outputSettings.prettyPrint( false );
    value = Jsoup.clean( value, "", whitelist, outputSettings );

    return value;
}

还更新了原始帖子:http : //codehustler.org/blog/jersey-cross-site-
scripting-xss-filter-for-java-web-apps/



 类似资料:
  • 问题内容: 我正在尝试将我的项目目录添加到GOPATH,在Linux中,我可以这样做 在〜/ .bashrc中 Powershell中的等效性是什么 问题答案: 这应该遵循您使用Powershell设置任何Environment变量的方式(如本文所述): 如果您希望它永久存在(即将来将适用于任何外壳程序): 需要注意的一件事:当我们用来创建新的用户或计算机级环境变量时,在Windows Power

  • 问题内容: 我需要在Java中更改JSON属性的值,我可以正确获取该值,但无法修改JSON。 这是下面的代码 做这个的最好方式是什么? 问题答案: 是不可变的,旨在进行解析操作。但是,可以将其转换为允许突变的(和): 对于数组,可以使用:

  • 问题内容: 我有一个字符串: 我想在拆分并递增1之后解析每个项目。因此,我将拥有: 如何在NodeJS中做到这一点? 问题答案: 用途与功能: 注意-字符串强制转换为数字。 或更短: 编辑2015.07.29 今天,建议 不要 使用运算符将变量转换为数字。取而代之的是,我会进行更明确但更易读的调用: 编辑2017.03.09 ECMAScript 2015引入了 箭头功能, 因此可以代替使用它来使

  • 问题内容: 我不是在问这里已经问过的问题: @PathParam和@QueryParam有什么区别 这是一个“最佳做法”或约定俗成的问题。 当你使用。 我能想到的决定可能是使用两者来区分信息模式。让我在下面说明我的LTPO-不够完美。 可以为信息类别保留PathParam的使用,它很好地属于信息树的一个分支。PathParam可用于向下钻取实体类层次结构。 而QueryParam可以保留用于指定属

  • 使用功能强大的“形状”工具可以快速绘制矢量形状。大部分形状为实时形状,这意味着,您可以使用形状上的控件构件或“转换”面板中的可用控件来动态调整形状,而无需切换工具。 创建和修改实时形状 可使用以下任一工具绘制实时形状: 矩形工具 () 圆角矩形工具 () 椭圆工具 () 多边形工具 () Shaper 工具 () 直线段工具 () 注意: 要在选择对象时查看定界框,请确保将设置设定为显示定界框(视

  • 问题内容: 在我的Python测试脚本中,我多次使用此模式: 有没有更简洁的方法来临时修改搜索路径? 问题答案: 您可以使用一个简单的上下文管理器: 然后要导入模块,您可以执行以下操作: 从语句主体退出时,将恢复到原始状态。如果仅使用该块中的模块,则可能还希望从以下位置删除其引用: