- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的一个 REST API 需要一个属性“url”,它需要一个 URL 作为用户输入。我正在使用 ESAPI 来防止 XSS 攻击。问题是用户提供的 URL 类似于
http://example.com/alpha?abc=def&phil=key%3dbdj
来自 ESAPI 编码器的 cannonicalize 方法在这里抛出入侵异常,声称输入具有混合编码,因为它是 url 编码的,并且片段 '&phi' 被视为 HTML 编码,因此是异常。
我在清理我的一个应用程序 URL 时遇到了类似的问题,其中第二个查询参数以“pa”或“pi”开头,并通过 HTML 解码转换为 delta 或 pi 字符。请引用我的previous Stackoverflow question here
现在的问题是,由于整个 URL 都是来自用户的输入,我不能简单地解析出查询参数并单独清理它们,因为恶意输入可以结合两个查询参数创建并单独清理它们不会在那种情况下工作。
示例:<scr 是第一个查询参数值和 ipt>alert(0) 的最后一部分;或者作为下一个查询参数控制上下文的第一部分出现的东西。
有人遇到过类似的问题吗?我真的很想知道你们实现了哪些解决方案。感谢您的指点。
编辑:'avgvstvs' 的以下回答不会抛出入侵异常(谢谢!!)。但是,cannonicalize 方法现在会更改原始输入字符串。 ESAPI 将查询参数的 &phi 视为一些 html 编码的字符并将其替换为 '?'字符。类似于我之前的问题,链接在这里。不同之处在于,这是我的应用程序的 URL,而这是用户输入。我唯一的选择是在这里维护白名单吗?
最佳答案
您在这里面临的问题是,对 URL 的不同部分进行编码有不同的规则——根据内存,URL 中有 4 个部分具有不同的编码规则。首先,了解为什么在 Java 中,您需要使用 UriBuilder
构建 URL类(class)。网址 specification将帮助解决细节问题。
Now since the problem is that since the entire URL is coming as inputfrom the user, I cannot simply parse out the Query parameters andsanitize them individually, since malicious input can be createdcombining the two query parameters and sanitizing them individuallywont 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 形式。 URL 很可能被认为是一种特殊情况,因此它们很可能被故意排除在外。这是我处理你的情况的方式——没有白名单,它会保证你受到 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<org.apache.http.NameValuePair> params = URLEncodedUtils.parse(dirtyURI, "UTF-8");
Iterator<org.apache.http.NameValuePair> 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(从而减轻我们的所有负担),然后在我们解析每个部分后规范化这些部分。
请注意,我列出的代码不适用于所有 url 类型...URL 的部分比方案/授权/路径/查询更多。 (缺少的是 userInfo 或 port 的可能性,如果您需要这些,请相应地修改此代码。)
关于java - 针对用户提供的 url 属性的 ESAPI XSS 预防,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23434156/
服务器XSS的区别有什么明确的解释和客户端 XSS? 我阅读了 OWASP 网站上的解释,但对我来说不是很清楚。我知道反射、存储的 DOM 类型。 最佳答案 首先,为了让其他人发现问题,我们从 OWA
我在考虑我的应用程序的 XSS 漏洞。在服务器端,我不清理输入或输出,所以 alert(document.cookies) 完全如此存储在数据库中。要在客户端查看此值,我使用 Mustache。如果这
我无法理解存储的 xss 和反射的 xss 之间的区别是什么。你能举个例子告诉我吗? 最佳答案 存储型 XSS 意味着一些 坚持数据(通常存储在数据库中)未在页面中进行清理,这意味着每个人都可能受到该
Cross-site scripting (XSS) is a type of computer security vulnerability typically found in web appli
有人可以用简单的英语解释 XSS 是如何工作的吗?也许举个例子。谷歌搜索没有多大帮助。 最佳答案 跨站点脚本基本上是动态网页的安全漏洞,攻击者可以创建恶意链接将不需要的可执行 JavaScript 注
站点的本地存储值可以被xss(跨站点脚本)覆盖吗?据我在 Chrome 和 Firefox 中验证,一个站点的 localstorage 值不能被其他站点访问。谁能告诉我 localstorage 值
据我了解,我需要在 header 服务器端禁用 X-XSS-Protection,以防止通过 GET 请求发生 XSS。 例如,用户浏览到 http://mysite.com/index.php?pa
在 OWASP XSS prevention cheat sheet它表示无法将不受信任的数据安全地放入 .setinterval JS 函数中。即使被转义/编码,XSS 仍然是可能的。 但如果我有这
我正在创建一个网页,用户可以在其中交互并在远程计算机上执行基本的文件系统操作(创建文件/目录、删除文件/目录、导航文件系统)。 该网页是基本的 HTML(UTF-8 编码)和 Javascript。我
可能是简单的解决方案,但我不明白为什么我尝试通过索引页面上的 XSS 输入在我的欢迎页面上运行此警报脚本不起作用。 我有一个带有表单的简单 index.htm 页面:
好的,所以我一直在阅读关于此处和其他地方的 Markdown ,并且用户输入和数据库之间的步骤通常被给出为 将 markdown 转换为 html 清理 html(带白名单) 插入数据库 但对我来说,
我最近发现 this blog entry在将 XSS 攻击直接写入数据库的工具上。它看起来是一种非常好的方法来扫描应用程序以查找我的应用程序中的弱点。 我尝试在 Mono 上运行它,因为我的开发平台
我正在经历一场无情的 XSS 攻击,但我似乎无法阻止。我的网站上共有三个输入表单 - 一个用于上传图像,一个用于向页面添加评论,第三个用于通过 php 发送电子邮件。我以一种或另一种方式保护它们所有人
我正在寻找有关 Qooxdoo 安全性的信息。 我想检查我的应用程序 vs OWASP top 10 需要审查的一点是 XSS OWASP A3 XSS 我如何确定 Qooxdoo 是安全的,可以抵御
我的网站遭受了多次 XSS 攻击。以下 HTML 片段是攻击者注入(inject)的 XSS 向量: 看起来脚本不应该执行,但是使用 IE9 的开发工具,我能够看到浏览器将 HTML 转换为以
CaSTLe Project 功能丰富,包括一些很棒的子项目,使用它进行开发是一种乐趣。 我的团队几乎准备好交付定制的 EAM我们正在完善我们的系统。我们尝试了一些基本的 XSS 攻击并猜测:它们都有
通过简单地转换以下(“大 5”): & -> & < > -> > " -> " ' -> ' 你会阻止 XSS 攻击吗? 我认为您也需要在字符级别上列入白名
我正在使用 ASP.NET 并且在 ASP.NET 页面上具有用于检查 XSS 验证的验证属性。但是我想知道这真的足够了吗? 我访问了一些关于 stackoverflow 的相关帖子,这对我有帮助,但
我们正在使用 ASP.NET MVC 5.0 来构建一个网站。如果我在保存时输入一些 javascript 文本框,我会得到一个“检测到可能不安全的输入”错误页面 - 太好了。 然而,我们的一些屏幕使
持久性 XSS 和非持久性 XSS 之间的主要区别是什么? 最佳答案 顾名思义,持久型 XSS 和非持久型 XSS 的区别如下。 持久性 XSS 存储在 cookie 或服务器数据库中的 XSS。 聊
我是一名优秀的程序员,十分优秀!