我的一个REST API期望一个属性“url”,它希望URL作为用户的输入.我正在使用ESAPI来防止XSS攻击.问题是用户提供的URL就像

http://example.com/alpha?abc=def\u0026amp;phil=key=bdj

来自ESAPI编码器的cannonicalize方法抛出入侵异常,声称输入具有混合编码,因为它是url编码的,并且片段’& phi’被视为HTML编码,因此是例外.

我在清理我的一个应用程序URL时遇到了类似的问题,其中第二个查询参数以’pa’或’pi’开头,并通过HTML解码转换为delta或pi字符.请参考我的previous Stackoverflow question here

现在问题是因为整个URL都是来自用户的输入,我不能简单地解析查询参数并单独清理它们,因为可以结合两个查询参数创建恶意输入并单独清理它们不会在那里工作案件.

示例:& ltscr来自第一个查询参数值和ipt& gtalert(0)的最后一部分;或者某些东西作为下一个查询参数控制上下文的第一部分.

有没有人遇到过类似的问题?我真的很想知道你们实施了哪些解决方案.谢谢你的任何指示.

编辑:’avgvstvs’的以下答案不会引发入侵异常(谢谢!).但是,cannonicalize方法现在更改原始输入字符串. ESAPI将查询参数的& phi视为一些html编码的char并将其替换为’?’焦炭.像我之前在这里链接的问题.区别在于我的应用程序的URL,而这是用户输入.我唯一的选择是在这里保留一份白名单吗?

最佳答案 您在这里遇到的问题是,对URL的不同部分进行编码有不同的规则 – 对于内存,URL中有4个具有不同编码规则的部分.首先,了解为什么在Java中,您需要使用UriBuilder类构建URL. URL

specification将帮助解决细节问题.

Now since the problem is that since the entire URL is coming as input

from the user, I cannot simply parse out the Query parameters and

sanitize them individually, since malicious input can be created

combining the two query parameters and sanitizing them individually

wont work in that case.

这里唯一真正的选择是java.net.URI.

试试这个:

URI dirtyURI = new URI("http://example.com/alpha?abc=def&phil=key%3dbdj");

String cleanURIStr = enc.canonicalize( dirtyURI.getPath() );

对URI.getPath()的调用应该给你一个非百分比编码的URL,如果enc.canonicalize()在那个阶段之后检测到双重编码,那么你真的有一个双重编码的字符串,并且应该通知调用者你将只接受单编码的URL字符串. URI.getPath()非常智能,可以为URL字符串的每个部分使用解码规则.

如果它仍然给你一些麻烦,API reference还有其他方法可以提取URL的其他部分,如果你需要对URL的不同部分做不同的事情.例如,如果您需要手动解析GET请求中的参数,您实际上可以让它返回查询字符串本身 – 它将对其进行解码传递.

============= JUNIT测试用例============

package org.owasp.esapi;

import java.net.URI;

import java.net.URISyntaxException;

import org.junit.Test;

public class TestURLValidation {

@Test

public void test() throws URISyntaxException {

Encoder enc = ESAPI.encoder();

String input = "http://example.com/alpha?abc=def&phil=key%3dbdj";

URI dirtyURI = new URI(input);

enc.canonicalize(dirtyURI.getQuery());

}

}

=================回答更新的问题=====================

没有办法解决它:Encoder.canonicalize()旨在将转义的字符序列减少为简化的本机到Java格式.网址很可能被视为特殊情况,因此很可能会故意将其排除在考虑范围之外.这是我处理你的情况的方式 – 没有白名单,它将保证你受Encoder.canonicalize()的保护.

使用上面的代码获取输入的URI表示.

第1步:规范化除URI.getQuery()之外的所有URI部分

步骤2:使用库解析器将查询字符串解析为数据结构.我会使用来自commons的httpclient-4.3.3.jar和httpcore-4.3.3.jar.然后你会做这样的事情:

import java.net.URI;

import java.net.URISyntaxException;

import java.util.Iterator;

import java.util.List;

import javax.ws.rs.core.UriBuilder;

import org.apache.http.client.utils.URLEncodedUtils;

import org.junit.Test;

import org.owasp.esapi.ESAPI;

import org.owasp.esapi.Encoder;

public class TestURLValidation

{

@Test

public void test() throws URISyntaxException {

Encoder enc = ESAPI.encoder();

String input = "http://example.com/alpha?abc=def&phil=key%3dbdj";

URI dirtyURI = new URI(input);

UriBuilder uriData = UriBuilder.fromUri(enc.canonicalize(dirtyURI.getScheme()));

uriData.path(enc.canonicalize(enc.canonicalize(dirtyURI.getAuthority() + dirtyURI.getPath())));

println(uriData.build().toString());

List params = URLEncodedUtils.parse(dirtyURI, "UTF-8");

Iterator it = params.iterator();

while(it.hasNext()) {

org.apache.http.NameValuePair nValuePair = it.next();

uriData.queryParam(enc.canonicalize(nValuePair.getName()), enc.canonicalize(nValuePair.getValue()));

}

String canonicalizedUrl = uriData.build().toString();

println(canonicalizedUrl);

}

public static void println(String s) {

System.out.println(s);

}

}

我们在这里真正做的是使用标准库来解析inputURL(从而减轻我们的负担),然后在我们解析每个部分之后规范化部分.

请注意,我列出的代码不适用于所有网址类型…网址的部分多于方案/权限/路径/查询. (缺少userInfo或端口的可能性,如果需要,请相应地修改此代码.)

java esapi_java – 用户提供的url属性的ESAPI XSS预防相关推荐

  1. 通过java提供的URL类包读取网上的文件

    通过java提供的URL类包,我们可以象IE浏览器一样从指定的网址上下载网页,而且,下载的绝对是真正的HTML,利用这个原理我们可以制作自己内核的浏览器呢! 请看这是实现原理的源程序: import ...

  2. java ee用户登录_EE Servlet 3:使用会话和过滤器开发用户登录

    java ee用户登录 我在上一篇文章中介绍了Application类,您可以在其中设置后端服务. 我添加的一个示例服务是UserService . 该服务将加载包含用户名和密码集的Java用户属性文 ...

  3. java都要caps标点_第 1 章 管理 Java CAPS 用户

    第 1 章 管理 Java CAPS 用户 在此处列出的主题提供了有关如何管理 Sun JavaTM Composite Application Platform Suite (Java CAPS) ...

  4. 点击刷新时修改路径 html,window.location更改URL属性、重定向或刷新页面!!

    本篇文章给大家分享一份window.location备忘单!了解如何更改URL属性以及如何在JavaScript中重定向或刷新页面.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 如 ...

  5. Java自己文章只能自己修改_文章目录Java代码俯身指南,主要为Java开发人员提供代码复审参考,快捷有效提出修改意见。目的发现代码错误:一个人写的代码可能会有一些思想和设计盲点,多个人尽...

    文章目录 Java代码俯身指南,主要为Java开发人员提供代码复审参考,快捷有效提出修改意见. 目的发现代码错误:一个人写的代码可能会有一些思想和设计盲点,多个人尽早的发现BUG. 统一代码风格:统一 ...

  6. 【Java进阶】Java并发类库提供的线程池有哪几种? 分别有什么特点?

    我在专栏第 17 讲中介绍过线程是不能够重复启动的,创建或销毁线程存在一定的开销,所以利用线程池技术来提高系统资源利用效率,并简化线程管理,已经是非常成熟的选择. 今天我要问你的问题是,Java 并发 ...

  7. 爱上MVC~为非法进行Action的用户提供HttpStatusCodeResult

    对一MVC来说,它有Controller和Action,其中Action用来为页面提供数据和相关逻辑,并最后将页面渲染出来,而有些action是需要一些参数的,如文章的最终页,可能需要一个ID,而这个 ...

  8. Java培训教程之JDBC URL结构分析

    JDBC URL提供了一种标识数据库的方法,它可以使JDBC程序识别指定的数据库并与之建立连接.大家在编写JDBC程序时, 无需关注JDBC URL的形成过程,只需使用与所用的数据库一起提供的URL即 ...

  9. java 反射创建属性_使用Java反射机制确定基本数据类型属性

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Java反射机制提供了一种强大的应用程序接口来帮助我们在运行时检测和执行对象上的操作.该机制允许程序员审视一个未知对象,并且获得它的属性,例如对象上的方法 ...

最新文章

  1. DataGrid鼠标事件方法
  2. redhat5.5安装oracle10g出现问题
  3. 2021CCF颁奖典礼首次多平台网络直播,致敬获得者!CCF杰出工程师
  4. 在wildfly中使用SAML协议连接keycloak
  5. Python的DoS拒绝服务之TCP/SYN洪水攻击
  6. 基于AWT、Swing的GUI编程 - 多个命令共享同一个监听器类
  7. Process, Thread, STA, MTA, COM object
  8. 配置vscode作为STM32代码的编辑器(替代keil5)。实现:代码自动补全, 编译,下载。nRF52也可以编译。
  9. 网易云易盾正式成为“中国短视频与直播联盟”常务理事
  10. dart语言Iterable fold用法
  11. 海淘 亚马逊 冻结账号 怎么办?
  12. 雷军:相信自己,一往无前(MI10周年演讲精彩语录)
  13. 函数调用过程中函数栈详解
  14. 程序员应该如何写好自己的简历
  15. 在mysql数据库中如何导出数据库_MYSQL导出数据库的一些方法
  16. 3.Channel详解
  17. ITE IT66121 HDMI 音视频分配芯片 发射器
  18. [Vue warn]: Failed to mount component: template or render function not defined.解决方案
  19. 批处理常用特殊符号简介
  20. 用verilog实现m序列生成

热门文章

  1. C语言(中缀转后缀)
  2. 中缀转后缀,后缀表达式求值
  3. jsp include中文乱码问题解决方案
  4. 郑州海关销毁近2万张“问题地图” 重约5.3吨
  5. assignfile用法
  6. 【翻译】fancyBox3 中文文档
  7. keba界面控制 扫描所有项目
  8. 平行志愿计算机录取顺序,平行志愿中多个院校在录取时有先后顺序吗?
  9. 面向对象的三大特性------封装、继承、多态
  10. SpringMVC+ajaxFileUpload上传图片 IE浏览器弹下载框问题解决方案