URL编码

王朝百科·作者佚名  2009-11-27
窄屏简体版  字體:   |    |    |  超大  

URL编码

URL编码-URL编码定义url编码是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送的字符, 将数据排行等等)作为URL的一部分或者分离地发给服务器。不管哪种情况, 在服务器端的表单输入格式样子象这样:

theName=Ichabod+Crane&gender=male&status=missing& ;headless=yes

URL编码-URL编码规则

URL编码遵循下列规则: 每对name/value由&符分开;每对来自表单的name/value由=符分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值。任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =, &, 和 % 这些特殊的字符。其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“”,它的ascii码是92,92的十六进制是5c,所以“”的url编码就是%5c。那么汉字的url编码呢?很简单,看例子:“胡”的ascii码是-17670,十六进制是BAFA,url编码是“%BA%FA”。

URL编码-URL编码表

?

退格

TAB

换行

回车

空格

!

"

#

$

%

&

'

(

)

*

+

,

-

.

/

%00

%01

%02

%03

%04

%05

%06

%07

%08

%09

%0a

%0b

%0c

%0d

%0e

%0f

%10

%11

%12

%13

%14

%15

%16

%17

%18

%19

%1a

%1b

%1c

%1d

%1e

%1f

%20

%21

%22

%23

%24

%25

%26

%27

%28

%29

%2a

%2b

%2c

%2d

%2e

%2f

0

1

2

3

4

5

6

7

8

9

:

;

<

=

>

?

@

A

B

C

D

E

F

G

H

I

J

K

L

M

N

O

P

Q

R

S

T

U

V

W

X

Y

Z

[

]

^

_

%30

%31

%32

%33

%34

%35

%36

%37

%38

%39

%3a

%3b

%3c

%3d

%3e

%3f

%40

%41

%42

%43

%44

%45

%46

%47

%48

%49

%4a

%4b

%4c

%4d

%4e

%4f

%50

%51

%52

%53

%54

%55

%56

%57

%58

%59

%5a

%5b

%5c

%5d

%5e

%5f

`

a

b

c

d

e

f

g

h

i

j

k

l

m

n

o

p

q

r

s

t

u

v

w

x

y

z

{

|

}

~

?

?

?

?

?

?

?

丒br>

%60

%61

%62

%63

%64

%65

%66

%67

%68

%69

%6a

%6b

%6c

%6d

%6e

%6f

%70

%71

%72

%73

%74

%75

%76

%77

%78

%79

%7a

%7b

%7c

%7d

%7e

%7f

%80

%81

%82

%83

%84

%85

%86

%87

%88

%89

%8a

%8b

%8c

%8d

%8e

%8f

?

?

?

?

?

?

丒br>?

?

|

?

a

?

?

ˉ

?

ˉ

2

3

μ

·

?

1

o

?

?

?

?

?

%90

%91

%92

%93

%94

%95

%96

%97

%98

%99

%9a

%9b

%9c

%9d

%9e

%9f

%a0

%a1

%a2

%a3

%a4

%a5

%a6

%a7

%a8

%a9

%aa

%ab

%ac

%ad

%ae

%af

%b0

%b1

%b2

%b3

%b4

%b5

%b6

%b7

%b8

%b9

%ba

%bb

%bc

%bd

%be

%bf

à

á

?

?

?

?

?

?

è

é

ê

?

ì

í

?

?

D

?

ò

ó

?

?

?

?

ù

ú

?

ü

Y

T

?

à

á

a

?

?

?

?

?

è

é

ê

?

ì

í

?

?

%c0

%c1

%c2

%c3

%c4

%c5

%c6

%c7

%c8

%c9

%ca

%cb

%cc

%cd

%ce

%cf

%d0

%d1

%d2

%d3

%d4

%d5

%d6

%d7

%d8

%d9

%da

%db

%dc

%dd

%de

%df

%e0

%e1

%e2

%e3

%e4

%e5

%e6

%e7

%e8

%e9

%ea

%eb

%ec

%ed

%ee

%ef

e

?

ò

ó

?

?

?

?

ù

ú

?

ü

y

t

?

%f0

%f1

%f2

%f3

%f4

%f5

%f6

%f7

%f8

%f9

%fa

%fb

%fc

%fd

%fe

%ff

URL编码-URL编码防止sql注入

URL编码平时我们是用不到的,因为IE会自动将你输入到地址栏的非数字字母转换为url编码。或许你已经想起了,有人提出数据库名字里带上“#”以防止被下载,因为IE遇到#就会忽略后面的字母。破解方法很简单——用url编码%23替换掉#。现在SQL注射非常流行,所以就有人写了一些防注射的脚本。当然啦,思路不一样,效果大不同。下面××SQL通用防注入asp版部分代码。

Fy_Url=Request.ServerVariables("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

Response.Write "出现错误!"

Response.End

End If

End If

Next

它的思路就是先获得提交的数据,以“&”为分界获得并处理name/value组,然后判断value里是否含有定义的关键字(这里为求简便,我只留下了“and”),有之,则为注射。

乍一看去,value被检查了,似乎没有问题。是的,value不会有问题,可是,name呢?

它的name/value组值来自于Request.ServerVariables("QUERY_STRING"),呵呵,不好意思,这里出问题了。Request.ServerVariables("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 Request.QueryString就可以了。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航