【ASP.NET Core 基础知识】--安全性--防范常见攻击

这篇具有很好参考价值的文章主要介绍了【ASP.NET Core 基础知识】--安全性--防范常见攻击。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在现实网络中即存在着安全的流量,又存在着不安全的流量在,这些不安全的流量常常会对我们的网站服务造成威胁,严重的甚至会泄露用户的隐私信息。这篇文章我们通过对常见的网络攻击跨站脚本攻击跨站请求伪造(CSRF)SQL注入敏感数据泄露身份验证与授权防范 方面讲解如何防范网络攻击。

一、跨站脚本攻击(XSS)防范

1.1 XSS攻击原理

跨站脚本攻击(XSS)利用了 web 应用程序未对用户输入进行充分验证和过滤的漏洞,攻击者通过在网页中注入恶意脚本,使其在用户的浏览器上执行。XSS 攻击的原理如下:

  1. 注入恶意脚本:攻击者将恶意代码注入到 web 页面的输入字段或参数中,例如输入框、URL 参数、表单提交等。这些注入点可以是用户可输入的文本、网址、表单数据等。
  2. 传递到服务器:用户提交包含恶意脚本的数据到服务器端。服务器端未对用户输入进行充分验证和过滤,而是将用户输入的数据直接嵌入到网页中,生成动态的网页内容。
  3. 注入到页面:当其他用户访问包含恶意脚本的页面时,服务器将恶意脚本发送给用户的浏览器,并且浏览器在渲染页面时执行了这些恶意脚本。
  4. 执行恶意操作:恶意脚本在用户的浏览器上执行,可以窃取用户的 Cookie、会话信息、个人数据,劫持用户的会话,篡改页面内容,甚至重定向到其他恶意网站等,从而危害用户隐私和安全。

XSS 攻击通常分为三种类型:

  • 存储型 XSS:恶意脚本被存储在服务器上,当其他用户访问包含恶意脚本的页面时,会触发执行。
  • 反射型 XSS:恶意脚本作为 URL 参数传递给服务器,服务器在响应中将恶意脚本反射给用户的浏览器执行,通常攻击链接需要诱使用户点击。
  • DOM 型 XSS:攻击者通过修改页面的 DOM 结构,直接在用户浏览器上执行恶意脚本,不经过服务器端。
1.2 ASP.NET Core中的XSS防御机制

在ASP.NET Core中,可以采取多种措施来防御跨站脚本(XSS)攻击。下面是一些常见的XSS防御机制及其在ASP.NET Core中的代码示例:

  1. 输入验证和过滤
    在接受用户输入之前,对输入数据进行验证和过滤,确保输入数据符合预期的格式和内容。

    [HttpPost]
    public IActionResult SubmitForm([FromBody] UserInputModel userInput)
    {
        // 使用 ASP.NET Core 内置的数据验证特性进行输入验证
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
    
        // 进一步验证和过滤用户输入
        userInput.Name = Sanitize(userInput.Name);
        userInput.Email = Sanitize(userInput.Email);
    
        // 处理用户输入数据
        // ...
    }
    
    private string Sanitize(string input)
    {
        // 实现输入过滤,移除或编码特殊字符
        return HtmlEncoder.Default.Encode(input);
    }
    
  2. 输出编码
    在将数据输出到网页上时,使用合适的编码方式,确保任何用户输入的内容都被正确地编码,防止恶意脚本被执行。

    @model string
    <p>@Html.DisplayForModel()</p>
    
    <script>
        var data = @Html.Raw(Json.Serialize(Model));
    </script>
    
  3. Content Security Policy (CSP)
    使用CSP可以定义允许加载哪些资源的策略,从而有效地防止XSS攻击。
    在Startup.cs中配置CSP:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // 添加CSP中间件
        app.Use(async (context, next) =>
        {
            context.Response.Headers.Add("Content-Security-Policy",
                "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval';");
            await next();
        });
    
        // 其他中间件配置
        // ...
    }
    

这些措施结合起来可以有效地防御大部分XSS攻击。同时,开发人员也应该保持对最新安全威胁的关注,并定期更新和优化安全防御措施。

二、跨站请求伪造(CSRF)防范

2.1 CSRF攻击原理

跨站请求伪造(CSRF)攻击利用了用户在已经认证的情况下向目标网站发送恶意请求的漏洞。攻击者诱使受害者在登录了目标网站的情况下点击了包含恶意请求的链接,或者在受害者登录目标网站的情况下访问了包含恶意请求的页面,从而使得目标网站误认为这些请求是合法的。CSRF攻击的基本原理如下:

  1. 用户认证:受害者在目标网站上进行认证,登录成功后获取了有效的会话凭证(比如Cookie)。
  2. 构造恶意请求:攻击者在另一个网站上创建一个包含恶意请求的页面或链接,并诱使受害者点击。
  3. 触发恶意请求:受害者点击了包含恶意请求的页面或链接,浏览器自动发送了请求,其中包含了目标网站的合法会话凭证。
  4. 执行恶意操作:目标网站误认为这是合法的请求,并执行其中包含的操作,比如转账、修改个人信息等。

CSRF攻击利用了目标网站对已认证用户的请求进行了过于宽松的信任,导致了用户在不知情的情况下执行了恶意操作。要防范CSRF攻击,通常需要采取一些措施,如使用CSRF令牌、同源检测等。

2.2 ASP.NET Core中的CSRF防御机制

在ASP.NET Core中,可以使用Antiforgery中间件和Antiforgery特性来防御跨站请求伪造(CSRF)攻击。下面是一个基本示例:

  1. 配置Antiforgery服务
    Startup.cs文件的ConfigureServices方法中添加Antiforgery服务配置:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAntiforgery(options =>
        {
            options.HeaderName = "X-CSRF-TOKEN"; // 自定义CSRF令牌的请求头名称
            options.Cookie.Name = "CSRF-TOKEN"; // 自定义CSRF令牌的Cookie名称
        });
    
        // 其他服务配置
        // ...
    }
    
  2. 使用Antiforgery中间件
    Startup.cs文件的Configure方法中添加Antiforgery中间件:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // 添加Antiforgery中间件
        app.Use(next => context =>
        {
            if (HttpMethods.IsPost(context.Request.Method))
            {
                var antiforgery = context.RequestServices.GetService<IAntiforgery>();
                var tokens = antiforgery.GetAndStoreTokens(context);
                context.Response.Cookies.Append("CSRF-TOKEN", tokens.RequestToken,
                    new CookieOptions { HttpOnly = false }); // 设置CSRF令牌的Cookie
            }
            return next(context);
        });
    
        // 其他中间件配置
        // ...
    }
    
  3. 在视图中使用Antiforgery特性
    在视图中使用@Html.AntiForgeryToken()来生成CSRF令牌,并将其包含在表单中:

    <form asp-action="Submit" asp-controller="Home">
        @Html.AntiForgeryToken()
        <!-- 其他表单字段 -->
        <button type="submit">提交</button>
    </form>
    
  4. 在控制器中验证CSRF令牌
    在接收POST请求的控制器方法上使用[ValidateAntiForgeryToken]特性来验证CSRF令牌:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Submit([FromBody] FormDataModel formData)
    {
        // 处理表单数据
        // ...
    }
    

通过这些措施,ASP.NET Core应用程序可以有效地防御CSRF攻击。

三、SQL注入防范

3.1 SQL注入攻击原理

SQL注入是一种利用应用程序对用户输入数据的不正确处理,以执行恶意SQL语句的攻击方式。攻击者通过在输入字段中插入恶意的SQL代码,使得应用程序在构造SQL查询语句时执行了攻击者预期的SQL代码,从而达到控制数据库、窃取数据或者执行其他恶意操作的目的。
SQL注入攻击的基本原理如下:

  1. 构造恶意输入:攻击者通过在应用程序的输入字段(比如登录表单、搜索框、URL参数等)中插入恶意的SQL代码,例如SQL查询语句的一部分。
  2. 构造恶意SQL查询:应用程序接收到了包含恶意输入的请求,将输入数据与SQL查询语句拼接在一起,构成一个恶意的SQL查询。
  3. 执行恶意SQL查询:应用程序执行了恶意的SQL查询,数据库服务器在没有对输入数据进行适当验证和过滤的情况下,将恶意输入的SQL代码当做正常的SQL查询来执行。
  4. 实现攻击目的:恶意SQL查询可能会导致数据库被篡改、数据泄露、用户信息窃取等恶意操作,从而实现了攻击者的目的。

SQL注入攻击利用了应用程序对用户输入数据的信任,攻击者通过插入恶意的SQL代码来绕过输入验证,从而对数据库执行恶意操作。要防范SQL注入攻击,开发人员应该采取适当的防御措施,如使用参数化查询、ORM框架、输入验证等。

3.2 ASP.NET Core中的SQL注入防御机制

在ASP.NET Core中,可以采取多种措施来防御SQL注入攻击。下面是一些常见的防御机制及其在ASP.NET Core中的代码示例:

  1. 使用参数化查询
    使用参数化查询可以将用户输入的数据作为参数传递给SQL查询,而不是直接拼接到SQL查询语句中,从而有效地防止SQL注入攻击。示例代码:

    [HttpGet]
    public IActionResult GetUser(string username)
    {
        string query = "SELECT * FROM Users WHERE Username = @username";
    
        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();
    
            var command = new SqlCommand(query, connection);
            command.Parameters.AddWithValue("@username", username);
    
            // 执行查询并处理结果
            // ...
        }
    }
    
  2. 使用ORM框架
    使用ORM(对象关系映射)框架如Entity Framework Core可以帮助开发人员避免直接操作SQL查询语句,框架会自动生成参数化查询,从而减少了SQL注入的风险。示例代码:

    [HttpGet]
    public IActionResult GetUser(string username)
    {
        var user = dbContext.Users.FirstOrDefault(u => u.Username == username);
        // 处理查询结果
        // ...
    }
    
  3. 输入验证
    在接收用户输入之前,进行有效的输入验证和过滤,确保用户输入的数据符合预期的格式和内容。示例代码:

    [HttpPost]
    public IActionResult CreateUser([FromBody] UserModel userModel)
    {
        if (string.IsNullOrWhiteSpace(userModel.Username) || string.IsNullOrWhiteSpace(userModel.Password))
        {
            return BadRequest("用户名和密码不能为空");
        }
    
        // 处理用户输入数据
        // ...
    }
    

通过这些措施,可以有效地防御大部分SQL注入攻击。此外,还应定期审查和更新应用程序的安全措施,以适应不断变化的安全威胁。

四、敏感数据泄露防范

4.1 敏感数据泄露的风险

敏感数据泄露是指组织或个人的敏感信息被未经授权的第三方获取、披露或使用的情况。这些敏感数据可能包括个人身份信息(如姓名、身份证号码、地址)、财务信息(如银行卡号、信用卡信息)、健康信息、商业机密等。敏感数据泄露可能会带来以下风险:

  1. 身份盗窃和欺诈:泄露的个人身份信息可能被恶意利用进行身份盗窃、欺诈等犯罪活动,导致个人财产损失和信用受损。
  2. 隐私侵犯:泄露的个人隐私信息可能被用于非法监视、跟踪或滥用,侵犯个人隐私权,给个人带来心理压力和困扰。
  3. 金融损失:泄露的财务信息(如银行卡号、信用卡信息)可能被用于未经授权的交易,导致个人或组织财产受损。
  4. 法律责任:根据相关的法律法规,组织对泄露敏感数据可能需要承担法律责任,面临巨额罚款、诉讼和声誉损失。
  5. 商业损失:泄露的商业机密可能被竞争对手获取,导致竞争劣势和市场份额下降,对组织造成经济损失。
  6. 信任和声誉受损:敏感数据泄露会破坏用户对组织的信任和声誉,降低用户对组织产品或服务的信心,从而影响组织的业务发展和长期利益。

为了降低敏感数据泄露的风险,组织和个人应采取适当的安全措施,包括加强数据加密、访问控制、网络安全、员工培训等,以确保敏感数据的保密性、完整性和可用性。同时,及时更新安全防护措施,提高安全意识和应对能力,是有效防范敏感数据泄露的关键。

4.2 ASP.NET Core中的敏感数据保护机制

在ASP.NET Core中,可以采取一些措施来保护敏感数据,包括数据加密、数据脱敏和访问控制等。下面是一些常见的敏感数据保护机制及其在ASP.NET Core中的代码示例:

  1. 数据加密
    使用加密算法对敏感数据进行加密,确保数据在存储和传输过程中都是安全的。

    // 加密
    string encryptedData = Encrypt(data, key);
    
    // 解密
    string decryptedData = Decrypt(encryptedData, key);
    
  2. 数据脱敏
    对于不必要的敏感数据,可以进行脱敏处理,例如只显示部分信息或者使用模糊化技术隐藏部分数据。

    // 脱敏
    string maskedData = MaskSensitiveData(data);
    
  3. 访问控制
    限制对敏感数据的访问权限,只允许授权用户或者角色访问,通过身份验证和授权来确保数据的安全性。

    [Authorize(Roles = "Admin")]
    public IActionResult ViewSensitiveData()
    {
        // 返回敏感数据
    }
    
  4. 使用安全的存储方式
    在存储敏感数据时,使用安全的存储方式,如加密存储、哈希存储等,确保数据的安全性和完整性。

    // 使用加密存储
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(connectionString, options =>
        {
            options.EnableSensitiveDataLogging(false);
            options.UseEncryption("MySecretKey");
        });
    }
    
  5. 防止敏感数据泄露
    加强网络安全和身份验证,防止敏感数据在传输过程中被窃取,采取安全措施防止SQL注入等攻击。

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult SubmitSensitiveData([FromBody] SensitiveDataModel sensitiveData)
    {
        // 处理敏感数据
        // ...
    }
    

通过这些措施,可以有效地保护ASP.NET Core应用程序中的敏感数据,确保数据的安全性和隐私性。

五、身份验证与授权防范

5.1 身份验证与授权的重要性

身份验证(Authentication)和授权(Authorization)在网络安全中扮演着至关重要的角色,它们是保护信息系统和资源免受未经授权访问的关键机制。它们的重要性体现在以下几个方面:

  1. 保护敏感信息:身份验证和授权可以确保只有经过验证和授权的用户才能访问敏感信息和受保护资源。这对于保护用户隐私和组织的商业机密至关重要。
  2. 防止未经授权的访问:通过身份验证,系统可以验证用户的身份并确认其访问请求的合法性,而授权则可以限制用户只能访问其有权限的资源,从而有效地防止未经授权的访问和攻击。
  3. 遵守法律法规:许多法律法规和行业标准要求组织对其系统中的用户进行身份验证,并且只有在授权的范围内才能访问敏感信息。通过实施适当的身份验证和授权机制,组织可以确保其合规性。
  4. 维护信任和声誉:良好的身份验证和授权机制可以提高用户对系统和组织的信任,因为用户知道他们的信息和资源得到了保护,这有助于维护组织的声誉。
  5. 减少数据泄露和损失:通过限制用户的访问权限,可以减少数据泄露和损失的风险。即使系统遭受攻击,攻击者也只能访问其被授权的资源,而不能访问敏感信息。
  6. 实现个性化和定制化服务:身份验证和授权机制可以帮助系统根据用户的身份和权限提供个性化和定制化的服务,从而提升用户体验和满意度。

身份验证和授权是构建安全可靠的信息系统的基础,它们不仅可以保护敏感信息和资源免受未经授权的访问,还可以帮助组织遵守法律法规、维护声誉、减少数据泄露和损失,并实现个性化的服务。因此,它们在网络安全中的重要性不可忽视。

5.2 ASP.NET Core中的身份验证与授权机制

在ASP.NET Core中,身份验证(Authentication)和授权(Authorization)是通过中间件和特性来实现的。下面是一个简单的示例,演示如何在ASP.NET Core中配置和使用基本的身份验证和授权机制:

  1. 配置身份验证服务
    Startup.cs文件的ConfigureServices方法中配置身份验证服务,例如使用基于Cookie的身份验证:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(options =>
            {
                options.LoginPath = "/Account/Login";
                options.AccessDeniedPath = "/Account/AccessDenied";
            });
    
        // 其他服务配置
        // ...
    }
    
  2. 配置授权策略
    Startup.cs文件的ConfigureServices方法中配置授权策略,例如定义一个要求用户必须具有特定角色的策略:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthorization(options =>
        {
            options.AddPolicy("RequireAdminRole", policy =>
                policy.RequireRole("Admin"));
        });
    
        // 其他服务配置
        // ...
    }
    
  3. 使用身份验证中间件
    Startup.cs文件的Configure方法中使用身份验证中间件:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseAuthentication();
        app.UseAuthorization();
    
        // 其他中间件配置
        // ...
    }
    
  4. 在控制器方法中应用授权策略
    在控制器方法上使用[Authorize]特性,并指定要求的授权策略:

    [Authorize(Policy = "RequireAdminRole")]
    public IActionResult AdminDashboard()
    {
        // 只有具有Admin角色的用户才能访问这个方法
        return View();
    }
    
  5. 执行身份验证
    在登录页面或其他需要验证的地方执行身份验证,例如登录页面:

    [HttpPost]
    public async Task<IActionResult> Login(LoginViewModel model)
    {
        // 执行身份验证逻辑
    
        // 成功验证后,使用SignInAsync方法进行登录
        await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
    
        // 登录成功后重定向到首页或其他页面
        return RedirectToAction("Index", "Home");
    }
    

通过以上步骤,你可以在ASP.NET Core中实现基本的身份验证和授权机制。当用户访问需要授权的资源时,系统会自动检查用户是否通过了身份验证,并且是否具有足够的授权。如果用户未经身份验证或者没有足够的授权,则系统会自动重定向到登录页面或者拒绝访问。

六、总结

文章通过介绍常见的网络安全威胁,如跨站脚本(XSS)、SQL注入、CSRF等,并提供了相应的防御机制和实践建议。文章首先明确了不同攻击类型的原理和风险,然后详细解释了在ASP.NET Core中如何应对这些攻击,包括输入验证、输出编码、Content Security Policy(CSP)等防御措施。此外,文章还强调了敏感数据泄露的严重性,并提出了相应的保护措施。总的来说,本文全面解析了ASP.NET Core中防范常见攻击的重要性和方法,为开发人员提供了有益的指导和实践经验。文章来源地址https://www.toymoban.com/news/detail-829541.html

到了这里,关于【ASP.NET Core 基础知识】--安全性--防范常见攻击的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ASP.NET Core 基础知识】--路由和请求处理--路由概念(一)

    在Web应用中,路由是一个至关重要的概念,它负责将用户的请求映射到相应的处理程序,以确保正确的页面或资源被呈现给用户。通过将用户请求与适当的处理程序关联起来,使得应用能够以有序和可维护的方式响应用户的操作。 一、ASP.NET Core路由基础 1.1 路由的定义和作用

    2024年01月19日
    浏览(72)
  • 【一文详解】知识分享:(ASP.Net Core基础学习及快速入门)

    .Net .NET是微软的一个开发平台,这个平台的一大特点就是跨语言性,不管是什么语言,c、c++、c#、F#、J#、vb等语言都可以用这个平台合作开发; .NET,它是微软创建的一个用于构建多种不同类型的应用程序的开发人员平台。 .NET 是一个广泛的术语,用于描述整个 Microsoft 的软件

    2024年02月01日
    浏览(67)
  • 【ASP.NET Core 基础知识】--依赖注入(DI)--什么是依赖注入

    依赖注入(Dependency Injection,简称DI)是一种设计模式,用于解耦和管理类之间的依赖关系。它的核心思想是将原本需要在代码中显式创建的依赖关系,交给外部容器进行控制和管理。 具体来说,依赖注入的实现方式是通过将依赖对象的创建和维护责任转移到外部容器中,使

    2024年01月23日
    浏览(64)
  • 【ASP.NET Core 基础知识】--MVC框架--Models和数据绑定

    Models和数据绑定在ASP.NET Core MVC中扮演着关键的角色,对于构建强大、灵活和可维护的Web应用程序至关重要。这一节我们就来讲一下。 一、Models 1.1 Models的定义和作用 在ASP.NET Core MVC中,Model是应用程序中用于表示数据结构和业务逻辑的一种抽象。Models充当了MVC(Model-View-Contr

    2024年01月23日
    浏览(56)
  • 【ASP.NET Core 基础知识】--中间件--什么是中间件

    本篇文章作为中间件单元的开篇文章,通过这篇文章可以了解什么是中间件、内置中间件的使用以及怎么创建自定义中间件。我们先来看一下中间件的角色、目的和重要性。 1. 角色 请求处理管道的构建块: 中间件是构成ASP.NET Core请求处理管道的基本组成部分。每个HTTP请求都

    2024年01月16日
    浏览(65)
  • 【ASP.NET Core 基础知识】--中间件--创建自定义中间件

    一、为什么需要自定义中间件 自定义中间件在ASP.NET Core中的应用主要有以下几个原因: 满足特定需求: 默认情况下,ASP.NET Core提供了许多内置的中间件来处理常见的任务,如身份验证、授权、静态文件服务等。然而,某些项目可能有特定的需求,需要定制化的处理流程,这

    2024年01月17日
    浏览(70)
  • 【ASP.NET Core 基础知识】--中间件--内置中间件的使用

    ASP.NET Core 中包含很多内置的中间件,我们不可能对每一个内置的中间件进行一一讲解,并且中间件的使用步骤大致一样,因此本文讲解几个常用的内置中间件以及使用中间件的步骤,希望读者们可以举一反三。 一、内置中间件的介绍 1.1 静态文件中间件 在ASP.NET Core中,静态

    2024年01月17日
    浏览(65)
  • 【ASP.NET Core 基础知识】--最佳实践和进阶主题--微服务和容器化

    Tip:想要了解并学习微服务和容器化的知识,请跳转到《Docker极简教程》 一、微服务概述 1.1 什么是微服务? 微服务(Microservices)是一种软件架构风格,其中软件系统被划分为一组小型、自治的服务单元,这些服务单元围绕着业务能力进行组织,并通过轻量级的通信机制相

    2024年02月19日
    浏览(66)
  • net core基础知识(一)

    特性 跨平台   Web API和MVC技术的统一  原生依赖的注入支持 更强的测试性 轻量、高性能的模块 开源、有社区的支持   项目入口--Main Asp.Net Core应用程序最初作为控制台应用程序启动,而Program.cs文件中的Main()方法就是入口 CreateHostBuilder()方法返回一个实现IHostBuilder的对象,

    2024年02月12日
    浏览(46)
  • 云计算:云计算安全性有哪些?_云计算技术的安全性,这些知识你必须拿下

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新网络安全全套学习资料》

    2024年04月23日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包