针对用户提供的 url 属性的 ESAPI XSS 预防

2023-12-06

我的 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 字符。请参考我的之前的 Stackoverflow 问题在这里

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

示例: &ltscr 是第一个查询参数值的最后一部分,ipt&gtalert(0);或者某些内容作为下一个查询参数控制上下文的第一部分。

有人遇到过类似的问题吗?我真的很想知道你们实施了哪些解决方案。感谢您的指点。

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


您在这里面临的问题是,对 URL 的不同部分进行编码有不同的规则 - 记住,URL 中有 4 个部分具有不同的编码规则。首先,了解为什么在 Java 中需要使用UriBuilder班级。网址规格将有助于解决具体细节。

现在问题是整个 URL 作为输入 从用户那里,我不能简单地解析出查询参数并 单独清理它们,因为可以创建恶意输入 组合两个查询参数并单独清理它们 在那种情况下不起作用。

这里唯一真正的选择是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参考如果您需要对 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 部分,除了URI.getQuery()步骤 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(从而减轻我们的所有负担),然后在解析每个部分后对各个部分进行规范化。

请注意,我列出的代码不适用于allurl 类型... URL 的组成部分比方案/权限/路径/查询更多。 (缺少 userInfo 或 port 的可能性,如果您需要这些,请相应地修改此代码。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

针对用户提供的 url 属性的 ESAPI XSS 预防 的相关文章

  • 无法在 Android 10 中创建目录

    我无法在 android 10 中创建目录 它可以在 android Oreo 之前的设备上运行 我尝试了两种创建文件夹的方法 Using File mkdir File f new File Environment getExternal
  • Java Try Catch Final 没有 Catch 的情况下会阻塞

    我正在审查一些新代码 该程序只有一个 try 和一个 finally 块 既然排除了 catch 块 那么如果 try 块遇到异常或任何可抛出的内容 它如何工作 它直接进入finally块吗 如果 try 块中的任何代码可以引发已检查异常
  • 禁用 Eclipse Java 调试器的热代码替换 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Eclipse 中禁用热代码替换 https stackoverflow com questions 2594408 how do i disable hot code replace in
  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • 如果在睡眠线程上调用interrupt()会发生什么?

    我有一个线程 然后run I call sleep 如果我中断这个线程会发生什么 MyThread extends Thread public void run try sleep 1000000 catch InterruptedExce
  • 如何使用 SimpleDateFormat 解析多种格式的日期

    我正在尝试解析文档中的一些日期 用户似乎以类似但不完全相同的格式输入了这些日期 以下是格式 9 09 9 2009 09 2009 9 1 2009 9 1 2009 尝试解析所有这些内容的最佳方法是什么 这些似乎是最常见的 但我想让我困扰
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • Java套接字:在连接被拒绝异常时重试的最佳方法?

    现在我正在这样做 while true try SocketAddress sockaddr new InetSocketAddress ivDestIP ivDestPort downloadSock new Socket downloa
  • 无法在 Spring Boot 测试中模拟 persistenceContext

    我正在使用带有 Mockito 框架的 spring boot 测试来测试我的应用程序 存储库类 EntityManager 之一作为参考 我的班级如下所示 Repository Transactional Slf4j public cla
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 主线程如何在该线程之前运行?

    我有以下代码 public class Derived implements Runnable private int num public synchronized void setA int num try Thread sleep 1
  • 记录骆驼路线

    我的项目中有几个 Camel 上下文 如果可能的话 我想以逆向工程方式记录路线 因为我们希望保持与上下文相关的文档最新 最好的方法是什么 我们倾向于预先实际设计路线 并使用来自EIP book http www eaipatterns co
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • 对象锁定私有类成员 - 最佳实践? (爪哇)

    I asked 类似的问题 https stackoverflow com questions 10548066 multiple object locks in java前几天 但对回复不满意 主要是因为我提供的代码存在一些人们关注的问题
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • 解决错误javax.mail.AuthenticationFailedException

    我不熟悉java中发送邮件的这个功能 我在发送电子邮件重置密码时遇到错误 希望你能给我一个解决方案 下面是我的代码 public synchronized static boolean sendMailAdvance String emai
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情

随机推荐

  • 在 ~/.bashrc 中设置的变量并在 shell 脚本中访问它们

    我在 bashrc 的最顶部有这个 before非交互式 shell 的返回 FOO BAR export FOO echo HELLO WORLD If not running interactively don t do anythin
  • List 上的 BinarySearch 似乎返回奇怪的结果

    我对 C 很陌生 我创建了一个 List 对象 然后对特定项目执行 BinarySearch 但搜索结果似乎很奇怪 这是代码 class Element public int x public Element int val x val c
  • 如何在 jQuery 悬停菜单中保持子菜单打开?

    我上周刚刚开始使用 jQuery 进行编码 需要一些帮助来弄清楚如何使菜单正常工作 我有 3 个选项卡 每个选项卡都有自己的菜单 当显示页面时 会自动显示菜单和子菜单 显示后 用户可以将鼠标悬停在选项卡上以查看其他子菜单 当他们停止悬停时
  • 为什么 Mule App xml 的架构验证对于 Java 组件绑定失败?

    我在我的 mule 应用程序中配置了以下组件绑定
  • 我看不到与信标相关的附近通知

    我的设备昨天更新了谷歌服务应用程序 我已经测试过谷歌附近的通知在 Android 上有两个信标 一个 iBeacon 和一个 Eddystone UID 这些信标处于活动状态 并且已在平台中正确注册 我看到它们已在 Android Beac
  • Hibernate 5 中 org.hibernate.Transactions.isActive() 的替换

    我正在从 hibernate 4 2 17 迁移到 5 0 7 到目前为止效果很好 但该方法似乎isActive已弃用 我只是不能再使用它了 这是我的代码 public void starteTransaktion try getMySes
  • 使用形状笛卡尔和 matplotlib 绘制断开连接的实体

    我需要绘制一个断开的圆圈列表 这些圆圈是我为其他目的而创建的 我试图完全按照中的示例进行操作http toblerity org shapely manual html cascading unions显示 参见code 但只有当圆圈重叠并
  • 是否可以在 Common Lisp 中定义递归类型?

    递归类型是一种具有基数和自身递归情况的类型 我希望它实现 类型化列表 即其conses仅允许相同元素类型或nil的列表 我尝试了以下定义 deftype list of a or null cons a list of a 然而 这表明由于
  • 在 Visual Basic 中连接控件,控制控件

    我正在使用 Visual Basic Visual Studio 2010 创建动态创建的控件 本质上 我正在做的是创建一个标签 一个文本框 一个标签 将充当秒表 和一个按钮 用于控制所述秒表 每组控件将按如下方式排列 并命名 LABEL
  • 带有圆角和阴影 Kivy 的图像

    How can I do something like this with Kivy 使用按钮的背景 正常 背景 向下 and border为了达成这个 让我们将您提供的两张图片命名为正常 png and down png 详细信息请参考下
  • Cordova 插件 - 添加第三方 sdk

    我正在尝试为以下 sdk 创建插件 https ktplayhelp zendesk com hc en us articles 221071888 Android 在设置项目配置点中 它告诉我们通过在 Android studio 中导入
  • 如何在使用 SQL Server 插入/更新之前验证数据?

    我有一个这样定义的表 CREATE TABLE dbo ObjectRelationClauses Id INT NOT NULL PRIMARY KEY IDENTITY RelationId INT NOT NULL OperatorT
  • 在 REST 应用程序中为当前登录用户设计 URI

    我的 REST API 中需要一个 URI 来检索当前登录的用户 通常我使用GET具有 ID 的资源 但客户端不知道用户的 ID 我找到了以下解决方案 按用户名 此解决方案使用用户名而不是用户的 ID Example Bitbucket R
  • Visual Studio 2010 SP1 中缺少 MVC3

    我安装了VS 2010 Ultimate 它没有 MVC3 我安装了 SP1 它应该也安装了更新以及 MVC3 对吗 但安装后 我在新项目窗口中仍然没有 MVC3 选项 这是怎么回事 MVC3 是可选下载 http www asp net
  • LinkedIn 网站分享始终显示 1 分钟阅读

    我正在尝试找出如何删除1 min read在我向 LinkedIn 分享内容时的描述中 1 分钟阅读示例 我在页面上有打开的图表标签 并验证它们不会在页面上的任何位置显示 1 分钟阅读时间 我也玩过 og type 尝试 文章 媒体 视频
  • ASP.NET Web API 身份验证

    我希望在使用时从客户端应用程序对用户进行身份验证ASP NET Web API 我观看了网站上的所有视频并阅读了这个论坛帖子 把 Authorize 属性正确返回一个401 Unauthorized地位 但是 我需要知道如何允许用户登录 A
  • 具有多态性的Python棉花糖树结构

    我有以下树结构代码 class Node def init self node id str self node id node id self children def add child self node Node if isinst
  • 编译具有动态模块支持的 Apache Web 服务器

    我刚刚在全新安装的 Ubuntu 10 04 2 上编译了 Apache 2 2 17 这是一个学习练习 旨在发现编译某些内容时实际发生的情况 而不仅仅是使用 apt get 因此避免使用 apt get 而有利于自己编译该内容 I ran
  • 最佳学生座位安排的算法

    假设我需要将 n 30 名学生分为 2 到 6 人一组 然后我从每个学生那里收集以下偏好数据 学生姓名 Tom 喜欢和以下人坐在一起 吉米 埃里克 不喜欢和以下人坐在一起 约翰 保罗 林戈 乔治 这意味着他们对整个班级中他们没有提到的任何其
  • 针对用户提供的 url 属性的 ESAPI XSS 预防

    我的 REST API 之一需要一个属性 url 该属性需要一个 URL 作为用户的输入 我正在使用 ESAPI 来防止 XSS 攻击 问题是用户提供的 URL 类似于 http example com alpha abc def phil