【问题标题】:Can Javascript be written in a html href tag?Javascript可以写在html href标签中吗?
【发布时间】:2010-06-18 23:55:54
【问题描述】:

我正在尝试找出所有可以编写 javascript 的方法。我正在制作可接受标签的白名单,但是这些属性让我很着迷。

在我的富 html 编辑器中,我允许链接之类的内容。

<a href="">Hi </a>

现在我正在使用 html 敏捷包来摆脱我不支持的属性和 html 标记。

但是我仍然不清楚一个人是否可以做这样的事情

<a href="<script>alert('hi')</script>">Bad </a>

所以我不确定是否必须开始查看我支持的所有属性的内部文本并对它们进行 html 编码?或者如果是什么。

我也不确定如何防止 html 链接进入某个页面并在加载时启动一些 javascript。

我不确定白名单是否可以阻止它。

【问题讨论】:

  • 您展示的内容不应该工作,但href="javascript:alert('Hello!');" 是一种完全可以接受的嵌入 Javascript 的方式。
  • 是的,我真的不知道 java 脚本应该放在哪里,我只知道它可以放在那里。那么它还能放在我应该注意什么的地方呢?
  • 比如这些东西能进什么属性?它可以进入“id”属性或名称属性......等等。我不知道在哪里可以找到这些信息。
  • @Pekka:完全可以接受——这很常见。
  • @George,Common true,但现在不被接受

标签: javascript security html-agility-pack whitelist


【解决方案1】:
<a href="javascript:void(0)" onclick="alert('hi');">Bad</a>

或

<a href="javascript:alert('hi');">Bad</a>

【讨论】:

  • 啊!请人们停止将“#”作为执行 JavaScript 的链接的 href。请改用“javascript:void(0)”。这样点击链接时页面不会滚动到顶部。
  • @George:想解释一下原因吗?
  • @George - 我删除了它,但如果这是您最大的问题,您可以在 onclick 属性的末尾添加“return false”。
【解决方案2】:

如果您尝试为用户输入的 HTML 编写 XSS 验证器以用于生产,我强烈建议您使用现有的库。即使您采用白名单方法,也有很多很多可能的属性值会导致 XSS。在XSS Cheat Sheet 中搜索“javascript:”以查看各种 javascript: uris 可以出现的地方。这是一个不完整的列表:

<IMG SRC="javascript:alert('XSS');">
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');">
<BODY BACKGROUND="javascript:alert('XSS')">
<IMG LOWSRC="javascript:alert('XSS')">

也有注入外部脚本url的方法,像这样:

<XSS STYLE="behavior: url(xss.htc);">

如果您是为自己的教育而编写的,那么 XSS 备忘单为单元测试提供了一些非常好的素材。

【讨论】:

  • Naw 我不想使用 XSS 验证器...我会使用 asp.net mvc 附带的那个。我正在尝试创建一个白名单。
  • 哦,太好了 :) 但我认为备忘单仍然回答了你关于 JavaScript 编写方式的所有问题。
  • 嗯,我不确定如何处理这些情况。 UTF-8 Unicode编码一、十六进制编码、jav ascript、jav ascript。 Httml 敏捷包可以帮助我处理
  • 这些标签中的javascript这个词可以有任意数量的空格吗(即你可以有j空间a空间v空间a....
  • “javascript”中没有空格——但它可以是任何情况,并且在“javascript”前后都有空格(看起来像一些其他特殊字符)。
【解决方案3】:

你可以这样做:

<a href="javascript:(function(){
    alert('hello');
})()">Hello</a>

如果你真的想疯了

编辑: 我更喜欢这个

<a onclick="alert(eval({Crazy:function(){alert('Hello');return 'World';}}).Crazy());">
    Crazy
</a>

【讨论】:

  • 你可以把整个班级放在那里
  • 理论上您甚至可以导入外部 javascript 文件并访问页面上的几乎所有内容并将其发送到互联网上的任何地方。
  • 那么你如何通过白名单来阻止这种情况(我正在使用 html 敏捷包)而不只是不允许链接?
  • 使用正则表达式解析 href 属性并且只允许完全限定的链接。像 ^http(s)?://(www\.)?(\w+\.)?(\w+)\.(com)$ 这样的东西我知道这不完全正确,但我只是即时写的跨度>
  • 是的,这就是我实际使用的正则表达式,但显然我仍然需要担心 UTF-8 Unicode 编码、十六进制编码、jav ascript、jav ascript。所以我不知道如何处理它们。
猜你喜欢
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 2015-12-26
  • 2015-07-15
  • 1970-01-01
  • 2011-03-21
相关资源
最近更新 更多