如何防止来自 ASP 的 XSS 攻击

Posted

技术标签:

【中文标题】如何防止来自 ASP 的 XSS 攻击【英文标题】:How to prevent XSS attack from the ASP 【发布时间】:2021-02-27 10:56:38 【问题描述】:

在我的应用程序中,在母版页中,我为 javascript 变量设置了如下值,

<%@ Master Language="C#" AutoEventWireup="True" CodeBehind="Master.master.cs" Inherits="Web.Common.Master" %>

<!DOCTYPE html>

<html>
<head runat="server">
    
</head>
<body class="hold-transition skin-blue sidebar-mini">
    <script type="text/javascript">
        var BRANCH_NAME = "<% =BranchName%>";
        var USER_ID = "<% =UserId %>";
    </script>
</body>
</html>

还有另一个页面来管理(输入)位置详细信息,当用户输入这种(";alert("s");")类型的易受攻击的脚本时,它会在整个应用程序中呈现为弹出窗口。浏览器响应如下,

我该如何处理这种类型的 XSS?输入分支名称时是这个句柄吗?或任何其他方式?请给我解决这个问题的想法。

【问题讨论】:

我不了解 ASP,但如果您有用户提供的值并且必须显示该值,则应始终在可视化之前对其进行转义。在这种情况下,假设您希望您的 BRANCH_NAME 仅包含字母、数字和 _,因此您可以添加一个正则表达式,在将 BranchName 变量分配给 BRANCH_NAME 之前修剪其他所有内容。 TLDR;没有什么神奇的方法可以阻止所有 XSS 攻击,因此您应该根据使用用户输入的位置来考虑它。 通常您会使用&lt;%: %&gt; 来转义用户可能会注入您的应用程序的&lt;script&gt; 标签。但是在这种情况下,您已经这样做了,所以聪明的用户已经知道了您。在这种情况下,使用隐藏字段并在您的 JS 中访问它们,这应该会阻止它。认为用户的每个输入都存在潜在的安全隐患。 @SalikRafiq 能否提供示例代码来解释您所说的内容 【参考方案1】:

这里有两个选择。

一个是检查所有用户输入是否有任何可疑之处。在您的情况下,这可能很困难,因为在大多数情况下,检查是针对 &lt;script&gt;&lt;embed&gt; 之类的内容,而这会遗漏诸如“警报”之类的内容,因为这是一个英文单词。

其次是确保所有输出都被转义。 这是我经验中最常见的解决方案。通常这是通过在控件中使用&lt;%: %&gt; 来完成的(&lt;%#: %&gt; 用于绑定控件)** ** 有一组控件不需要转义,例如:文本框

为了解决你上面的具体情况,不要相信用户输入。

使用隐藏字段并让 JS 访问它。

<body>
.
.
.
  <asp:hiddenfield id="hdnBRANCH_NAME" runat="server" value='<%# BranchName %>' />
  <asp:hiddenfield id="hdnUSER_ID" runat="server" value='<%# UserId %>'/>
.
.
<script>
   var branch_name = document.getElementById('<%= hdnBRANCH_NAME.ClientID%>').value;
   //similar for UserId
</script>

注意:您也可以从代码隐藏中分配隐藏字段。

【讨论】:

以上是关于如何防止来自 ASP 的 XSS 攻击的主要内容,如果未能解决你的问题,请参考以下文章

asp项目中如何防止xss攻击

PHP如何防止XSS攻击与XSS攻击原理

如何在 django 中防止 XSS 攻击

PHP如何防止XSS攻击

来自阿里云的PHP实现的防止跨站和xss攻击代码,测试有用

什么是CSRF攻击,如何预防