在线
客服

在线客服
尊敬的客户,我们24小时竭诚为您服务 公司总机: 0755-83312037 (32条线)

客服
热线

0755-83312037 (32条线)
7*24小时客服服务热线

?

关注
微信

关注官方微信

返回
顶部

13

2019-04
PHP环境安装套件:快速安装LAMP环境

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">推荐 6 款 LAMP 快速安装套件.</font> </td> </tr></tbody></table> <p>LAMP是一个缩写,它指一组通常一起使用来运行动态网站或者服务器的自由软件:</p> <p>Linux,操作系统;</p> <p>Apache,网页服务器;</p> <p>MySQL,数据库管理系统(或者数据库服务器);</p> <p>PHP 和有</p>

Read more+

13

2019-04
PHP中运行的文件管理系统:ajaxplorer

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">功能强大的php文件管理器ajaxplorer使用教程.</font> </td> </tr></tbody></table> <p>由于在VPS上安装FTP总是失败,需要一个可以通过Web进行文件管理的工具。AjaXplorer是一个在PHP中运行的文件管理系统,功能的强大以及界面的华丽实在是第一次见到。</p> <p align="center"><a href="/files/allimg/110607/1917270.jpg" target="_blank"><img style="WIDTH: 510px; HEIGHT: 420px" border="0" alt="" src="http://www.webjx.com/files/allimg/110607/1917270.jpg" width="510" height="755"></a></p> <p>官方网站:http://ajaxplorer.info 已经被伟大的墙屏蔽。</p> <p><strong>安装及使用:</strong></p> <p>1.下载AjaXplorer文件包,您可以直接在下面的地址中下载,这个版本是3.2.1,下载后当然是上传到网站上,最好给它一个专用的文件夹,比如/explorer</p> <p>AjaXplorer.zip (2)</p> <p>2.直接访问刚才安装AjaXplorer的目录,可能会提示一些服务器支持的错误,不用管它,直接进去,使用默认用户名admin密码admin登陆。</p> <p>3.登陆后,点击右上角“logged as admin”的下拉菜单中的Language更改语言,改为Chinese-zhCN.UTF-8这个就是简体中文。</p> <p align="center"><img style="WIDTH: 510px; HEIGHT: 278px" border="0" alt="" src="http://www.webjx.com/files/allimg/110607/1917271.jpg" width="510" height="341"></p> <p align="center"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110607/1917272.jpg" width="426" height="525"></p> <p>4.设置目录。如图点击左上角的一个下拉菜单,选中设置,然后选择Repositories,再点击上面的New Repository。(如果找不到请参考以下图片)</p> <p align="center"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110607/1917273.jpg" width="281" height="269"></p> <p align="center"><a href="/files/allimg/110607/1917274.jpg" target="_blank"><img style="WIDTH: 510px; HEIGHT: 230px" border="0" alt="" src="http://www.webjx.com/files/allimg/110607/1917274.jpg" width="510" height="332"></a></p> <p align="center"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110607/1917275.jpg" width="177" height="130"></p> <p>5.填写相关信息。</p> <p>Reponsitories Label 名称,随便填写就可以</p> <p>Reponsitories Driver 选择File System</p> <p>Path 选择要管理的目录,也可以填写根目录</p> <p>File Creation Mask 权限,建议填写0777</p> <p>其他的按照下图填写即可。</p> <p align="center"><img border="0" alt="" src="http://www.webjx.com/files/allimg/110607/1917276.jpg" width="406" height="570"></p> <p>6.在左边选择刚才新建的目录就OK啦。</p> <p>转载请注明转自EinCy 本文原始链接地址:<a href="http://www.eincy.com/ajaxplorer" target="_blank">http://www.eincy.com/ajaxplorer</a> </p>

Read more+

13

2019-04
PHP教程:基于正则表达式替换的模板引擎

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">模板引擎正则表达式调试小技巧.</font> </td> </tr></tbody></table> <p>很久没有遇上PHP难题了,这次正则问题占了一点时间,还是老问题最大回溯、递归限制问题。学习透之后其实并不难修改调试有这类问题的正则。主要是以下几点。</p> <p>基于正则表达式替换的模板引擎很容易遇上正则表达式最大回溯/递归的限制。</p> <p>惰性匹配并不可怕,正常情况下模板并不会不够用,往往不会超出限制,discuz的模板引擎就大量使用了。但是因此而不去注意、不去学习,则容易书写错误并遇上问题。</p> <p>当preg_*返回的是null的时候则要注意了,判断函数是is_null.</p> <p>出错并不可怕,但是最好把错误都完整的输出,这样调试就很容易了。</p> <p>除了输出出错原因,还要输出匹配的文本和使用的正则,这样就很容易调试了。</p> <p>PHP代码</p> <table style="BORDER-BOTTOM: #0099cc 1px solid; BORDER-LEFT: #0099cc 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #0099cc 1px solid; BORDER-RIGHT: #0099cc 1px solid" border="0" cellspacing="0" cellpadding="6" width="95%" align="center"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#ddedfb"> <ol class="dp-c"> <li class="alt"> <span><span>&lt;?php &#160;&#160;</span></span> </li> <li> <span class="keyword">if</span><span>&#160;(</span><span class="func">is_null</span><span>(</span><span class="vars">$tmp</span><span>)){ &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;</span><span class="vars">$error_code</span><span>&#160;=&#160;preg_last_error(); &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;</span><span class="keyword">switch</span><span>(</span><span class="vars">$error_code</span><span>){ &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">case</span><span>&#160;PREG_NO_ERROR&#160;: &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="func">echo</span><span>&#160;</span><span class="string">'PREG_NO_ERROR'</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">break</span><span>; &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">case</span><span>&#160;PREG_INTERNAL_ERROR: &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="func">echo</span><span>&#160;</span><span class="string">'PREG_INTERNAL_ERROR'</span><span>; &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">break</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">case</span><span>&#160;PREG_BACKTRACK_LIMIT_ERROR: &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="func">echo</span><span>&#160;</span><span class="string">'PREG_BACKTRACK_LIMIT_ERROR'</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">break</span><span>; &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">case</span><span>&#160;PREG_RECURSION_LIMIT_ERROR: &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="func">echo</span><span>&#160;</span><span class="string">'PREG_RECURSION_LIMIT_ERROR'</span><span>; &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">break</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">case</span><span>&#160;PREG_BAD_UTF8_ERROR: &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="func">echo</span><span>&#160;</span><span class="string">'PREG_BAD_UTF8_ERROR'</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">break</span><span>; &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">case</span><span>&#160;PREG_BAD_UTF8_OFFSET_ERROR: &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="func">echo</span><span>&#160;</span><span class="string">'PREG_BAD_UTF8_OFFSET_ERROR'</span><span>; &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">break</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="keyword">default</span><span>: &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="func">echo</span><span>&#160;</span><span class="string">'UNKNOW&#160;ERROR'</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>&#160;&#160;&#160;&#160;} &#160;&#160;</span> </li> <li> <span>&#160;&#160;&#160;&#160;</span><span class="func">exit</span><span>; &#160;&#160;</span> </li> <li class="alt"> <span>}&#160;&#160;</span> </li> </ol> </td> </tr></tbody></table> <p><strong>参考资料</strong></p> <p>1、2010, Laruence <a href="http://www.laruence.com/2010/06/08/1579.html" target="_blank"><font color="#0000ff">《深悉正则(pcre)最大回溯/递归限制》</font></a></p> <p>2、2011, PHP中文手册<a href="http://us2.php.net/manual/zh/function.preg-last-error.php" target="_blank"><font color="#0000ff"> preg_last_error</font></a></p>

Read more+

13

2019-04
PHPUnZip:在线解压缩PHP的工具

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">PHP在线解压ZIP工具 - PHPUnZip.</font> </td> </tr></tbody></table> <p>如果要把一个包含很多文件的文件夹上传到服务器,这个文件夹可能是一个CMS,如果直接上传,不论是使用PHP还是FTP,上传的时间都是相当长的,因为这个文件夹包含的文件数量很大,尽管文件可能很小,但每个文件都要建立一次连接,这加起来的时间是很可怕的。通常,我们使用的方法是现把这个文件夹压缩成zip或者tar.gz文件,上传到服务器,然后在服务器上解压,这样可以节省很多时间。</p> <p>很多服务器提供了解压ZIP文件的功能,比如cPanel和Direct Admin面板都有这个功能。但如果你的服务器刚好没有这个功能怎么办呢?这时候可以尝试使用PHP工具。</p> <p>PHPUnZip这款PHP工具体积很小,只有一个文件,它可以在服务器上方便地解压ZIP文件。</p> <p><strong>使用方法</strong></p> <p>1.下载并解压得到unzip.php文件,用文本编辑器打开(不能使用Windows自带的记事本,推荐<a href="http://down.chinaz.com/soft/18954.htm" target="_blank"><font color="#1c3d72">Notepad2</font></a>),在这个文件的头部找到</p> <blockquote> <p>&lt;?php</p> <p>//设定密码</p> <p>$password = “www.eincy.com”;</p> <p>?&gt;</p> </blockquote> <p>修改密码后保存。</p> <p>2.上传unzip.php到服务器并运行它。</p> <p style="TEXT-ALIGN: center"><img border="0" src="http://www.webjx.com/files/allimg/110828/2034110.jpg" width="600" height="172" alt=""></p> <p>3.选择zip文件,你可以选择在unzip.php同目录下的zip文件,或者上传一个zip文件。</p> <p>4.输入你准备解压这个zip文件的目录,如果留空,则表示在当前目录下解压。</p> <p>5.输入第一步中设定的密码,然后点击解压。</p> <p>文件下载地址:<a href="http://www.eincy.com/wp-content/plugins/download-monitor/download.php?id=53" target="_blank"><font color="#1c3d72">unzip.zip (6)</font></a></p>

Read more+

13

2019-04
PHP的问题:全面阐述PHP网站设计的问题

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">php让人难堪。它是如此的破碎,但那些被培训的业余爱好者,却对它称赞不已。php在做一些徽不足道的挽回措施,但我选择忘记它。</font> </td> </tr></tbody></table> <p><strong>前言</strong></p> <p>我的脾气古怪。我会抱怨很多东西。这个星球上大多数技术我都不喜欢。</p> <p>PHP不仅使用起来尴尬,还有要嘛我想要的不适合,要嘛不是最令人满意,要嘛违背我的信仰。我可以告诉你关于一门语言,所有我想避免的好方式,所有我喜欢的坏方式。来吧,问吧!谈话会很有趣!</p> <p>php是唯一的例外。几乎php抽象的所有东西都是支离破碎的。包括语言,框架,整个生态系统都一塌糊涂。我几乎不能单独列出咒骂的事情,因为它全身都坏了。每次我打算编辑一堆杂乱如麻的php抱怨清单的时候,我都被一些琐事打乱,越深入就越会发现其它令人震惊的事情。</p> <p>php让人难堪。它是如此的破碎,但那些被培训的业余爱好者,却对它称赞不已。php在做一些徽不足道的挽回措施,但我选择忘记它。</p> <p>不过我得让我的系统摆脱这些东西,也就这样了,这是最后一次尝试。</p> <p><strong>打个比喻</strong></p> <p>我只是随口和Mel抱怨下,而她却坚决让我发表出来。</p> <p>我甚至说不出来PHP到底怎么了,因为&#8212;还好。想想你有一个,嗯,工具箱吧。一堆工具。看起来还好,有标准的东西。</p> <p>你拔除螺丝钉,它怪异的有三个头。OK,好吧,这对你不太有用,但你猜迟早有天会有用。</p> <p>你拿出榔头,被震住了,两边都有是尖爪。但它仍然能用,我的意思是,你可以用两头的中部斜着敲。</p> <p>你拿出老虎钳,但它们没有锯齿面。表面平而光滑。这没多大用,但依然能用,没什么。</p> <p>你可以继续。工具箱的东西都是怪异和琢磨不定的,但又不能说毫无价值。整体看没什么大问题;它的工具都齐全。</p> <p>现在,想象有很多使用这些工具的木匠,它们和你说:”这些工具有什么问题呢?我们都用过,它们工作都很好啊!”。工匠们给你展示他们建的房子,每个门都是五边形的而屋顶是癫倒的。你敲前门,它向内倒榻了,而他们却抱怨你打破了他们的门。</p> <p>这就是PHP的问题。</p> <p><strong>立场</strong></p> <p>我认为下面的特质对于一门语言的生产力和可用性是重要的,而PHP在大范围破坏它们。如果你不同意这些,好吧,我无法想像,我们永远不会达成一致。</p> <p>一门语言必须是可预见的。它是</p>

Read more+

13

2019-04
.htaccess文件玩转Rewrite

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">.htaccess文件玩转Rewrite.</font> </td> </tr></tbody></table> <p>刚玩网页的时候,写的都是静态页 http://uicss.cn/about.htm 这样的结构。<br>后来想换成 http://uicss.cn/about/<br>但是又因为不熟悉rewrite,做了如下的调整,手动建立了一堆的文件夹:</p> <p><img class="aligncenter size-full wp-image-14722" title="mysite" alt="" src="http://www.webjx.com/files/allimg/120625/0114380.png" width="367" height="221"></p> <p>这样的目录结构,维护起来相当麻烦。每次新加一个页面,都要开一个文件夹。<br>其实采用左边那套结构部署上去,服务器稍做设置,就可以支持我们想要的URL效果。</p> <h5>如何玩 rewrite </h5> <p>首先看看自己的服务器是否支持 .htaccess<br>如果支持这货,就不用每次写条规则就重启一次服务器了,便于测试。</p> <p><code><font face="NSimsun">redirect 301 /test.htm http://uicss.cn/</font></code></p> <p>成功的话,当你访问 xxx.com/test.htm 的时候,会自动跳到我的博客。<br>不成功的话,需要开启一下 .htaccess :</p> <ol> <li>打开 \conf\httpd.conf ,查找 <strong class="red">#</strong>LoadModule rewrite_module,将#号去掉,加载该模块 </li> <li>打开 \conf\extra\httpd-vhosts.conf ,查找 AllowOverride <strong class="red">None</strong>,将 None 变更为 All </li> </ol> <p>环境准备完成后,还需要对“模式匹配”中特殊字符在rewrite的解读做一下了解:</p> <p><code><font face="NSimsun">* 代表前面0或更多个字符<br>+ 代表前面1或更多个字符<br>? 代表前面0或1个字符<br>^ 代表字符串的开始位置<br>^ 在方括号里代表“非”,例如[^/]代表非斜杠。<br>$ 代表字符串结束的位置<br>. 代表任何字符(也就是通配符)<br>\ 取消后面字符的特殊意思,转为原义字符。<br><span class="float_right">&#8212;&#8212; 这部分的理解出自《SEO艺术》第六章末</span><br></font></code></p> <p>开始干吧,打开.htaccess的rewrite<br><code><font face="NSimsun">RewriteEngine on</font></code></p> <p>把 xxx.htm 文件 替换为 xxx/<br><code><font face="NSimsun">RewriteRule ^(.*)\<strong class="red">/</strong>$ /$1.htm [L]</font></code></p> <p>再给一个例子加深理解,这是将服务器上的 xxx.php 文件 替换成 xxx.html<br><font face="NSimsun"><code>RewriteRule ^(.*)\<strong class="red">.html</strong>$ /$1.php [L]</code><br><span id="more-14719"></span></font></p> <h5>更多用法:</h5> <p>让所有访问 www.uicss.cn/xxx/ 的用户 跳转到 uicss.cn/xxx/<br><code><font face="NSimsun">RewriteCond %{HTTP_HOST} ^www.uicss.cn [NC]<br>RewriteRule ^(.*)$ http://uicss.cn/$1 [L,R=301]</font></code></p> <p>对指定目录开启转向的代码:<br><code><font face="NSimsun">RewriteBase /top/</font></code></p> <p>带搜索参数的转向:<br><code><font face="NSimsun">RewriteRule ^search/(.+)?$ /index.php?s=$1 [QSA,L]</font></code></p> <p>目录末尾补斜线:<br><code><font face="NSimsun">RewriteRule ^(.+[^/])$ /$1/ [R]</font></code></p>

Read more+

13

2019-04
PHP实例代码:模仿百度搜索时输入内容带提示

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">PHP+JS模仿的百度搜索输入提示功能.</font> </td> </tr></tbody></table> <p>自己用PHP + js模仿的百度搜索时输入内容带提示的功能,运行的话需要PHP环境。也算是自己的一个练笔题吧,和大家分享一下</p> <p>&lt;?php<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; $aName = array("王成","王瑞","王祥","何武昌","何睿","何好","马兴","马成栋","张相","张祥");<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; $aId = array(88801,11144,2345,9023,12415,88021,11145,2344,11145,0376);<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; foreach($aName as $k =&gt;$val)<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $json[$k] = array(<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 'id' =&gt; $aId[$k],<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 'name' =&gt; $val<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; );&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p> <p>/**************************************************************<br>*<br>*&#160; 使用特定function对数组中所有元素做处理<br>*&#160; @param&#160; string&#160; &amp;$array&#160;&#160;&#160;&#160; 要处理的字符串<br>*&#160; @param&#160; string&#160; $function&#160;&#160; 要执行的函数<br>*&#160; @return boolean $apply_to_keys_also&#160;&#160;&#160;&#160; 是否也应用到key上<br>*&#160; @access public<br>*<br>*************************************************************/<br>function arrayRecursive(&amp;$array, $function, $apply_to_keys_also = false)<br>{<br>&#160;&#160;&#160; static $recursive_counter = 0;<br>&#160;&#160;&#160; if (++$recursive_counter &gt; 1000) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; die('possible deep recursion attack');<br>&#160;&#160;&#160; }<br>&#160;&#160;&#160; foreach ($array as $key =&gt; $value) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (is_array($value)) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; arrayRecursive($array[$key], $function, $apply_to_keys_also);<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; } else {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $array[$key] = $function($value);<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ($apply_to_keys_also &amp;&amp; is_string($key)) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $new_key = $function($key);<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ($new_key != $key) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $array[$new_key] = $array[$key];<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; unset($array[$key]);<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160; }<br>&#160;&#160;&#160; $recursive_counter--;<br>}<br>/**************************************************************<br>*<br>*&#160; 将数组转换为JSON字符串(兼容中文)<br>*&#160; @param&#160; array&#160;&#160; $array&#160;&#160;&#160;&#160;&#160; 要转换的数组<br>*&#160; @return string&#160;&#160;&#160;&#160;&#160; 转换得到的json字符串<br>*&#160; @access public<br>*<br>*************************************************************/<br>function JSON($array) {<br>&#160;&#160;&#160; arrayRecursive($array, 'urlencode', true);<br>&#160;&#160;&#160; $json = json_encode($array);<br>&#160;&#160;&#160; return urldecode($json);<br>}<br>?&gt;<br>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br>&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;<br>&lt;head&gt;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;meta content="text/html;charset=gb2312" http-equiv="content-type" /&gt;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;style type="text/css"&gt;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .name{cursor:pointer;}<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .selected{background:#CCC;}<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .normal{background:#FFF;}<br>&#160;&#160;&#160; &lt;/style&gt;<br>&lt;/head&gt;<br>&lt;table align="center"&gt;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;tr&gt;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;td&gt;输入测试:&lt;/td&gt;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;td&gt;&lt;input type="text" style="color:" id="neirong" onkeyup="tip(event,0)"/&gt;&lt;/td&gt;<br>&#160;&#160;&#160; &lt;/tr&gt;<br>&lt;/table&gt;<br>&lt;div id="showMessage" style="border:1px #666 solid;"&gt;<br>&lt;/div&gt;<br>&lt;script type="text/javascript"&gt;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; window.onload = function(){<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var tag = document.getElementById("showMessage");<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; tag.style.display = "none";<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; function tip(event) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var aUserName = new Array();<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var aTempName, aUserName, tag, sVal, sHtml, mesTag, selectedTag, didTag, widths;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var postion = new Array();<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sId = 0;//用于给每个名字加一个id的顺序<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var whichType;//用户输入的类型,是数字呢还是中文。<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; aUserName = &lt;?php echo JSON($json); ?&gt;;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //aUserName = eval('(' + aTempName + ')');<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; tag = document.getElementById("neirong");<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; didTag = document.getElementById("did");<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //输入框坐标获取<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; postion = getElementPos(tag);<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //显示div坐标调整<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mesTag = document.getElementById("showMessage");<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mesTag.style.position = "absolute";<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mesTag.style.left = postion[0]<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mesTag.style.top = postion[1];<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; widths = tag.style.width + "px";<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mesTag.width = widths;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var event = event || window.event;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var sKeyCode = event.keyCode;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var aShangXia = new Array(37,38,39,40);<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var isDerection;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sVal = tag.value;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //以enter作为用户输入结束标志<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(13!=sKeyCode) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(var i in aShangXia) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(sKeyCode == aShangXia) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; isDerection = false;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; isDerection = true;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(isDerection) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sHtml = '';<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(""==sVal) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mesTag.style.display = "none";<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mesTag.innerHTML = sHtml;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return false;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else {&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sHtml = '&lt;table width="146px" border="0" id="showTable"&gt;';<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(checkVal(sVal)) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(var i in aUserName)<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(0&lt;=aUserName[i].id.indexOf(sVal)) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sHtml = sHtml + '&lt;tr&gt;&lt;td class="normal" onclick="clickToChoice('+sId+')" onmouseover="changeColor(true,'+sId+')" onmouseout="changeColor(false,'+sId+')" id="p_'+sId+'" readonly="readonly"&gt;'+aUserName[i].id+'_'+aUserName[i].name+'&lt;/td&gt;&lt;/tr&gt;';<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sId = sId + 1;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(var i in aUserName)<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(0&lt;=aUserName[i].name.indexOf(sVal)) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sHtml = sHtml + '&lt;tr&gt;&lt;td class="normal" onclick="clickToChoice('+sId+')" onmouseover="changeColor(true,'+sId+')" onmouseout="changeColor(false,'+sId+')" id="p_'+sId+'" readonly="readonly"&gt;'+aUserName[i].id+'_'+aUserName[i].name+'&lt;/td&gt;&lt;/tr&gt;';<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sId = sId + 1;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sHtml = sHtml + '&lt;/table&gt;';<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(0!=sId) {&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mesTag.style.display = "";<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mesTag.innerHTML = sHtml;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sHtml = '';&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mesTag.innerHTML = '没有结果';&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(38==sKeyCode||40==sKeyCode) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; dance(sKeyCode,sVal,tag);<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(''!=tag.value) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mesTag.innerHTML = '';<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; showMessage.style.display = 'none';<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return false;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; function checkVal(sVal){<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var patrn = /^[0-9]/;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(patrn.exec(sVal)) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return true;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return false;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; //获取用户通过点击的名字<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; function clickToChoice(sqnm) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var choicedTag, mesTag, showTag;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; choicedTag = document.getElementById("p_"+sqnm);<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mesTag = document.getElementById("neirong");<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; showTag = document.getElementById("showTable");<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mesTag.value = choicedTag.innerHTML; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; showMessage.style.display = 'none';<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; function dance(sKeyCode,sVal,tag) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var danceTag = getElementsByClassName("normal");//这个是正常的行<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var danceingTag = getElementsByClassName("selected");//这个是前一个被选中的行<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var selectedTag, lastTag, showTag, selectedVal, currentNum, initial;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var rowNums, selectedNum = 0;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var danceLen = danceTag.length;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(0 != danceingTag.length) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; showTag = document.getElementById("showTable");<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; rowNums = showTag.rows.length;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; currentNum = danceingTag[0].id.split("_")[1] * 1;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; switch(sKeyCode) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; case 40:<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(rowNums == (currentNum + 1)) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; selectedNum = 0;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; selectedNum = currentNum + 1;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; case 38:<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(0 == currentNum ) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; selectedNum = rowNums - 1;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; selectedNum = currentNum - 1;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; switch(sKeyCode) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; case 40:<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; currentNum = danceTag.length - 1;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; selectedNum = 0;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; case 38:<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; currentNum = 0;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; selectedNum = danceTag.length - 1;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; lastTag&#160;&#160;&#160;&#160;&#160;&#160;&#160; = document.getElementById("p_"+currentNum);&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; lastTag.className = "normal";<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; selectedTag = document.getElementById("p_"+selectedNum);&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; selectedVal = selectedTag.innerHTML;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; selectedTag.className = "selected";<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; tag.value = selectedVal;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; function changeColor(type,sqnm) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var tag = document.getElementById("p_"+sqnm);<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(type) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; tag.className = "selected";<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; else {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; tag.className = "normal";&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; function getElementsByClassName(n) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var classElements = [],allElements = document.getElementsByTagName('*');<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (var i=0; i&lt; allElements.length; i++ )<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (allElements[i].className == n ) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; classElements[classElements.length] = allElements[i]; //某类集合<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return classElements;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; function getElementPos(tag) {<br>&#160;&#160;&#160;&#160;&#160;&#160;&

Read more+

13

2019-04
实例学习Apache服务器的安全防护知识

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">开源 Apache 服务器安全防护技术精要及实战.</font> </td> </tr></tbody></table> <p style='font: 14px/26px "Segoe UI", Tahoma, Arial; margin: 1em 0px; padding: 0px; color: rgb(0, 0, 0); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; background-color: rgb(245, 250, 255); -webkit-text-size-adjust: none; -webkit-text-stroke-width: 0px;'>Apache 一直是世界上使用率排名前三的 Web 服务器软件。企业使用其构建 Web 应用,从很大程度上都需要对其安全性进行综合考虑,以保证能够应对拒绝服务攻击、流量窃听、数据泄漏等网络威胁,从而保证企业门户网站的安全。除了使用业界流行的防火墙、IDS/IPS(入侵检测系统 / 入侵防御系统)、WAF(Web 应用防火墙)、UTM(统一威胁管理)等外部安全设备对 Apache 服务进行安全防护外,作为一种优秀的开源服务器软件,Apache 本身就具有很多优秀的特性可以为服务器管理员提供安全配置,以防范各种网络攻击。因此,充分、高效地挖掘 Apache 服务器的自身安全能力也是企业安全工作者一个必备的技能。基于此,本文将通过大量的实例,从服务器安全设置、运行环境安全保障、安全模块保护、日志管理等 6 个方面详细剖析 Apache 服务器的安全防护要点。</p> <h2 id="major1" style='margin: 1em 0px; padding: 0px; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: "Segoe UI", Tahoma, Arial; font-size: 18px; font-style: normal; font-variant: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; background-color: rgb(245, 250, 255); -webkit-text-size-adjust: none; -webkit-text-stroke-width: 0px;'><strong>Apache 服务简介</strong></h2> <p style='font: 14px/26px "Segoe UI", Tahoma, Arial; margin: 1em 0px; padding: 0px; color: rgb(0, 0, 0); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; background-color: rgb(245, 250, 255); -webkit-text-size-adjust: none; -webkit-text-stroke-width: 0px;'>Web 服务器也称为 WWW 服务器或 HTTP 服务器 (HTTP Server),它是 Internet 上最常见也是使用最频繁的服务器之一,Web 服务器能够为用户提供网页浏览、论坛访问等等服务。</p> <p style='font: 14px/26px "Segoe UI", Tahoma, Arial; margin: 1em 0px; padding: 0px; color: rgb(0, 0, 0); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; background-color: rgb(245, 250, 255); -webkit-text-size-adjust: none; -webkit-text-stroke-width: 0px;'>由于用户在通过 Web 浏览器访问信息资源的过程中,无须再关心一些技术性的细节,而且界面非常友好,因而 Web 在 Internet 上一推出就得到了爆炸性的发展。现在 Web 服务器已经成为 Internet 上最大的计算机群,Web 文档之多、链接的网络之广,也令人难以想像。因此,Web 服务器软件的数量也开始增加,Web 服务器软件市场的竞争也越来越激烈。本文所讨论的就是一款最常用的 Web 服务器软件&#8212;&#8212; Apache。</p> <p style='font: 14px/26px "Segoe UI", Tahoma, Arial; margin: 1em 0px; padding: 0px; color: rgb(0, 0, 0); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; background-color: rgb(245, 250, 255); -webkit-text-size-adjust: none; -webkit-text-stroke-width: 0px;'>Apache 是一个免费的软件,用户可以免费从 Apache 的官方网站下载。任何人都可以参加其组成部分的开发。Apache 允许世界各地的人对其提供新特性。当新代码提交到 Apache Group 后,Apache Group 对其具体内容进行审查并测试和质量检查。如果他们满意,该代码就会被集成到 Apache 的主要发行版本中。</p> <p style='font: 14px/26px "Segoe UI", Tahoma, Arial; margin: 1em 0px; padding: 0px; color: rgb(0, 0, 0); text-transform: none; text-indent: 2em; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; background-color: rgb(245, 250, 255); -webkit-text-size-adjust: none; -webkit-text-stroke-width: 0px;'>Apache 的其他主要特征有:</p> <ul style='font: 14px/26px "Segoe UI", Tahoma, Arial; margin: 1em 0px; padding: 0px 0px 0px 30px; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; list-style-type: disc; white-space: normal; orphans: 2; widows: 2; background-color: rgb(245, 250, 255); -webkit-text-size-adjust: none; -webkit-text-stroke-width: 0px;'> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">支持最新的 HTTP 协议:是最先支持 HTTP1.1 的 Web 服务器之一,其与新的 HTTP 协议完全兼容,同时与 HTTP1.0、HTTP1.1 向后兼容。Apache 还为支持新协议做好了准备。</li> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">简单而强大的基于文件的配置:该服务器没有为管理员提供图形用户界面,提供了三个简单但是功能异常强大的配置文件。用户可以根据需要用这三个文件随心所欲地完成自己希望的 Apache 配置。</li> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">支持通用网关接口(CGI):采用 mod_cgi 模块支持 CGI。Apache 支持 CGI/1.1 标准,并且提供了一些扩充。</li> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">支持虚拟主机:是首批既支持 IP 虚拟主机又支持命名虚拟主机的 Web 服务器之一。</li> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">支持 HTTP 认证:支持基于 Web 的基本认证。它还有望支持基于消息摘要的认证。</li> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">内部集成 Perl:Perl 是 CGI 脚本编程的事实标准。Apache 对 Perl 提供了良好的支持,通过使用其 mod_perl 模块,还可以将 Perl 的脚本装入内存。</li> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">集成代理服务器:用户还可以选择 Apache 作为代理服务器。</li> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">支持 SSL:由于版本法和美国法律在进出口方面的限制,Apache 本身不支持 SSL。但是用户可以通过安装 Apache 的补丁程序集合(Apache-SSL)使得 Apache 支持 SSL。</li> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">支持 HTTP Cookie:通过支持 Cookie,可以对用户浏览 Web 站点进行跟踪。</li> </ul> <div style='font: 14px/26px "Segoe UI", Tahoma, Arial; margin: 0px; padding: 0px; color: rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: normal; word-spacing: 0px; white-space: normal; orphans: 2; widows: 2; background-color: rgb(245, 250, 255); -webkit-text-size-adjust: none; -webkit-text-stroke-width: 0px;'> <h2 id="major2" style="margin: 1em 0px; padding: 0px; font-size: 18px;"><strong>Apache 服务面临的网络威胁</strong></h2> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">一般说来,Apache 服务器主要面临如下几种网络威胁:</p> <ol type="1" style="margin: 1em 0px; padding: 0px 0px 0px 30px; list-style-type: decimal;"> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">使用 HTTP 协议进行的拒绝服务攻击:攻击者会通过某些手段使服务器拒绝对 HTIP 应答。这样会使 Apache 对系统资源(CPU 时间和内存)需求巨增,造成 Apache 系统变慢甚至完全瘫痪,从而引起 HTTP 服务的中断或者合法用户的合法请求得不到及时地响应;</li> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">缓冲区溢出攻击:由于 Apache 源代码完全开放,攻击者就可以利用程序编写的一些缺陷,使程序偏离正常流程。程序使用静态分配的内存保存请求数据,攻击者就可以发送一个超长请求使缓冲区溢出,从而导致缓冲区溢出攻击;</li> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">被攻击者获得 root 权限,威胁系统安全:由于 Apache 服务器一般以 root 权限运行,攻击者通过它获得 root 权限,进而控制整个 Apache 系统;</li> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">Apache 服务器与客户端通信安全:如果采用明文传输,则服务器与客户端的敏感通信信息将有可能被黑客或者不法用户获取;</li> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">由于 Apache 配置文件设置不当引起的安全问题:恶意者可以随意下载或修改删除系统文件。这主要涉及到对访问者的内容和权限的限制。</li> </ol> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">要应对上述这些安全威胁,要从 Apache 服务器端配置、运行环境、通信链路安全保障、安全模块使用、日志管理等各方面、全方位的进行保障,下面将进行分门别类的详细介绍。</p> <h2 id="major3" style="margin: 1em 0px; padding: 0px; font-size: 18px;"><strong>Apache 服务器端安全设置</strong></h2> <h3 id="minor3.1" style="margin: 1em 0px; padding: 0px; font-size: 18px;"><strong>限制 root 用户运行 Apache 服务器</strong></h3> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">一般情况下,在 Linux 下启动 Apache 服务器的进程 httpd 需要 root 权限。由于 root 权限太大,存在许多潜在的对系统的安全威胁。一些管理员为了安全的原因,认为 httpd 服务器不可能没有安全漏洞,因而更愿意使用普通用户的权限来启动服务器。http.conf 主配置文件里面有如下 2 个配置是 Apache 的安全保证,Apache 在启动之后,就将其本身设置为这两个选项设置的用户和组权限进行运行,这样就降低了服务器的危险性。</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">User apache</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">Group apache</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">需要特别指出的是:以上 2 个配置在主配置文件里面是默认选项,当采用 root 用户身份运行 httpd 进程后,系统将自动将该进程的用户组和权限改为 apache,这样,httpd 进程的权限就被限制在 apache 用户和组范围内,因而保证了安全。</p> <h3 id="minor3.2" style="margin: 1em 0px; padding: 0px; font-size: 18px;"><strong>向客户端隐藏 Apache 服务器的相关信息</strong></h3> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">Apache 服务器的版本号可以作为黑客入侵的重要信息进行利用,他们通常在获得版本号后,通过网上搜索针对该版本服务器的漏洞,从而使用相应的技术和工具有针对性的入侵,这也是渗透测试的一个关键步骤。因此,为了避免一些不必要的麻烦和安全隐患,可以通过主配置文件 httpd.conf 下的如下两个选项进行:</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">(1)ServerTokens:该选项用于控制服务器是否响应来自客户端的请求,向客户端输出服务器系统类型或者相应的内置模块等重要信息。Red Hat Enterprise Linux 5 操作系统在主配置文件中提供全局默认控制阈值为 OS,即 ServerTokens OS。它们将向客户端公开操作系统信息和相关敏感信息,所以保证安全情况下需要在该选项后使用“ProductOnly”,即 ServerTokens ProductOnly。</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">(2)ServerSignature:该选项控制由系统生成的页面(错误信息等)。默认情况下为 off,即 ServerSignature off,该情况下不输出任何页面信息。另一情况为 on,即 ServerSignature on,该情况下输出一行关于版本号等相关信息。安全情况下应该将其状态设为 off。</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">图 1 和图 2 为安全设定这两个选项前后正常情况下和错误情况下的输出页面(通过 Rhel5 中的 Mozilla Firefox 浏览器访问 Rhel5 中的 Apache 服务器)的详细对比。可以清楚看到,安全设定选项后,可以充分地向客户端用户隐藏 Linux 操作系统信息和 Apache 服务器版本信息。</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">图 1. 错误情况下未设定安全选项前示意</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;"><a title="开源 Apache 服务器安全防护技术精要及实战" class="cboxElement" style="color: rgb(28, 61, 114); text-decoration: none;" href="http://upload.chinaz.com/2013/1017/1381977512685.jpg" rel="lightbox[49548]"><img title="" class="alignnone size-full wp-image-49549" style="border: 1px solid rgb(153, 153, 153); margin-right: auto; margin-left: auto; display: block;" alt="iimage001" src="http://www.webjx.com/files/allimg/131017/2050370.jpg" border="0"></a></p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">图 2. 操作情况下使用安全设定后的对比</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;"><a title="开源 Apache 服务器安全防护技术精要及实战" class="cboxElement" style="color: rgb(28, 61, 114); text-decoration: none;" href="http://upload.chinaz.com/2013/1017/1381977512386.jpg" rel="lightbox[49548]"><img title="" class="alignnone size-full wp-image-49550" style="border: 1px solid rgb(153, 153, 153); margin-right: auto; margin-left: auto; display: block;" alt="iimage002" src="http://www.webjx.com/files/allimg/131017/2050371.jpg" border="0"></a></p> <h3 id="minor3.3" style="margin: 1em 0px; padding: 0px; font-size: 18px;"><strong>设置虚拟目录和目录权限</strong></h3> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">要从主目录以外的其他目录中进行发布,就必须创建虚拟目录。虚拟目录是一个位于 Apache 的主目录外的目录,它不包含在 Apache 的主目录中,但在访问 Web 站点的用户看来,它与位于主目录中的子目录是一样的。每个虚拟目录都有一个别名,用户 Web 浏览器中可以通过此别名来访问虚拟目录,如 http:// 服务器 IP 地址 / 别名 / 文件名,就可以访问虚拟目录下面的任何文件了。</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">使用 Alias 选项可以创建虚拟目录。在主配置文件中,Apache 默认已经创建了两个虚拟目录。这两条语句分别建立了“/icons/”和“/manual”两个虚拟目录,它们对应的物理路径分别是“/var/www/icons/”和“/var/www/manual”。在主配置文件中,用户可以看到如下配置语句:</p> <div style="margin: 0px; padding: 0px;"> <div class="syntaxhighlighter notranslate shell ie" id="highlighter_889355" style="margin: 0px; padding: 0px;"> <table style="width: 641px; border-collapse: collapse; border-spacing: 0px; background-color: rgb(255, 255, 255);" border="0" cellspacing="0" cellpadding="0"><tbody><tr> <td class="gutter" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;">1</div> <div class="line number2 index1 alt1" style="margin: 0px 10px 10px; padding: 0px;">2</div> <div class="line number3 index2 alt2" style="margin: 0px 10px 10px; padding: 0px;">3</div> </td> <td class="code" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="container" style="margin: auto; padding: 0px; width: 539.96px; overflow: hidden; background-color: rgb(255, 255, 255);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Alias<span class="Apple-converted-space">&#160;</span></code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>/icons/</code><span class="Apple-converted-space">&#160;</span><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>“</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>/var/www/icons/</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>”</code> </div> <div class="line number2 index1 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code>&#160;</div> <div class="line number3 index2 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Alias<span class="Apple-converted-space">&#160;</span></code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>/manual</code><span class="Apple-converted-space">&#160;</span><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>“</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>/var/www/manual</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>”</code> </div> </div> </td> </tr></tbody></table> </div> </div> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">在实际使用过程中,用户可以自己创建虚拟目录。比如,创建名为 /user 的虚拟目录,它所对应的路径为上面几个例子中常用的 /var/www/html/rhel5:</p> <div style="margin: 0px; padding: 0px;"> <div class="syntaxhighlighter notranslate shell ie" id="highlighter_604871" style="margin: 0px; padding: 0px;"> <table style="width: 641px; border-collapse: collapse; border-spacing: 0px; background-color: rgb(255, 255, 255);" border="0" cellspacing="0" cellpadding="0"><tbody><tr> <td class="gutter" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;">1</div> </td> <td class="code" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="container" style="margin: auto; padding: 0px; width: 543.9px; overflow: hidden; background-color: rgb(255, 255, 255);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Alias<span class="Apple-converted-space">&#160;</span></code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>/test</code><span class="Apple-converted-space">&#160;</span><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>“</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>/var/www/html/rhel5</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>″</code> </div> </div> </td> </tr></tbody></table> </div> </div> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">如果需要对其进行权限设置,可以加入如下语句:</p> <div style="margin: 0px; padding: 0px;"> <div class="syntaxhighlighter notranslate xml ie" id="highlighter_881212" style="margin: 0px; padding: 0px;"> <table style="width: 641px; border-collapse: collapse; border-spacing: 0px; background-color: rgb(255, 255, 255);" border="0" cellspacing="0" cellpadding="0"><tbody><tr> <td class="gutter" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;">1</div> <div class="line number2 index1 alt1" style="margin: 0px 10px 10px; padding: 0px;">2</div> <div class="line number3 index2 alt2" style="margin: 0px 10px 10px; padding: 0px;">3</div> <div class="line number4 index3 alt1" style="margin: 0px 10px 10px; padding: 0px;">4</div> <div class="line number5 index4 alt2" style="margin: 0px 10px 10px; padding: 0px;">5</div> <div class="line number6 index5 alt1" style="margin: 0px 10px 10px; padding: 0px;">6</div> </td> <td class="code" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="container" style="margin: auto; padding: 0px; width: 543.9px; overflow: hidden; background-color: rgb(255, 255, 255);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="xml plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&lt;</code><code class="xml keyword" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Directory</code><span class="Apple-converted-space">&#160;</span><code class="xml plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>“/var/www/html/rhel5”&gt;</code> </div> <div class="line number2 index1 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="xml spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;&#160;&#160;&#160;&#160;</code><code class="xml plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>AllowOverride None</code> </div> <div class="line number3 index2 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="xml spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;&#160;&#160;&#160;&#160;</code><code class="xml plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Options Indexes</code> </div> <div class="line number4 index3 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="xml spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;&#160;&#160;&#160;&#160;</code><code class="xml plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Order allow,deny</code> </div> <div class="line number5 index4 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="xml spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;&#160;&#160;&#160;&#160;</code><code class="xml plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Allow from all</code> </div> <div class="line number6 index5 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="xml spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="xml plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'><code class="xml keyword" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Directory</code><code class="xml plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&gt;</code></code> </div> </div> </td> </tr></tbody></table> </div> </div> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">设置该虚拟目录和目录权限后,可以使用客户端浏览器进行测试验证,采用别名对该目录中的文件进行访问,浏览结果如图 3 所示。</p> <h5 id="fig3" style="margin: 1em 0px; padding: 0px; font-size: 14px;">图 3. 使用虚拟目录的测试结果</h5> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;"><a title="开源 Apache 服务器安全防护技术精要及实战" class="cboxElement" style="color: rgb(28, 61, 114); text-decoration: none;" href="http://upload.chinaz.com/2013/1017/1381977512729.jpg" rel="lightbox[49548]"><img title="" class="alignnone size-full wp-image-49551" style="border: 1px solid rgb(153, 153, 153); margin-right: auto; margin-left: auto; display: block;" alt="iimage003" src="http://www.webjx.com/files/allimg/131017/2050372.jpg" border="0"></a></p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">&#160;</p> <h2 id="major4" style="margin: 1em 0px; padding: 0px; font-size: 18px;"><strong>限制 Apache 服务的运行环境</strong></h2> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">Apache 服务器需要绑定到 80 端口上来监听请求,而 root 是唯一有这种权限的用户,随着攻击手段和强度的增加,这样会使服务器受到相当大的威胁,一但被利用缓冲区溢出漏洞,就可以控制整个系统。为了进一步提高系统安全性,Linux 内核引入 chroot 机制,chroot 是内核中的一个系统调用,软件可以通过调用函数库的 chroot 函数,来更改某个进程所能见到的根目录。</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">chroot 机制即将某软件运行限制在指定目录中,保证该软件只能对该目录及其子目录的文件有所动作,从而保证整个服务器的安全。在这种情况下,即使出现黑客或者不法用户通过该软件破坏或被侵入系统,Linux 系统所受的损坏也仅限于该设定的根目录,而不会影响到整个系统的其他部分。</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">将软件 chroot 化的一个问题是该软件运行时需要的所有程序、配置文件和库文件都必须事先安装到 chroot 目录中,通常称这个目录为 chroot“监牢”。如果在“监牢”中运行 httpd,那么用户根本看不到 Linux 文件系统中那个真正的目录,从而保证了 Linux 系统的安全。</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">在使用该技术的时候,一般情况下需要事先创建目录,并将守护进程的可执行文件 httpd 复制到其中。同时,由于 httpd 需要几个库文件,所以需要把 httpd 程序依赖的几个 lib 文件同时也拷贝到同一个目录下,因此手工完成这一工作是非常麻烦的。幸运的是,用户可以通过使用开源的 jail 软件包来帮助简化 chroot“监牢”建立的过程,具体步骤如下所示:Jail 官方网站是:http://www.jmcresearch.com/projects/。</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">首先将其下载,然后执行如下命令进行源代码包的编译和安装:</p> <div style="margin: 0px; padding: 0px;"> <div class="syntaxhighlighter notranslate shell ie" id="highlighter_965703" style="margin: 0px; padding: 0px;"> <table style="width: 641px; border-collapse: collapse; border-spacing: 0px; background-color: rgb(255, 255, 255);" border="0" cellspacing="0" cellpadding="0"><tbody><tr> <td class="gutter" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;">1</div> <div class="line number2 index1 alt1" style="margin: 0px 10px 10px; padding: 0px;">2</div> <div class="line number3 index2 alt2" style="margin: 0px 10px 10px; padding: 0px;">3</div> </td> <td class="code" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="container" style="margin: auto; padding: 0px; width: 530.16px; overflow: hidden; background-color: rgb(255, 255, 255);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;"><code class="shell comments" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>#tar xzvf jail_1.9a.tar.gz</code></div> <div class="line number2 index1 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell comments" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>#cd jail/src</code> </div> <div class="line number3 index2 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell comments" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>#make</code> </div> </div> </td> </tr></tbody></table> </div> </div> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">jail 软件包提供了几个 Perl 脚本作为其核心命令,包括 mkjailenv、addjailuser 和 addjailsw,他们位于解压后的目录 jail/bin 中。这几个命令的基本用途如下所示:</p> <ul style="margin: 1em 0px; padding: 0px 0px 0px 30px; list-style-type: disc;"> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">mkjailenv:用于创建 chroot“监牢”目录,并且从真实文件系统中拷贝基本的软件环境。</li> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">addjailsw:用于从真实文件系统中拷贝二进制可执行文件及其相关的其它文件(包括库文件、辅助性文件和设备文件)到该“监牢”中。</li> <li style="list-style: inherit; margin: 0px 0px 5px; padding: 0px;">addjailuser:创建新的 chroot“监牢”用户。</li> </ul> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">采用 jail 创建监牢的步骤如下所示;</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">(1)首先需要停止目前运行的 httpd 服务,然后建立 chroot 目录,命令如下所示。该命令将 chroot 目录建立在路径 /root/chroot/httpd 下:</p> <div style="margin: 0px; padding: 0px;"> <div class="syntaxhighlighter notranslate shell ie" id="highlighter_134380" style="margin: 0px; padding: 0px;"> <table style="width: 641px; border-collapse: collapse; border-spacing: 0px; background-color: rgb(255, 255, 255);" border="0" cellspacing="0" cellpadding="0"><tbody><tr> <td class="gutter" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;">1</div> <div class="line number2 index1 alt1" style="margin: 0px 10px 10px; padding: 0px;">2</div> <div class="line number3 index2 alt2" style="margin: 0px 10px 10px; padding: 0px;">3</div> <div class="line number4 index3 alt1" style="margin: 0px 10px 10px; padding: 0px;">4</div> <div class="line number5 index4 alt2" style="margin: 0px 10px 10px; padding: 0px;">5</div> <div class="line number6 index5 alt1" style="margin: 0px 10px 10px; padding: 0px;">6</div> <div class="line number7 index6 alt2" style="margin: 0px 10px 10px; padding: 0px;">7</div> <div class="line number8 index7 alt1" style="margin: 0px 10px 10px; padding: 0px;">8</div> <div class="line number9 index8 alt2" style="margin: 0px 10px 10px; padding: 0px;">9</div> <div class="line number10 index9 alt1" style="margin: 0px 10px 10px; padding: 0px;">10</div> <div class="line number11 index10 alt2" style="margin: 0px 10px 10px; padding: 0px;">11</div> <div class="line number12 index11 alt1" style="margin: 0px 10px 10px; padding: 0px;">12</div> <div class="line number13 index12 alt2" style="margin: 0px 10px 10px; padding: 0px;">13</div> <div class="line number14 index13 alt1" style="margin: 0px 10px 10px; padding: 0px;">14</div> <div class="line number15 index14 alt2" style="margin: 0px 10px 10px; padding: 0px;">15</div> </td> <td class="code" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="container" style="margin: auto; padding: 0px; width: 558.58px; overflow: hidden; background-color: rgb(255, 255, 255);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;"><code class="shell comments" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'># service httpd stop</code></div> <div class="line number2 index1 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell comments" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'># mkjailenv /root/chroot/httpd</code> </div> <div class="line number3 index2 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>kjailenv</code> </div> <div class="line number4 index3 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>A component of Jail (version 1.9<span class="Apple-converted-space">&#160;</span></code><code class="shell keyword" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>for</code><span class="Apple-converted-space">&#160;</span><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>linux)</code> </div> <div class="line number5 index4 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code>&#160;</div> <div class="line number6 index5 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>http:</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>//www</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>.gsyc.inf.uc3m.es/~assman</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>/jail/</code> </div> <div class="line number7 index6 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code>&#160;</div> <div class="line number8 index7 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Juan M. Casillas &lt;assman@gsyc.inf.uc3m.es&gt;&#160;</code> </div> <div class="line number9 index8 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code>&#160;</div> <div class="line number10 index9 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Making chrooted environment into<span class="Apple-converted-space">&#160;</span></code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>/root/chroot/httpd</code> </div> <div class="line number11 index10 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Doing preinstall()</code> </div> <div class="line number12 index11 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Doing special_devices()</code> </div> <div class="line number13 index12 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Doing gen_template_password()</code> </div> <div class="line number14 index13 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Doing postinstall()</code> </div> <div class="line number15 index14 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Done.</code> </div> </div> </td> </tr></tbody></table> </div> </div> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">(2)为“监牢”添加 httpd 程序,命令如下:</p> <div style="margin: 0px; padding: 0px;"> <div class="syntaxhighlighter notranslate shell ie" id="highlighter_106027" style="margin: 0px; padding: 0px;"> <table style="width: 641px; border-collapse: collapse; border-spacing: 0px; background-color: rgb(255, 255, 255);" border="0" cellspacing="0" cellpadding="0"><tbody><tr> <td class="gutter" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;">1</div> <div class="line number2 index1 alt1" style="margin: 0px 10px 10px; padding: 0px;">2</div> <div class="line number3 index2 alt2" style="margin: 0px 10px 10px; padding: 0px;">3</div> <div class="line number4 index3 alt1" style="margin: 0px 10px 10px; padding: 0px;">4</div> <div class="line number5 index4 alt2" style="margin: 0px 10px 10px; padding: 0px;">5</div> <div class="line number6 index5 alt1" style="margin: 0px 10px 10px; padding: 0px;">6</div> <div class="line number7 index6 alt2" style="margin: 0px 10px 10px; padding: 0px;">7</div> <div class="line number8 index7 alt1" style="margin: 0px 10px 10px; padding: 0px;">8</div> <div class="line number9 index8 alt2" style="margin: 0px 10px 10px; padding: 0px;">9</div> <div class="line number10 index9 alt1" style="margin: 0px 10px 10px; padding: 0px;">10</div> <div class="line number11 index10 alt2" style="margin: 0px 10px 10px; padding: 0px;">11</div> <div class="line number12 index11 alt1" style="margin: 0px 10px 10px; padding: 0px;">12</div> <div class="line number13 index12 alt2" style="margin: 0px 10px 10px; padding: 0px;">13</div> </td> <td class="code" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="container" style="margin: auto; padding: 0px; width: 565.45px; overflow: hidden; background-color: rgb(255, 255, 255);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;"><code class="shell comments" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'># ./addjailsw&#160; /root/chroot/httpd/ -P /usr/sbin/httpd&#160;</code></div> <div class="line number2 index1 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code>&#160;</div> <div class="line number3 index2 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>addjailsw</code> </div> <div class="line number4 index3 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>A component of Jail (version 1.9<span class="Apple-converted-space">&#160;</span></code><code class="shell keyword" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>for</code><span class="Apple-converted-space">&#160;</span><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>linux)</code> </div> <div class="line number5 index4 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code>&#160;</div> <div class="line number6 index5 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>http:</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>//www</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>.gsyc.inf.uc3m.es/~assman</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>/jail/</code> </div> <div class="line number7 index6 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code>&#160;</div> <div class="line number8 index7 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Juan M. Casillas &lt;assman@gsyc.inf.uc3m.es&gt;&#160;</code> </div> <div class="line number9 index8 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code>&#160;</div> <div class="line number10 index9 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Guessing<span class="Apple-converted-space">&#160;</span></code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>/usr/sbin/httpd</code><span class="Apple-converted-space">&#160;</span><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>args(0)</code> </div> <div class="line number11 index10 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Warning: can't create<span class="Apple-converted-space">&#160;</span></code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>/proc/mounts</code><span class="Apple-converted-space">&#160;</span><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>from the<span class="Apple-converted-space">&#160;</span></code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>/proc</code><span class="Apple-converted-space">&#160;</span><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>filesystem&#160;</code> </div> <div class="line number12 index11 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code>&#160;</div> <div class="line number13 index12 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>Done.</code> </div> </div> </td> </tr></tbody></table> </div> </div> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">在上述过程中,用户不需要在意那些警告信息,因为 jail 会调用 ldd 检查 httpd 用到的库文件。而几乎所有基于共享库的二进制可执行文件都需要上述的几个库文件。</p> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">(3)然后,将 httpd 的相关文件拷贝到“监牢”的相关目录中,命令如下所示:</p> <div style="margin: 0px; padding: 0px;"> <div class="syntaxhighlighter notranslate shell ie" id="highlighter_574679" style="margin: 0px; padding: 0px;"> <table style="width: 641px; border-collapse: collapse; border-spacing: 0px; background-color: rgb(255, 255, 255);" border="0" cellspacing="0" cellpadding="0"><tbody><tr> <td class="gutter" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;">1</div> <div class="line number2 index1 alt1" style="margin: 0px 10px 10px; padding: 0px;">2</div> <div class="line number3 index2 alt2" style="margin: 0px 10px 10px; padding: 0px;">3</div> </td> <td class="code" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="container" style="margin: auto; padding: 0px; width: 559.56px; overflow: hidden; background-color: rgb(255, 255, 255);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;"><code class="shell comments" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'># mkdir -p /root/chroot/httpd/etc</code></div> <div class="line number2 index1 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell comments" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'># cp &#8211; a /etc/httpd /root/chroot/httpd/etc/</code> </div> <div class="line number3 index2 alt2" style="margin: 0px 10px 10px; padding: 0px;"><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>。。。。。。</code></div> </div> </td> </tr></tbody></table> </div> </div> <p style="margin: 1em 0px; padding: 0px; text-indent: 2em;">添加后的目录结构如下所示:</p> <div style="margin: 0px; padding: 0px;"> <div class="syntaxhighlighter notranslate shell ie" id="highlighter_915988" style="margin: 0px; padding: 0px;"> <table style="width: 641px; border-collapse: collapse; border-spacing: 0px; background-color: rgb(255, 255, 255);" border="0" cellspacing="0" cellpadding="0"><tbody><tr> <td class="gutter" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;">1</div> <div class="line number2 index1 alt1" style="margin: 0px 10px 10px; padding: 0px;">2</div> <div class="line number3 index2 alt2" style="margin: 0px 10px 10px; padding: 0px;">3</div> <div class="line number4 index3 alt1" style="margin: 0px 10px 10px; padding: 0px;">4</div> <div class="line number5 index4 alt2" style="margin: 0px 10px 10px; padding: 0px;">5</div> <div class="line number6 index5 alt1" style="margin: 0px 10px 10px; padding: 0px;">6</div> <div class="line number7 index6 alt2" style="margin: 0px 10px 10px; padding: 0px;">7</div> <div class="line number8 index7 alt1" style="margin: 0px 10px 10px; padding: 0px;">8</div> <div class="line number9 index8 alt2" style="margin: 0px 10px 10px; padding: 0px;">9</div> </td> <td class="code" style="margin: 0px; padding: 5px; border: 1px solid rgb(221, 221, 221);"> <div class="container" style="margin: auto; padding: 0px; width: 563.5px; overflow: hidden; background-color: rgb(255, 255, 255);"> <div class="line number1 index0 alt2" style="margin: 0px 10px 10px; padding: 0px;"><code class="shell comments" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'># ll</code></div> <div class="line number2 index1 alt1" style="margin: 0px 10px 10px; padding: 0px;"><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>总计 56</code></div> <div class="line number3 index2 alt2" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>drwxr-xr-x 2 root root 4096 03-23 13:44 dev</code> </div> <div class="line number4 index3 alt1" style="margin: 0px 10px 10px; padding: 0px;"> <code class="shell spaces" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>&#160;</code><code class="shell plain" style='margin: 0px; padding: 0px; font-family: Consolas, "Courier New", monospace;'>drwxr-xr-x 3 root root 4096 03-23 13:46 etc</code> </div> <div class="line number5 index4 alt2" style="margin

Read more+

17

2018-05
phpwind推进中小网站生态链 启动全国巡回会议

<p> </p> <table style="BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0"><tbody><tr> <td style="WORD-WRAP: break-word" bgcolor="#fdfddf"> <font color="#ff0000">WebjxCom提示:</font><font color="#000000">9月8日,阿里巴巴旗下通用型建站软件phpwind在北京盘古大观七星酒店举行搜索新商机,迎接新朋友全国巡回地面交流会起航之旅发布会。Phpwind、淘宝联盟、新浪微博、淘宝网10大品牌商城、20多家地方与行业网站出席会议。Phpwind CEO王学集表示,phpwind将和新浪微博、淘</font> </td> </tr></tbody></table> <p>  9月8日,阿里巴巴旗下通用型建站软件phpwind在北京盘古大观七星酒店举行“搜索新商机,迎接新朋友”全国巡回地面交流会起航之旅发布会。Phpwind、淘宝联盟、新浪微博、淘宝网10大品牌商城、20多家地方与行业网站出席会议。Phpwind CEO王学集表示,phpwind将和新浪微博、淘宝联盟合作,为中小网站提供内容运营、电子商务等多方位资源,phpwind将举办40场全国巡回的地面交流会,把这些资源推荐给更多的中小网站,帮助中小网站建立良好的生态环境。</p> <p>  phpwind多方跨平台合作 丰富中小网站运营资源</p> <p>  Phpwind在会议介绍了phpwind 的产品开发机会,除了基础产品,还将开发更多基于云平台的应用。phpwind CEO王学集表示,phpwind将尽力建立一个产品和技术平台,除了建站产品之外,能够支撑更多的资源,为phpwind中小网站提供配套的内容运营、商业运营资源。</p> <p>  在发布会上,十大淘宝品牌商家将十锭金元宝送于十大地方网站站长,寓意淘宝百万商家与数百万站长共享电子商务大金矿,淘宝联盟总监闻仲表示,淘宝联盟希望在2010年为站长提供10亿分成。Phpwind和淘宝联盟推进淘宝品牌商家和各网站的对接,将更好的满足淘宝品牌商家拓展营销渠道的需求,也为地方与行业网站带来更好的收入来源。</p> <p>  新浪微博总监芦义介绍,新浪微博已经和phpwind产品的微博组件全面打通,可以与所有使用phpwind微博组件的中小网站共享内容,在将来,将会帮众多中小网站建立一个广阔的内容传播渠道。</p> <p>  DCCI互联网数据中心总经理胡延平在会上表示,以开放平台为基础的开放协作潮流成为互联网发展的一个脉搏,phpwind、淘宝联盟、新浪微博分别作为产品和技术平台、商业资源平台、内容共享和交流平台,相互交织,为中国的中小网站提供了多方位的资源支持。共同打造出一个良性社区生态圈。</p> <p>  启动40场地面交流会 全面覆盖地方级和行业网站</p> <p>  胡延平表示,互联网第三次创业浪潮即将到来,新的互联网浪潮将会形成以开放平台与中小型网站合作的生态环境,每个中小型网站,都需要考虑如何定位自己在生态环境中的位置,哪些平台型的产品可以帮助让网站深度兑现自身资源,这非常考验中小型网站对于互联网生态的理解。</p> <p>  Phpwind CEO王学集介绍,为了全面与各类地方和行业网站深入交流,帮助站长对互联网新的发展浪潮生有更多完整的认识,更便利的获取多方资源,phpwind联合淘宝联盟、新浪微博等合作伙伴,Chinaz、admin5等最具影响力的站长专业媒体,一起进行主题为“搜索新商机,迎接新朋友”全国巡回的地面交流会,覆盖全国24个省份共40个城市。</p> <p>  王学集还透露,phpwind将在12月份在杭州举行一场大规模的地方和行业网站发展大会。</p>

Read more+