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