草庐IT

关于java:HTML-Entity转义防止XSS

codeneng 2023-03-28 原文

HTML-Entity escaping to prevent XSS

我有一些用户输入。在我的代码中,我确保以下符号被转义:

1
2
3
& -> &
< -> <
> -> >

OWASP 声明有更多的字符需要转义。

对于属性,我做了另一种转义:

1
2
& -> &
" ->"

这确保所有属性都被"包围。这让我确定我的 html 属性,而不是 HTML 本身。

我想知道我的逃跑是否足够。我读过这篇文章,但我仍然不确定我的担忧。

(JavaScript 使用 OWASP 库进行转义)

  • ' -> % -> &perc;(对于 XSS,每 4 个编码字符等)
  • @JoopEggen 在什么情况下将 % 替换为 &perc; 有用?
  • @Gumbo &perc; 对于 XSS 确实没那么有用,但它可以混淆 url。浏览器不为其字符使用 % 代码,即: 不调用 javascript。


我也使用 OWASP (ESAPI) 库,为不同类型的显示转义字符串,使用 :

1
2
3
String html = ESAPI.encoder().encodeForHTML("hello < how > are 'you'");
String html_attr = ESAPI.encoder().encodeForHTMLAttribute("hello < how > are 'you'");
String js = ESAPI.encoder().encodeForJavaScript("hello < how > are 'you'");

HTML(假设为 jsp)

1
<tag attr="<%= html_attr %>" onclick="alert('<%= js %>')"><%= html %></tag>

更新 (2017)

由于 ESAPI 编码器被认为是遗留的,因此已经创建了一个更好的替代方案并且正在积极维护中,我强烈建议使用 OWASP Java 编码器。

如果您的项目已经使用 ESAPI,则添加了一个集成,允许您使用此库进行编码。

在他们的 wiki 页面上解释了用法,但为了完整起见,您可以使用它来对数据进行上下文编码:

1
2
3
4
5
6
7
8
// HTML Context
String html = Encoder.forHtml("u<ntrus>te'd'");

// HTML Attribute Context
String htmlAttr = Encoder.forHtmlAttribute("u<ntrus>te'd'");

// Javascript Attribute Context
String jsAttr = Encoder.forJavaScriptAttribute("u<ntrus>te'd'");

HTML(假设为 jsp)

1
2
" onclick="alert('<%= jsAttr %>')">
    <%= html %>

PS: 更多的上下文存在并且被库支持

  • 正如我所提到的,我使用 OWASP 来转义 Javascript-Strings。但我有一些遗留代码,由 apache cocoon 生成。这段代码正在按照我的描述进行转义。我的问题是:逃避足够吗?如果不是(并且只有在没有的情况下),我将不得不逐行修改~200 XSL-Stylesheet。
  • 恕我直言,我认为这还不够,仅通过检查此站点(ha.ckers.org/xss.html)就可以确定您的转义是不够的
  • @ckuetbach,这能回答你的问题吗?
  • 我想我的逃跑应该足够了。如 OWASP 所述,对属性和 Javascript 进行转义。只有在纯 HTML 中,我的转义没有 OWASP 所说的那么难。但是在 ha-ckers.org,如果 < 和 > 被转义,我无法找到任何仅 HTML-Body 的 XSS 女巫将起作用。
  • 2014/2015 更新:我强烈建议将其用作避免 XSS 攻击的参考。它也是由 OWASP 人员编写的:owasp.org/index.php/...
  • @PrestonBadeer 是的,我现在正在读这个。我可以问你关于这篇文章的问题吗?它说要转义以下字符。


我推荐你使用 Appache Common Lang 库来转义字符串,例如转义 HTML:

1
String escapedString = org.apache.commons.lang.StringEscapeUtils.escapeHtml(String str);

该库有许多有用的方法可以在 HTML、XML、Javascript 中进行转义。

  • 我不认为公共语言库像 ESAPI 那样经过故意恶意输入测试。
  • 实际上,StringEscapeUtils 不会将单引号 ' 转义为 ,因此它不适合 HTML 转义以防止 XSS

有关关于java:HTML-Entity转义防止XSS的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby - 匹配未转义的平衡定界符对 - 2

    如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

  3. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  4. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  5. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  6. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  9. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  10. ruby-on-rails - capybara ::ElementNotFound:无法找到 xpath "/html" - 2

    我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'

随机推荐