我的页面上有一个用户输入信用卡数据的表单。是否有可能在HTML中将表单的操作标记为常量以防止恶意JavaScript更改表单的action属性?我可以想象一个XSS攻击改变了表单URL,使用户将他们的秘密数据发布到攻击者的站点。
有可能吗?或者,Web浏览器中是否存在防止这类攻击发生的不同功能?
答案 0 :(得分:5)
这种攻击是可能的,但这是防止它的错误方法。如果黑客可以更改表单的详细信息,他们可以通过AJAX GET
轻松发送秘密数据,而无需提交表单。防止XSS攻击的正确方法是确保对页面上的所有不受信任的内容进行编码,以便黑客首先无法执行自己的JavaScript。
StackOverflow上的示例代码是一个很好的编码示例。想象一下,如果每次有人发布一些示例JavaScript,它实际上是在浏览器中执行的,那会是多么糟糕。如,
<script type="text/javascript">alert('foo');</script>
如果不是因为SO编码上面的片段,你会看到一个警告框。这当然是一个相当无害的脚本 - 我可以编写一些JavaScript来劫持你的会话cookie并将其发送到evil.com/hacked-sessions。然而,幸运的是,SO并不认为每个人都是出于好意,并且实际上对内容进行了编码。例如,如果您要查看源代码,您会看到SO已经将我完全有效的HTML和JavaScript编码为:
<script type="text/javascript">alert('foo');</script>
因此,我们不是在我使用它们的地方嵌入实际的<
和>
字符,而是将它们替换为HTML编码的等价物(<
和>
),这意味着我的代码不再代表脚本标记。
无论如何,这是编码背后的一般想法。有关 应该如何编码的更多信息,这取决于您在服务器端使用的内容,但大多数所有Web框架都包含某种“开箱即用”的HTML编码实用程序。您的责任是确保在呈现之前,用户提供的(或其他不受信任的)内容始终编码。
答案 1 :(得分:1)
网络浏览器中是否存在其他功能? 阻止这种攻击的发生?
此后,较新的浏览器版本通过新的Content-Security-Policy标头解决了您的担忧。
通过配置script-src,您可以直接禁止内联javascript。请注意,这种保护不一定会扩展到旧版浏览器上的用户(请参见CanIUse)。
仅允许使用带有白色标签的脚本,可以击败大多数javascript XSS攻击,但可能需要对内容进行重大修改。另外,如果您使用的网络框架严重依赖于内联JavaScript,则阻止内联javascript可能是不切实际的。
答案 2 :(得分:0)
没有什么可以真正阻止它。
我建议做的唯一事情就是从用户表单中获取任何来自服务器的信息的服务器端验证。
俗话说:永远不要相信用户