• asp.netWebForm(.netFramework) CSRF漏洞


    asp.netWebForm(.netFramework) CSRF漏洞

    CSRF(Cross-Site Request Forgery)跨站请求伪造是一种常见的 Web 应用程序安全漏
    洞,攻击者通过诱使已认证用户在受信任的网站上执行恶意操作,从而利用用户的身份
    执行未经授权的操作。攻击者通常会在第三方网站上植入恶意代码或链接,当用户访问
    这些网站时,恶意请求会被发送到目标网站,利用用户的身份执行操作,如更改密码、
    转账等。CSRF 漏洞可能导致以下安全问题:未经授权的操作:攻击者可以利用 CSRF 漏
    洞执行未经授权的操作,如更改用户密码、删除账户等。数据篡改:攻击者可以通过
    CSRF 漏洞修改用户数据,如更改个人信息、发表恶意内容等。跨站脚本执行:攻击者
    可以通过 CSRF 漏洞执行跨站脚本(XSS)攻击,从而获取用户的敏感信息。

    解决方案:

    1、使用 CSRF 令牌:在每个请求中包含 CSRF 令牌,确保请求是合法的,防止攻击者伪
    造请求。
    需要安装Microsoft.AspNet.WebPages

           // 页面
           <input type="hidden" id="hiddenFieldToken" runat="server" />
           //页面加载事件
            protected void Page_Load(object sender, EventArgs e)
            {
    
                // 生成 CSRF Token
                string cookieToken, formToken;
                System.Web.Helpers.AntiForgery.GetTokens(null, out cookieToken, out formToken);
                hiddenFieldToken.Value = cookieToken + ":" + formToken;
            }
            //按钮提交
            protected void Btn_Click(object o, EventArgs e)
            {
                // 拆分存储的 Token
                string[] tokens = hiddenFieldToken.Value.Split(':');
                if (tokens.Length == 2)
                {
                    try
                    {
                        // 验证 CSRF Token
                        System.Web.Helpers.AntiForgery.Validate(tokens[0], tokens[1]);
                    }
                    catch (HttpAntiForgeryException)
                    {
                        // Token 验证失败
                        Response.Write("验证失败,可能是 CSRF 攻击!");
                        return;
                    }
                }
            }
    

    2、同源策略:确保网站遵循同源策略,限制第三方网站对用户数据的访问。

    方法1:在每个页面的 Page_Load 方法中添加如下代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        // 设置 Content-Security-Policy
        Response.Headers.Add("Content-Security-Policy", "default-src 'self';");
        // 设置 X-Frame-Options
        Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");
    }
    
    

    方法 2: 使用 HTTP 模块
    创建一个自定义 HTTP 模块是一种集中管理 HTTP 响应头的有效方法。这样可以在不修改每个页面的情况下,集中控制整个应用程序的 HTTP 头部设置。

    using System;
    using System.Web;
    
    public class SecurityHeadersModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(OnBeginRequest);
        }
    
        private void OnBeginRequest(object sender, EventArgs e)
        {
            HttpContext context = ((HttpApplication)sender).Context;
            // 设置 Content-Security-Policy
            context.Response.Headers.Add("Content-Security-Policy", "default-src 'self';");
            // 设置 X-Frame-Options
            context.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");
        }
    
        public void Dispose()
        {
            // 清理代码或释放资源
        }
    }
    
    

    配置文件注册HttpModule

    <configuration>
        <system.webServer>
            <modules>
                <add name="SecurityHeadersModule" type="YourNamespace.SecurityHeadersModule" />
            </modules>
        </system.webServer>
    </configuration>
    
    

    3、验证 HTTP Referer 头部:验证请求的来源,确保请求来自合法的网站。

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            Uri referrerUri = Request.UrlReferrer;
            if (referrerUri == null || !(referrerUri.Host.EndsWith("example.com") && referrerUri.Port == 8080))
            {
                Response.Write("非法请求来源!");
                Response.End();
            }
        }
    }
    
    
  • 相关阅读:
    计算机毕业设计Java淮安城市开放大学实习实训管理系统(源码+系统+mysql数据库+lw文档)
    洛谷P2312 秦九韶算法求多项式点值
    字符设备驱动详解
    nginx反向代理.NetCore开发的基于WebApi创建的gRPC服务
    powershell 执行策略
    说说HBase读、写流程
    《深度学习初探:使用TensorFlow和Keras构建你的第一个神经网络》
    Premint工具,作为普通人我们需要了解哪些内容?
    Vue3 京东到家项目实战第二篇(商家详情页面及购物车完整逻辑开发) 进阶式掌握vue3完整知识体系
    【流媒体】 通过ffmpeg硬解码拉流RTSP并播放
  • 原文地址:https://blog.csdn.net/qq_43893277/article/details/140281685