admin 管理员组文章数量: 887021
2024年2月24日发(作者:用html设置年月日)
URL编码
百科名片
url编码是一种浏览器用来打包表单输入的格式。
目录
定义
编码规则
URL编码表
防止sql注入
使用举例
定义
编码规则
URL编码表
防止sql注入
使用举例
展开
定义
url编码是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送的字符, 将数据排行等等)作为URL的一部分或者分离地发给服务器。不管哪种情况, 在服务器端的表单输入格式样子象这样:
theName=Ichabod+Crane&gender=male&status=missing& ;headless=yes
编码规则
URL编码遵循下列规则: 每对name/value由&符分开;每对来自表单的name/value由=符分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值。任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =, &, 和 % 这些特殊的字符。其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“”,它的ascii码是92,92的十六进制是5c,所以“”的url编码就是%5c。那么汉字的url编码呢?很
简单,看例子:“胡”的ascii码是-17670,十六进制是BAFA,url编码是“%BA%FA”。
URL编码表
backspace %08
tab %09
linefeed %0A
creturn %0D
space %20
! %21
" %22
# %23
$ %24
% %25
& %26
' %27
( %28
) %29
* %2A
+ %2B
, %2C
- %2D
. %2E
/ %2F
0 %30
1 %31
I %49
J %4A
K %4B
L %4C
M %4D
N %4E
O %4F
P %50
Q %51
R %52
S %53
T %54
U %55
V %56
W %57
X %58
Y %59
Z %5A
[ %5B
%5C
] %5D
^ %5E
v %76
w %77
x %78
y %79
z %7A
{ %7B
| %7C
} %7D
~ %7E
¢ %A2
£ %A3
¥ %A5
| %A6
§ %A7
« %AB
¬ %AC
ˉ %AD
o %B0
± %B1
a %B2
, %B4
μ %B5
è %D3
Ô %D4
Õ %D5
Ö %D6
× %D8
ê %D9
ë %DA
Û %DB
ì %DC
Y %DD
T %DE
ß %DF
à %E0
á %E1
a %E2
ã %E3
ä %E4
å %E5
æ %E6
ç %E7
â %E8
ã %E9
2 %32
3 %33
4 %34
5 %35
6 %36
7 %37
8 %38
9 %39
: %3A
; %3B
< %3C
= %3D
> %3E
? %3F
@ %40
A %41
B %42
C %43
D %44
E %45
F %46
G %47
H %48
_ %5F
` %60
a %61
b %62
c %63
d %64
e %65
f %66
g %67
h %68
i %69
j %6A
k %6B
l %6C
m %6D
n %6E
o %6F
p %70
q %71
r %72
s %73
t %74
u %75
» %BB
¼ %BC
½ %BD
¿ %BF
à %C0
á %C1
 %C2
à %C3
Ä %C4
Å %C5
Æ %C6
Ç %C7
â %C8
ã %C9
ä %CA
Ë %CB
å %CC
æ %CD
Î %CE
Ï %CF
D %D0
Ñ %D1
ç %D2
ä %EA
è %EB
å %EC
æ %ED
é %EE
ê %EF
e %F0
ñ %F1
ç %F2
è %F3
ô %F4
õ %F5
ö %F6
é %F7
÷ %F8
ê %F9
ë %FA
ø %FB
ì %FC
y %FD
t %FE
ÿ %FF
防止sql注入
URL编码平时是用不到的,因为IE会自动将输入到地址栏的非数字字母转换为url编码。曾有人提出数据库名字里带上“#”以防止被下载,因为IE遇到#就会忽略后面的字母。破解方法很简单——用url编码%23替换掉#。现在SQL注射非常流行,所以就有人写了一些防注射的脚本。下面××SQL通用防注入asp版部分代码。
Fy_Url=Variables("QUERY_STRING")
Fy_a=split(Fy_Url,"&")
redim Fy_Cs(ubound(Fy_a))
On Error Resume Next
for Fy_x=0 to ubound(Fy_a)
Fy_Cs(Fy_x) = left(Fy_a(Fy_x),instr(Fy_a(Fy_x),"=")-1)
Next
For Fy_x=0 to ubound(Fy_Cs)
If Fy_Cs(Fy_x)<>"" Then
If Instr(LCase(Request(Fy_Cs(Fy_x))),"and")<>0 then
"出现错误!"
End If
End If
Next
它的思路就是先获得提交的数据,以“&”为分界获得并处理name/value组,然后判断value里是否含有定义的关键字,有之,则为注射。
看起来value被检查了,但是name就不同。它的name/value组值来自于Variables("QUERY_STRING"),这里会出现问题。Variables("QUERY_STRING")是得到客户端提交的字符串,这里并不会自动转换url编码,如果把name进行url编码再提交的话,就可以绕过检查了。例如:参数是ph4nt0m=lake2 and lis0,此时程序能够检测到;如果提交%50h4nt0m=lake2 and lis0(对p进行url编码),程序就会去判断%50h4nt0m的值,而%50h4nt0m会被转换为ph4nt0m,所以%50h4nt0m值为空,于是就绕过了检测。为什么既然name不解码可以绕过检查而value就不能绕过呢?因为value的值取自Request(Fy_Cs(Fy_x)),这个服务器就会解码的。要想改进程序,只要能够得到客户端提交的数据是解码后的就可以了,把得到name的语句改为For
Each SubmitName In tring就可以了。
使用举例
前言
编码问题是JAVA初学者在web开发过程中经常会遇到问题,其中之一是URL中使用中文等非ASCII的字符造成服务器后台程序解析出现乱码的问题。
常见出错部分
也就是容易出现中文字符的部分:
(1)Query String中的参数值
(2)servlet path
常见出错原因
(1)浏览器:我们的客户端(浏览器)本身并没有遵循URI编码的规范。
(2)Servlet服务器:Servlet服务器的没有正确配置。
(3)开发人员并不了解Servlet的规范和API的含义。
servlet规范
(1)racterEncoding()方法 仅仅只适用于设置post提交的requestboda的编码而不是设置get方法提交的queryString的编码。该方法告诉应用服务器应该采用什么编码解析post传过来的内容。
(2) hInfo()返回的结果是由Servlet服务器解码(decode)过的。
(3) uestURI()返回的字符串没有被Servlet服务器decoded过。
(4) POST提交的数据是作为request body的一部分。
(5) 网页的Http头中ContentType("text/html; charset=GBK")的作用:
(a) 告诉浏览器网页中数据是什么编码;
(b) 表单提交时,通常浏览器会根据ContentType指定的charset对表单中的数据编码,然后发送给服务器的。
注意:这里所说的ContentType是指http头的ContentType,而不是在网页中mete中的ContentType。
版权声明:本文标题:URL编码 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1708727179h529909.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论