栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

用户提供的url属性的ESAPI XSS防护

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用户提供的url属性的ESAPI XSS防护

您在这里面临的问题是,对URL的不同部分进行编码有不同的规则-
为了存储URL中的4个部分,它们具有不同的编码规则。首先,了解为什么在Java中,您需要使用

UriBuilder
该类来构建URL 。URL
规范将帮助您了解细节。

现在,由于问题在于,由于整个URL都是作为用户输入的,因此我无法简单地解析出Query参数并分别对其进行清理,因为可以将两个查询参数组合在一起创建恶意输入,并分别对其进行清理,因此无法正常工作。案件。

唯一真正的选择是

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 {        Enprer enc = ESAPI.enprer();        String input = "http://example.com/alpha?abc=def&phil=key%3dbdj";        URI dirtyURI = new URI(input);        enc.canonicalize(dirtyURI.getQuery());    }}

================更新问题的答案=====================

没办法解决:

Enprer.canonicalize()
旨在将转义的字符序列减少为它们的简化本机到Java形式。URL很可能被视为特殊情况,因此有意将其排除在考虑范围之外。这是我处理您的案件的方式-
没有白名单,这将确保您受到的保护
Enprer.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.URLEnpredUtils;import org.junit.Test;import org.owasp.esapi.ESAPI;import org.owasp.esapi.Enprer;public class TestURLValidation{  @Test  public void test() throws URISyntaxException {    Enprer enc = ESAPI.enprer();    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 = URLEnpredUtils.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的内容比scheme / authority / path /
query还要多。(缺少userInfo或port的可能性,如果需要,请相应地修改此代码。)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/570733.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号