ASP.NET Core 防止跨站请求伪造(XSRF\/CSRF)攻击

什么是反伪造攻击?

跨站点请求伪造(也称为XSRF或CSRF,发音为see-surf)是对Web托管应用程序的攻击,因为恶意网站可能会影响客户端浏览器和浏览器信任网站之间的交互。这种攻击是完全有可能的,因为Web浏览器会自动在每一个请求中发送某些身份验证令牌到请求网站。这种攻击形式也被称为 一键式攻击 或 会话控制 ,因为攻击利用了用户以前认证的会话。

CSRF攻击的示例:

  1. 用户登录 www.example.com,使用表单身份验证。

  2. 服务器对用户进行身份验证,并作出包含身份验证Cookie的响应。

  3. 用户访问恶意网站。
    恶意网站包含类似于以下内容的HTML表单:

        <h1>You Are a Winner!</h1><form action="http://example.com/api/account" method="post"><input type="hidden" name="Transaction" value="withdraw" /><input type="hidden" name="Amount" value="1000000" /><input type="submit" value="Click Me"/></form>

    请注意,表单的Action属性将请求发送到易受攻击的网站,而不是恶意网站。这是CSRF的“跨站点”部分。

  4. 用户点击提交按钮,浏览器会自动包含请求站点(在这种情况下为易受攻击的站点)的认证Cookie。

  5. 请求在拥有用户身份验证上下文的服务端运行,并且可以执行允许经过身份验证用户执行的任何操作。

此示例需要用户单击表单按钮,恶意页面也可以通过以下方式:

  • 自动运行提交表单的脚本。

  • 通过AJAX请求发送表单提交。

  • 通过CSS隐藏的表单。

使用SSL不能阻止CSRF攻击,恶意网站可以发送https://请求。

针对GET请求站点的攻击,可以使用Image元素来执行(这种形式的攻击在允许图片的论坛网站上很常见)。使用GET请求更改应用程序状态更容易受到恶意攻击。

因为浏览器将所有相关的Cookie发送到目标网站,所以可以针对使用Cookie进行身份验证的网站进行CSRF攻击。然而,CSRF攻击并不仅限于利用Cookie,例如,Basic和Digest身份验证也很脆弱。用户使用Basic或Digest身份验证登录后,浏览器将自动发送凭据,直到会话(Session)结束。

注意:在这本文中,Session是指用户进行身份验证的客户端会话。它与服务器端会话或Session中间件无关。

用户可以通过以下方式防范CSRF漏洞:

  • 网站使用完毕后,注销会话。

  • 定期清理浏览器的Cookie。

然而,CSRF漏洞根本上是Web应用程序的问题,而不是依靠用户来解决。

ASP.NET Core MVC是如何处理CSRF的?

警告:
ASP.NET Core使用 ASP.NET Core data protection stack 来实现防请求伪造。如果在服务器集群中必配置 ASP.NET Core Data Protection,有关详细信息,请参阅 Configuring data protection。

在ASP.NET Core MVC 2.0中,FormTagHelper为HTML表单元素注入防伪造令牌。例如,Razor文件中的以下标记将自动生成防伪令牌:

        <form method="post"><!-- form markup --></form>

在以下情况为HTML格式元素自动生成防伪令牌:

  • form标签包含method="post"属性

    • action属性为空( action="") 或者

    • 未提供action属性(<form method="post">)。

您可以通过以下方式禁用自动生成HTML表单元素的防伪令牌:

  • 明确禁止asp-antiforgery,例如

        <form method="post" asp-antiforgery="false"></form>
  • 通过使用标签帮助器! 禁用语法,从标签帮助器转化为表单元素。

        <!form method="post"></!form>
  • 在视图中移除FormTagHelper,您可以在Razor视图中添加以下指令移除FormTagHelper
    html @removeTagHelper Microsoft.AspNetCore.Mvc.TagHelpers.FormTagHelper, Microsoft.AspNetCore.Mvc.TagHelpers

提示:
Razor页面会自动受到XSRF/CSRF的保护。您不必编写任何其他代码,有关详细信息,请参阅XSRF/CSRF和Razor页面。

防御CSRF攻击的最常见方法是令牌同步模式(STP)。STP是当用户请求表单数据页面时使用的技术。服务器将与当前用户的标识相关联的令牌发送给客户端。客户端将令牌发回服务器进行验证。如果服务器接收到与验证用户身份不匹配的令牌,则该请求将被拒绝。令牌是唯一的,并且是不可预测的。令牌也可用于确保一系列请求的正确顺序(确保页面1在第2页之前,页面2在第3页之前)。ASP.NET Core MVC模板中的所有表单都会生成防伪令牌,以下两个示例演示在视图逻辑中生成防伪令牌:

        <form asp-controller="Manage" asp-action="ChangePassword" method="post"></form>@using (Html.BeginForm("ChangePassword", "Manage")){}

您可以在不使用HTML标签助手的情况下,向<form>元素显式添加防伪令牌@Html.AntiForgeryToken

        <form action="/" method="post">@Html.AntiForgeryToken()        </form>

在前面的例子中,ASP.NET Core将添加一个隐藏的表单字段,类似于以下内容:

        <input name="__RequestVerificationToken" type="hidden" value="CfDJ8NrAkSldwD9CpLRyOtm6FiJB1Jr_F3FQJQDvhlHoLNJJrLA6zaMUmhjMsisu2D2tFkAiYgyWQawJk9vNm36sYP1esHOtamBEPvSk1_x--Sg8Ey2a-d9CV2zHVWIN9MVhvKHOSyKqdZFlYDVd69XYx-rOWPw3ilHGLN6K0Km-1p83jZzF0E4WU5OGg5ns2-m9Yw" />

ASP.NET Core 包括三个过滤器用于防伪令牌的运行:ValidateAntiForgeryTokenAutoValidateAntiforgeryToken和 IgnoreAntiforgeryToken

ValidateAntiForgeryToken

ValidateAntiForgeryToken是一个可应用于单个Action、控制器或全局的操作过滤器。请求必须包含一个有效的令牌,否则对具有该过滤器Action的请求将被阻止。

        [HttpPost][ValidateAntiForgeryToken]        public async Task<IActionResult> RemoveLogin(RemoveLoginViewModel account)        {ManageMessageId? message = ManageMessageId.Error;            var user = await GetCurrentUserAsync();            if (user != null){                var result = await _userManager.RemoveLoginAsync(user, account.LoginProvider, account.ProviderKey);                if (result.Succeeded){                    await _signInManager.SignInAsync(user, isPersistent: false);message = ManageMessageId.RemoveLoginSuccess;}}            return RedirectToAction(nameof(ManageLogins), new { Message = message });}

ValidateAntiForgeryToken特性标记的Action方法需要一个令牌,包括HTTP GET请求。如果您全局使用,您可以使用IgnoreAntiforgeryToken特性来覆盖它。

AutoValidateAntiforgeryToken

ASP.NET Core应用程序通常不会为HTTP安全方式(GET,HEAD,OPTIONS和TRACE)生成防伪令牌,而不是在全局范围内使用ValidateAntiForgeryToken特性,然后用IgnoreAntiforgeryToken特性覆盖它,您可以使用AutoValidateAntiforgeryToken特性。该特性与ValidateAntiForgeryToken特性相似,但对以下HTTP请求方式不需要请求令牌:

  • GET

  • HEAD

  • OPTIONS

  • TRACE

我们建议您在非API场景中广泛使用AutoValidateAntiforgeryToken。这确保您的POST Action 默认受保护。另一种方式是在默认情况下忽略反伪造令牌,除非在个别Action方法标记了ValidateAntiForgeryToken特性,不过在这种情况下,POST Action方法有可能不受保护,使您的应用程序容易受到CSRF攻击。即使匿名的POST请求也应该发送防伪令牌。

注意:API没有自动机制来发送非Cookie的令牌;您的实现可能取决于您的客户端代码的实现。

一些例子如下所示。

示例(控制器级别):

        [Authorize][AutoValidateAntiforgeryToken]      
       public class ManageController : Controller        {

示例(全局)

            services.AddMvc(options => options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()));

IgnoreAntiforgeryToken

IgnoreAntiforgeryToken过滤器用于取消已经使用防伪标记的Action(或控制器)的需求。应用时,此过滤器将覆盖在更高级别(全局或控制器)上指定的过滤器ValidateAntiForgeryToken和/或AutoValidateAntiforgeryToken过滤器。

        [Authorize][AutoValidateAntiforgeryToken]     
       public class ManageController : Controller{[HttpPost][IgnoreAntiforgeryToken]          
        public async Task<IActionResult> DoSomethingSafe(SomeViewModel model)            {                // no antiforgery token required
        }}

JavaScript,AJAX和SPA(单页应用程序)

在传统基于HTML的应用程序中,使用隐藏的表单字段将防伪令牌发送到服务器。在当前基于JavaScript的应用程序和单页应用程序(SPA)中,许多请求以编程方式进行。这些AJAX请求可能会使用其它技术(如请求头或Cookie)来发送令牌。如果使用Cookie来存储身份验证令牌,并在服务器上验证API请求,那么CSRF将是一个潜在的问题,但是,如果使用本地存储来存储令牌,那么CSRF漏洞可能会被减轻,因为本地存储的值不会在每个请求时自动发送到服务器。因此,使用本地存储将反伪造令牌存储在客户机上,并将令牌作为请求头发送,这是一种推荐的方式。

AngularJS

AngularJS通过约定来解决CSRF。如果服务器发送带有名称为XSRF-TOKEN的Cookie ,则Angular的$http服务将向该服务器发送的请求将该Cookie的值添加到请求头。这个过程是自动的,您不需要明确设置请求头。请求头的名称是X-XSRF-TOKEN,服务器会检测该请求头并验证其内容。

对于ASP.NET Core API,使用此约定:

  • 配置您的应用程序,在一个Cookie中提供一个称为XSRF-TOKEN的令牌;

  • 配置防伪服务查找名为X-XSRF-TOKEN的请求头。

            services.AddAntiforgery(options => options.HeaderName = "X-XSRF-TOKEN");

查看示例。

JavaScript

在视图中使用JavaScript,您可以在视图中使用服务创建令牌,您将Microsoft.AspNetCore.Antiforgery.IAntiforgery服务注入视图并调用GetAndStoreTokens,如下所示:

@{ViewData["Title"] = "AJAX Demo";
}
@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf
@functions{public string GetAntiXsrfRequestToken(){return Xsrf.GetAndStoreTokens(Context).RequestToken;}
}<h2>@ViewData["Title"].</h2><h3>@ViewData["Message"]</h3><div class="row"><input type="button" id="antiforgery" value="Antiforgery" /><script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js"></script><script>                $("#antiforgery").click(function () {                    $.ajax({                        type: "post",                        dataType: "html",                        headers:                        {                            "RequestVerificationToken": '@GetAntiXsrfRequestToken()'                        },                        url: '@Url.Action("Antiforgery", "Home")',                        success: function (result) {                            alert(result);                        },                        error: function (err, scnd) {                            alert(err.statusText);                        }                    });                });    </script></div>

这种方法无需在服务器设置Cookie或从客户端读取Cookie。

JavaScript还可以访问Cookie中提供的令牌,然后使用Cookie的内容创建带有令牌值的请求头,如下所示。

            context.Response.Cookies.Append("CSRF-TOKEN", tokens.RequestToken, new Microsoft.AspNetCore.Http.CookieOptions { HttpOnly = false });

然后,假设您构建的脚本发送的请求,将令牌发送为一个名为X-CSRF-TOKEN的请求头中,请配置防伪服务以查找X-CSRF-TOKEN请求头:

            services.AddAntiforgery(options => options.HeaderName = "X-CSRF-TOKEN");

以下示例使用jQuery来创建一个包含相应请求头AJAX请求:

var csrfToken = $.cookie("CSRF-TOKEN");$.ajax({url: "/api/password/changepassword",contentType: "application/json",data: JSON.stringify({ "newPassword": "ReallySecurePassword999$$$" }),type: "POST",headers: {"X-CSRF-TOKEN": csrfToken    }});

配置防伪

IAntiforgery提供API来配置防伪系统。它可以在Startup类的Configure方法中使用。以下示例在应用程序的主页生成防伪令牌,并将其作为Cookie发送到响应中(使用上述默认命名约定):

    public void Configure(IApplicationBuilder app, IAntiforgery antiforgery)        {app.Use(next => context =>{                string path = context.Request.Path.Value;                if ( string.Equals(path, "/", StringComparison.OrdinalIgnoreCase) || string.Equals(path, "/index.html", StringComparison.OrdinalIgnoreCase)){                    // We can send the request token as a JavaScript-readable cookie, // and Angular will use it by default.var tokens = antiforgery.GetAndStoreTokens(context);context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken,  new CookieOptions() { HttpOnly = false });}                return next(context);});}

选项

您可以在ConfigureServices方法中定制防伪选项:

        services.AddAntiforgery(options => {options.CookieDomain = "mydomain.com";options.CookieName = "X-CSRF-TOKEN-COOKIENAME";options.CookiePath = "Path";options.FormFieldName = "AntiforgeryFieldname";options.HeaderName = "X-CSRF-TOKEN-HEADERNAME";options.RequireSsl = false;options.SuppressXFrameOptionsHeader = false;});
选项描述
CookieDomainCookie的域名。默认为null
CookieNameCookie的名称。如果未设置,系统将生成一个以DefaultCookiePrefix(".AspNetCore.Antiforgery")开头的唯一名称。
CookiePathCookie设置的路径。
FormFieldName在视图中隐藏表单字段的名称。
HeaderName防伪系统使用的请求头的名称。如果null,系统将仅使用表单数据。
RequireSsl指定防伪系统是否需要SSL。默认为false。如果为true,非SSL请求会失败。
SuppressXFrameOptionsHeader指定是否禁止X-Frame-Options响应头的生成。默认情况下,响应头生成的值为“SAMEORIGIN”。默认为false

有关详细信息,请参阅 https://docs.microsoft.com/aspnet/core/api/microsoft.aspnetcore.builder.cookieauthenticationoptions。

扩展防伪

IAntiForgeryAdditionalDataProvider类型允许开发者扩展anti-XSRF系统的行为,在每个令牌中的增加额外数据。每次创建令牌时会调用GetAdditionalData方法,并且返回的值被嵌入生成的令牌内。实现者可以返回时间戳、随机数或任何其它值,然后在验证令牌时调用ValidateAdditionalData来验证此数据。客户的用户名已经嵌入到生成的令牌中,因此不需要包含此信息。如果令牌包含补充数据但没有配置IAntiForgeryAdditionalDataProvider,则补充数据不被验证。

常用场景

CSRF攻击依赖于浏览器默认行为,向站点发出请求同时,会发送与站点相关联的Cookie。这些Cookies存储在浏览器中,它们经常用于经过身份验证的用户提供会话Cookie。基于Cookie的身份验证是一种非常流行的身份验证模式。基于令牌的认证系统越来越受欢迎,特别是对于SPA和其它“智能客户端”场景。

基于Cookie的身份验证

一旦用户使用他们的用户名和密码进行身份验证,就会发出一个令牌,用于标识它们并验证它们是否经过身份验证。令牌存储为Cookie,客户端所做的每个请求都会附带令牌。生成和验证此Cookie是由Cookie身份验证中间件完成的。ASP.NET Core提供了将用户主体序列化为加密Cookie的Cookie 中间件,然后在随后的请求中验证Cookie,重新创建主体并将其分配给HttpContextUser属性。

当使用Cookie时,身份验证Cookie只是表单身份验证凭证的一个容器。在每个请求中,票据作为的表单认证Cookie的值传递并通过表单身份验证,在服务端,以标识经过身份验证的用户。

当用户登录到系统时,会在服务器端创建用户会话,并将其存储在数据库或其他持久存储中,系统生成指向数据存储中的会话密钥,并将其作为客户端Cookie发送。每当用户请求需要授权的资源时,Web服务器将检查此会话密钥,系统检查关联的用户会话是否具有访问请求的资源的权限。如果是,请求继续;否则,请求返回为未授权。在这种方法下,Cookie的使用,使应用程序看起来是有状态的,因为它能够“记住”用户以前已经在服务端完成了身份验证。

用户令牌

基于令牌的身份验证不会在服务器上存储会话。相反,当用户登录时,将颁发令牌(不是防伪令牌)。该令牌保存验证令牌所需的所有数据,它还包含用户信息,以claims的形式。当用户想要访问需要身份验证的服务器资源时,会使用 Bearer {token} 形式的附加授权头发送令牌给服务器。这使得应用程序无状态,因为在每个后续请求中,令牌在请求中传递给服务器端验证。该令牌未 加密 , 而是 编码 。在服务器端,令牌可以被解码以访问令牌内的原始信息。要在随后的请求中发送令牌,您可以将其存储在浏览器的本地存储或Cookie中。如果您的令牌存储在本地存储中,则不必担心XSRF漏洞,但如果令牌存储在Cookie中,则会出现问题。

多个应用程序托管在一个域中

即使example1.cloudapp.netexample2.cloudapp.net是不同的主机,在.cloudapp.net域内的所有主机之间存在一种隐式信任关系。这种隐式信任关系允许潜在的不受信任的主机影响彼此的Cookie(管理AJAX请求的同源策略不一定适用于HTTP Cookie)。ASP.NET Core运行时提供了一些缓解,用户名被嵌入到字段令牌中,因此即使恶意子域能够覆盖会话令牌,它将无法为用户生成有效的字段令牌。然而,当托管在这样的环境中,内置的反XSRF例程仍然无法防止会话劫持或登录CSRF攻击。共享主机环境对会话劫持、登录CSRF和其它攻击都是不可控制的。

其他资源

  • XSRF on Open Web Application Security Project (OWASP)。

原文:《Preventing Cross-Site Request Forgery (XSRF/CSRF) Attacks in ASP.NET Core》https://docs.microsoft.com/en-us/aspnet/core/security/anti-request-forgery
翻译:Sweet Tang

相关文章: 

  • .NET Core 2.0 正式发布信息汇总

  • .NET Standard 2.0 特性介绍和使用指南

  • .NET Core 2.0 的dll实时更新、https、依赖包变更问题及解决

  • .NET Core 2.0 特性介绍和使用指南

  • Entity Framework Core 2.0 新特性

  • 体验 PHP under .NET Core

  • .NET Core 2.0使用NLog

  • 升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署

  • 解决Visual Studio For Mac Restore失败的问题

  • ASP.NET Core 2.0 特性介绍和使用指南

  • Entity Framework Core 2.0 全局查询过滤器

  • Entity Framework Core 2.0 特性介绍和使用指南

  • ASP.NET Core Razor页面 vs MVC

  • Razor Page–Asp.Net Core 2.0新功能  Razor Page介绍

  • MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例

  • .NET Core 2.0迁移技巧之web.config配置文件

本文地址:http://www.cnblogs.com/tdfblog/p/aspnet-core-security-anti-request-forgery.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汇编语言(二十四)之输出n行星号

输入一个数n&#xff0c;输出n行星号 程序运行&#xff1a; 代码&#xff1a; datas segmentline_number_max_len db 0ffhline_number db 0, 100h dup(?)input_line_number_prompt db input line number:$output db 0dh,0…

家的味道,家的感觉!!!

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”国庆期间回了一趟家&#xff0c;上次从家里出来还是2020年正月的时候&#xff0c;因为疫情的原因&#xff0c;21年过年没有回去……早早的就买下回家的票&#xff0c;以前回家一趟&…

POJ3889-Fractal Streets【分形,递归,分治】

正题 题目链接&#xff1a;http://poj.org/problem?id3889 大意 第一级城市为图一&#xff0c;然后每次扩展一级就将原本的城市复制3份&#xff0c;一份放上面&#xff0c;一份正旋90’放左上&#xff0c;一份逆序90’放左边&#xff0c;最后将4份的头和尾连起来&#xff0c;…

.NET Core 2将Visual Basic带到了Linux和macOS平台

Microsoft已经愈加接近将Visual Basic划为.NET Core平台上的一等公民。作为.NET Core 2发行版的一部分&#xff0c;VB开发者现在可以编写针对.NET Standard 2.0的控制台应用程序和类库&#xff0c;并且可以兼容多个平台。这就意味着运行在Windows上的可执行文件或者类库也能够运…

汇编语言(二十五)之成绩分段统计

已知一个班的成绩&#xff0c;进行60,70,80,90,100分段统计 程序运行&#xff1a; 代码&#xff1a; datas segmentstudents_number dw 10students dw 76,69,84,90,73,88,99,63,100,80s6 dw 0hs7 dw 0hs8 dw 0hs9 dw 0hs10 dw 0houtput…

感动哭了……

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”一大早就好多人送祝福&#xff0c;感动不已~下课看手机之后&#xff0c;看到手机上有条消息&#xff0c;是认识好多年好多年的大姐发的&#xff1a;“小穆&#xff0c;今天你生日&…

汇编语言(二十六)之自然数求和

输入一个数N&#xff0c;对1到N的所有自然数求和 程序运行&#xff1a; 代码&#xff1a; datas segmentN_string_max_length db 0ffhN_string db 0, 100h dup(?)N dw 0 sum dd 0 input db …

同学们,看看这里吧!!!

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。恶”早上一进班&#xff0c;发现班内少了好几个学生&#xff0c;一想肯定是这几个熊孩子又违纪被王老师喊去了…自从这些孩子入学以来&#xff0c;大事小事不断的去犯&#xff0c;尤其是…

Oleans集群之Consul再解释

由于上周发文章的时候,我正要打算出门,所以就把写好的全部发出去了,有点仓促,虽然写了主线,但是这里还是需要再次解释一下. 我看到Orleans已经升级到了1.5.1了,(nuget上的官方发布),于是我就把Orleans升级到了1.5.1,顺便把net更改到了4.7版本. 再升级的时候,注意有几个依赖库…

别在被骗了!!!!!!

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”今天&#xff0c;在身边又发生了一起诈骗案&#xff0c;被骗金额达5000余元在&#xff0c;就像佟老师说的一样&#xff0c;骗子可是一点人性都没有……大致的看了看具体细节&#xff0…

汇编语言(二十七)之身份证最后一位求和校验

输入身份证前十七位数字&#xff0c;输入18位身份证 程序运行&#xff1a; 代码&#xff1a; datas segmentw db 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2y db 1,0,X,9,8,7,6,5,4,3,2ID_max_length db 18ID db 0, 19 dup(?)input …

C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码

我记得,之前在写安卓方面的文章的时候,有人就问过我.Xamarin.Android为什么打包出来这么大?随便一个HelloWord就20-30MB? 嗯..今天我们就来解决这个问题.. 我们先从指定一个应用程序图标开始.. 1.指定应用程序图标 我们直接右键Android项目,属性.选择安卓清单.如下: 在Ap…

vue中设置子组件的点击事件不影响父组件的点击事件

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”今天分享个技术块儿。在做项目的过程中&#xff0c;遇到了个问题&#xff0c;简单的描述一下&#xff1a;有一个card卡片&#xff0c;上面绑定了个点击事件&#xff0c;点击card卡片&a…

一个还算简单的微信消息SDK(基于.Net Standard 2.0)

虽然微信公众号出现了好久&#xff0c;不过在SDK这件事情上感觉并没有多少人把它当成一个有技术含量的事情来做&#xff0c;很多SDK做的事情就是一个代码的堆叠&#xff0c;当然也可能写的好的并没有开源出来。所以在某个翻遍github而无所获的下午我写了一个基础的基于事件的微…

汇编语言(二十八)之统计单词

输入一行字符串&#xff0c;统计单词SUN出现的个数 程序运行&#xff1a; 代码&#xff1a; datas segmentENG_max_length db 0ffhENG_length db 0ENG db 100h dup(?)eng_len dw 0SUN db SUNsun_len dw $-SUNcount dw 0…

这可能就是写代码的乐趣吧,你,也一定会爱上写代码的!

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”现在是&#xff1a;2021年10月23日22:02:41。于我来说&#xff0c;最感兴趣的莫过于上课和写代码了。最近一下在做一个项目&#xff0c;可能是前期数据库设计的不是很好&#xff0c;导…

汇编语言(二十九)之数值的二进制和十进制

给定一个数&#xff0c;输出该数的二进制和十进制数 程序运行&#xff1a; 代码&#xff1a; datas segmentVAL1 dw 156datas endsstacks segment stackdb 100h dup(?)stacks endscodes segmentassume cs:codes,ds:datas,ss:stacks BANDO proc far start:push dsmov ax,0…

ASP.NET Core MVC – Tag Helper 组件

ASP.NET Core Tag Helpers系列目录&#xff0c;这是第五篇&#xff0c;共五篇&#xff1a; ASP.NET Core MVC – Tag Helpers 介绍ASP.NET Core MVC – Caching Tag HelpersASP.NET Core MVC – Form Tag HelpersASP.NET Core MVC – 自定义 Tag HelpersASP.NET Core MVC – T…

vue+elementui中,el-select多选下拉列表中,如何同时获取:value和:label的值?

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 项目场景&#xff1a; 正如题目所说&#xff0c;今天在项目过程中遇到了个需求&#xff0c;因为需要在前台展示运动员的名称&#xff0c;但是运动员的编号在别的地方还需要使用&#xff…

C#使用Xamarin开发可移植移动应用进阶篇(9.混淆代码,防止反编译)

嗯,既然是客户端应用,自然而然就需要一些防止源码泄漏的手段.通过C#编写的APP,完全是可以直接解压APK,然后得到里面的DLL然后进行反编译的.. 如下图: 嗯..这样就会造成代码泄漏.. 下面就介绍一下,如何使用VS自带的Dotfuscator来进行混淆代码. 1.安装Dotfuscator 打开VS2017…