在 asp.net 中防止跨站点脚本攻击

prevent cross site scripting attack in asp.net

我在 asp.net 网络表单中有一个按编号搜索的页面。我想制作页面以防止任何跨站点脚本。

任何人都可以向我推荐最好的解决方案吗?

MSDN 文章 "How To: Prevent Cross-Site Scripting in ASP.NET" 对此进行了很多详细介绍。部分内容如下。


步骤总结
要防止跨站点脚本,请执行以下步骤:
第 1 步。检查 ASP.NET 请求验证是否已启用。
第 2 步。查看生成 HTML 输出的 ASP.NET 代码。
Step 3. 判断HTML输出是否包含输入参数
第 4 步。审查潜在的危险 HTML 标记和属性。
步骤 5. 评估对策。

第 1 步。检查 ASP.NET 请求验证是否已启用
默认情况下,请求验证在 Machine.config 中启用。验证当前在服务器的 Machine.config 文件中启用了请求验证,并且您的应用程序未在其 Web.config 文件中覆盖此设置。检查 validateRequest 是否设置为 true,如以下代码示例所示。

<system.web>
  <pages buffer="true" validateRequest="true" />
</system.web>

您可以逐页禁用请求验证。检查您的页面是否在必要时禁用此功能。例如,如果页面包含设计为接受 HTML 个字符作为输入的自由格式、富文本输入字段,您可能需要禁用该页面的此功能。有关如何安全处理此类页面的详细信息,请参阅步骤 5。评估对策。

测试 ASP.NET 请求验证是否已启用

  1. 创建禁用请求验证的 ASP.NET 页面。去做这个, 设置 ValidateRequest="false",如以下代码示例所示。

    <%@ 页面语言="C#" ValidateRequest="false" %> <html> <脚本运行="server"> void btnSubmit_Click(对象发送者, EventArgs e) { // 如果 ValidateRequest 为假,则显示 'hello' // 如果 ValidateRequest 为真,则 ASP.NET returns 异常 Response.Write(txtString.Text); } </脚本> <正文> <表单 id="form1" runat="server"> <asp:TextBox id="txtString" runat="server" Text="<script>alert('hello');</script>" /> <asp:按钮 id="btnSubmit" runat="server"<br> 点击="btnSubmit_Click" 文本="Submit" /> </表格> </body> </html>

    1. 运行 页面。它在消息框中显示 Hello,因为脚本 在 txtString 中传递并呈现为客户端脚本 你的浏览器。
    2. 设置 ValidateRequest="true" 或删除 ValidateRequest 页面属性并再次浏览到该页面。验证是否显示以下错误消息。

步骤 2. 查看生成 HTML 输出的 ASP.NET 代码
步骤 3. 确定 HTML 输出是否包含输入参数
分析您的设计和页面代码以确定输出是否包含任何输入参数。这些参数可以来自各种来源。以下列表包括常见的输入源:

Form fields, such as the following.
Response.Write(name.Text);
Response.Write(Request.Form["name"]);
Query Strings
Response.Write(Request.QueryString["name"]);

Query strings, such as the following:
Response.Write(Request.QueryString["username"]);

Databases and data access methods, such as the following:
SqlDataReader reader = cmd.ExecuteReader();
Response.Write(reader.GetString(1));

Be particularly careful with data read from a database if it is shared by other applications.
Cookie collection, such as the following:
Response.Write(
Request.Cookies["name"].Values["name"]);

Session and application variables, such as the following:
Response.Write(Session["name"]);
Response.Write(Application["name"]);

第 4 步。检查潜在危险 HTML 标记和属性 第 5 步。评估对策

(© 2015 微软,Terms of use)