防止HTML表单操作被更改

8
我页面上有一个表单,用户要输入他们的信用卡数据。在HTML中,是否可以将表单的操作标记为常量,以防止恶意JavaScript更改表单的操作属性?我可以想象一种XSS攻击,它会将表单URL更改为使用户将其秘密数据发布到攻击者的站点。
这种做法是否可行?或者,Web浏览器中是否有不同的功能可以防止发生此类攻击?

恶意JavaScript首先如何进入表单?支付表单是否允许显示用户提交的内容(XSS)?那将是一个不寻常的支付表单。 - Matthew Lock
3个回答

5
这种攻击是可能的,但这种方法并不可行。如果黑客可以改变表单的细节,他们就可以轻松地通过 AJAX GET 发送机密数据而无需提交表单。预防 XSS 攻击的正确方法是确保对页面上的所有不可信内容进行编码,这样黑客就没有能力首先执行他们自己的 JavaScript。
更多关于编码的信息...
StackOverflow 上的示例代码是编码的绝佳示例。想象一下,如果每次有人发布一些 JavaScript 示例,它实际上在浏览器中被执行了会出现什么状况。例如: <script type="text/javascript">alert('foo');</script> 如果 SO 没有对上述片段进行编码,您将只会看到一个警告框。当然,这只是一个相当无害的脚本 - 我可以编写一些劫持您会话 cookie 并将其发送到 evil.com/hacked-sessions 的 JavaScript。然而,SO 不会假设每个人都有善意,并且实际上编码了内容。例如,如果您查看源代码,则会发现 SO 已经将我的完全有效的 HTML 和 JavaScript 编码为以下内容: &lt;script type="text/javascript"&gt;alert('foo');&lt;/script&gt; 因此,它们已经使用其 HTML 编码的等效项(&lt;&gt;)替换了我使用它们的实际 <> 字符,这意味着我的代码不再表示一个脚本标记。
总之,这就是编码背后的一般思想。有关应该如何进行编码的更多信息取决于您正在使用的服务器端,但几乎所有 Web 框架都包括某种“开箱即用”的 HTML 编码实用程序。您的责任是确保在呈现之前始终对用户提供的(或其他不受信任的)内容进行编码。

1
“encode”这个词具体指什么?听起来很不错,但我不确定涉及哪些技术。 - Jonathan Wilson
@Michal - 向跨域服务器发送数据非常容易。您只需插入一个指向其他服务器的脚本标记,将脚本src = xxx"放置在脚本标记URL的查询参数中即可。这就是JSONP的工作原理,尽管在仅向其他服务器发送数据时不需要使用JSONP。 - jfriend00
@jmar777 - 你说得对。我同意预防XSS是最好的方法。我并不是想说我提出的功能应该用来保护免受那种攻击。我所考虑的是,当你不小心忘记编码JS时,这可能是一个很好的功能来防止发生那种攻击。只是一个双重检查。 顺便说一下,如果调用其他域名的URL仍然如此容易,为什么我们需要相同的源策略呢 :) - Michał Fronczyk
@Michał - 我能理解你想要提供一些“保险”的动机,以防你不小心忘记编码某些内容。我只是想强调,任何能够在你的页面中嵌入XSS攻击的黑客也能够绕过任何客户端保护措施。*(续...)* - jmar777
@Michał - 关于同源策略,是的,它绝对是必要的。你必须记住,同源策略的设计目的不是为了保护用户当前所在页面上的数据,而是为了保护用户之前访问过的页面上的数据。如果没有同源策略,例如,你可以创建一个脚本来执行针对该用户银行网站的安全操作,只要他们仍然有有效的会话。然而,只要银行在要求安全操作时勤勉地要求POST,用户就会得到保护。 - jmar777
显示剩余3条评论

1

网页浏览器中是否有不同的功能,可以防止此类攻击发生?

通过新的内容安全策略头信息,较新版本的浏览器已经解决了您的担忧。

通过配置script-src,您可以完全禁止内联JavaScript。请注意,此保护措施不一定会扩展到使用旧版浏览器的用户(请参见CanIUse)。

仅允许白标签脚本将击败大多数JavaScript XSS攻击,但可能需要对您的内容进行重大修改。此外,如果您使用依赖于内联JavaScript的Web框架,则阻止内联JavaScript可能是不切实际的。


0

没有什么可以真正防止它。

我唯一建议的是对来自用户表单的任何信息进行一些服务器端验证。

俗话说得好:永远不要相信用户


1
我认为这个问题更多是关于保护用户的。 - aziz punjani
保护用户?免受什么伤害? - Naftali
1
不知不觉中,他们可能认为自己将数据发布到了同一网站,但实际上数据被发送到了其他地方。 - Michał Fronczyk
@MichałFronczyk 我不知道有什么方法可以防止这种情况发生。 - Naftali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接