荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjk (UNIX+C+XML+?? 傻了?), 信区: Linux
标  题: http请求url中%的含义                   clown (转寄)[转载]
发信站: 荔园晨风BBS站 (Thu Apr 25 10:25:44 2002), 转信

【 以下文字转载自 jjk 的信箱 】
【 原文由 jjk.bbs@apue.dhs.org 所发表 】
发信人: ysqcn (岁月无声), 信区: UNP
标  题: http请求URI中的%有什么特殊意义?
发信站: UNIX编程 (2001年09月01日15:22:32 星期六), 站内信件

--
:※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/
:·[FROM: 211.69.197.81] 发信人: scz (小四), 信区: UNP
:标  题: Re: http请求URI中的%有什么特殊意义?
:发信站: UNIX编程 (2001年09月01日19:24:07 星期六), 站内信件

不清楚,
反正我就当它是0x,后面就是16进制数

【 在 ysqcn (岁月无声) 的大作中提到: 】


--

            也许有一天,他再从海上蓬蓬的雨点中升起,
            飞向西来,再形成一道江流,再冲倒两旁的石壁,
            再来寻夹岸的桃花。然而,我不敢说来生,也不敢信来生......
:※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.167.65.123] 发信人:
scircle (yuanyuan), 信区: UNP
:标  题: Re: http请求URI中的%有什么特殊意义?
:发信站: UNIX编程 (2001年09月02日10:06:12 星期天), 站内信件

是一种转义提示符,就像'\'似的.
嵌入汇编里不是也有%%eax,以和%0,%1之类区别的吗.

【 在 scz (小四) 的大作中提到: 】
: 不清楚,
: 反正我就当它是0x,后面就是16进制数
: 【 在 ysqcn (岁月无声) 的大作中提到: 】
--
:※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.108.211.32] 发信人:
Solaris (lazy), 信区: UNP
:标  题: Re: http请求URI中的%有什么特殊意义?
:发信站: UNIX编程 (2001年09月02日16:27:48 星期天), 站内信件

%号后面的是16进制数,表示汉字的内码
如“百”字的汉字内码是B6D9,
用这种方式表示出来就是“%B6%D9”
使用这种编码方式时
环境变量CONTENT_TYPE被置为application/x-www-form-urlencoded

【 在 ysqcn (岁月无声) 的大作中提到: 】
--
:※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.117.62.190] 发信人:
ysqcn (岁月无声), 信区: UNP
:标  题: Re: http请求URI中的%有什么特殊意义?
:发信站: UNIX编程 (2001年09月02日16:51:39 星期天), 站内信件

嗯,明白了,它的语法是 :
hex="A"|"B"|"C"|"D"|"E"|"F"|"a"|"b"|"c"|"d"|"e"|"f"|digit
escape= "%" hex hex

在看khttpd在解析"%"这个转义序列的时候碰到这个问题的,如下:

Source = strchr(URL,'%');

 if (Source==NULL)
  return;

 Dest = Source;

 while (*Source!=0)
 {
  if (*Source=='%')
  {
   Source++;
   val = *Source;

   if (val>'Z') val-=0x20;        /*  ASCII码 'a'->'A' or 'b'->'B' 等等  */
   val = val - '0';               /*  ASCII码 '9'->数字9  等等 */
   if (val<0) val=0;
   if (val>9) val-=7;             /*  'A'-'0' -7 =10 等等 */
   if (val>15) val=15;

   Source++;                      /*  下一个 hex  */
   val2 = *Source;

   if (val2>'Z') val2-=0x20;
   val2 = val2 - '0';
   if (val2<0) val2=0;
   if (val2>9) val2-=7;
   if (val2>15) val2=15;
   *Dest=val*16+val2;             /* 计算实际的转义值 */
  } else *Dest = *Source;
  Dest++;
  Source++;
 }
 *Dest=0;


【 在 Solaris (lazy) 的大作中提到: 】
: %号后面的是16进制数,表示汉字的内码
: 如“百”字的汉字内码是B6D9,
: 用这种方式表示出来就是“%B6%D9”
: 使用这种编码方式时
: 环境变量CONTENT_TYPE被置为application/x-www-form-urlencoded
: 【 在 ysqcn (岁月无声) 的大作中提到: 】
--
:※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.69.197.81] 发信人:
lookout (看世界), 信区: UNP
:标  题: Re: http请求URI中的%有什么特殊意义?
:发信站: UNIX编程 (2001年09月02日17:12:29 星期天), 站内信件

 啊,想到了那个iis的%1c%c1之类的漏洞

【 在 Solaris (lazy) 的大作中提到: 】
: %号后面的是16进制数,表示汉字的内码
: 如“百”字的汉字内码是B6D9,
: 用这种方式表示出来就是“%B6%D9”
: 使用这种编码方式时
: 环境变量CONTENT_TYPE被置为application/x-www-form-urlencoded
: 【 在 ysqcn (岁月无声) 的大作中提到: 】
--
:※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.1.121] 发信人:
scz (小四), 信区: UNP
:标  题: Re: http请求URI中的%有什么特殊意义?
:发信站: UNIX编程 (2001年09月02日23:24:28 星期天), 站内信件

【 在 lookout (看世界) 的大作中提到: 】
:  啊,想到了那个iis的%1c%c1之类的漏洞

那不一样
0x这种就是直接的ASCII编码,顶多考虑汉字区
%2e对于我来说就是0x2e,不就是个.嘛。
象以前有些内容过滤不对这个%解码的,我们就简单变换成
16进制表示以逃避针对URL的内容过滤。

但UTF-8的要复杂点,看这篇

标题:UTF-8的小知识

参看RFC 2279

UCS-4 range (hex.)    UTF-8 octet sequence (binary)
0000 0000-0000 007F   0xxxxxxx
0000 0080-0000 07FF   110xxxxx 10xxxxxx
0000 0800-0000 FFFF   1110xxxx 10xxxxxx 10xxxxxx
0001 0000-001F FFFF   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0020 0000-03FF FFFF   111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0400 0000-7FFF FFFF   1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

所以唯一真正要考虑的就是汉字,一个汉字两个字节,表示方法太多了。

%c1%1c --> 11000001 00011100 -->
           ~~~~~~~~~~~~~~~~~
     袁哥: 微软的程序员在这里出了问题,鬼知道为什么有些版本检测了高位有些
           版本没有检测高位,实际上这里应该是

%c1%9c --> 11000001 10011100 --> 00001011100 --> 0x5c --> '\'
           ~~~~~~~~~~~~~~~~~

微软的编程不知道哪根弦出了问题,有些版本对高位检测很严格,必须%c1%9c,有些
版本必须%c1%1c,另外一些版本则是两种表示都可以。但是根据RFC 2279,必须是前
者。

至于'+'和' '的关系,更加混乱,各种WEB实现或多或少有区别。

现在来看看'.'的UTF-8编码,很多种方式:

'.' --> 0x2e --> %2e
             --> 101110 --> 11000000 10101110 --> %c0%ae
                            ~~~~~~~~~~~~~~~~~
                            这种是标准UTF-8编码方式
                            11000000 00101110 --> %c0%2e
                            ~~~~~~~~~~~~~~~~~
                            这种是不规范的微软编码方式


【 在 lookout (看世界) 的大作中提到: 】
:  啊,想到了那个iis的%1c%c1之类的漏洞
: 【 在 Solaris (lazy) 的大作中提到: 】
: : %号后面的是16进制数,表示汉字的内码
: : 如“百”字的汉字内码是B6D9,
: : 用这种方式表示出来就是“%B6%D9”
: : 使用这种编码方式时
: : 环境变量CONTENT_TYPE被置为application/x-www-form-urlencoded


--

            也许有一天,他再从海上蓬蓬的雨点中升起,
            飞向西来,再形成一道江流,再冲倒两旁的石壁,
            再来寻夹岸的桃花。然而,我不敢说来生,也不敢信来生......
※ 修改:·scz 於 ★★ 欢迎光临 ★ 修改本文·[FROM: 211.167.65.123]
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.167.65.123]
--
※ 转寄:·UNIX编程 apue.dhs.org·[FROM: 210.39.3.50]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店