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

<channel>
	<title>IT狂人的博客 &#187; Web</title>
	<atom:link href="http://www.yinzhili.com/category/web/feed" rel="self" type="application/rss+xml" />
	<link>http://www.yinzhili.com</link>
	<description>世界上有10种人:一种是懂二进制的，另一种是不懂的。</description>
	<lastBuildDate>Thu, 22 Jul 2010 03:51:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>使用htaccess来增强Wordpress安全性</title>
		<link>http://www.yinzhili.com/2010/07/hardening-wordpress-with-htaccess.html</link>
		<comments>http://www.yinzhili.com/2010/07/hardening-wordpress-with-htaccess.html#comments</comments>
		<pubDate>Tue, 06 Jul 2010 06:47:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[译文]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[安全性]]></category>

		<guid isPermaLink="false">http://www.yinzhili.com/?p=246</guid>
		<description><![CDATA[这是一篇原创译文，转载请注明出处，原文请单击<a href="http://blogsecurity.net/wordpress/article-210607" target="_blank">这里</a>查看。
本文将讨论一些有关于增强Wordpress博客安全性的安全技术，这些技术在那些托管的环境下尤为有效。 
首先我要说明的是本向导并不适合所有人，并且有可能影响一些第三方插件或者模板。 
情况还没有想象中的糟糕，如果你能够应用本向导中的知识，你就可[......]<p class='read-more'><a href='http://www.yinzhili.com/2010/07/hardening-wordpress-with-htaccess.html'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p><span style="color: #3366ff;">这是一篇原创译文，转载请注明出处，原文请单击</span><a href="http://blogsecurity.net/wordpress/article-210607" target="_blank"><span style="color: #3366ff;">这里</span></a><span style="color: #3366ff;">查看。</span></p>
<p>本文将讨论一些有关于增强Wordpress博客安全性的安全技术，这些技术在那些托管的环境下尤为有效。 </p>
<p>首先我要说明的是本向导并不适合所有人，并且有可能影响一些第三方插件或者模板。 </p>
<p>情况还没有想象中的糟糕，如果你能够应用本向导中的知识，你就可以显著地增强你的博客的安全性。包括暴力攻击、插件枚举、目录列表、敏感信息泄露以及文件包含漏洞等类型的攻击都能被阻止。 </p>
<p>重要说明：请确保在操作之前备份好了您的Wordpress文件和数据库。 </p>
<p>步骤1 &#8211; 限制wp-content 和wp-includes</p>
<p>使用 .htaccess 中的 &lt;file&gt; 指令，我们可以限制访问除图像、样式表以及JavaScript之外的文件。这里的 .htaccess 文件看起来如下：</p>
<p>Order Allow,Deny<br />
Deny from all<br />
&lt;Files ~ &#8220;\.(css|jpe?g|png|gif|js)$&#8221;&gt;<br />
 Allow from all<br />
&lt;/Files&gt;</p>
<p>如果你想要允许特定的插件如Democracy被访问，我们可以将下面的指令追加到 wp-content/.htaccess 文件末尾：</p>
<p>&lt;Files &#8220;democracy.php&#8221;&gt;<br />
 Allow from all<br />
&lt;/Files&gt;</p>
<p>将以上内容保存到您的 wp-content 和 wp-includes 目录下的 .htaccess 文件中。补充说明一下，您还可以允许指定的某文件被访问，这样能使您的插件和/或模板正常工作，如果需要的话。这是一个更简洁的办法。</p>
<p>步骤2 &#8211; 限制访问 wp-admin</p>
<p>要限制访问 wp-admin，您有两种选择。选择以下方法中的一种，把包含相应指令的 .htaccess 文件放到您的 wp-admin 目录下。</p>
<p>您可以限制 IP:</p>
<p>order deny,allow<br />
allow from a.b.c.d # 这里的a.b.c.d就是您的静态 IP<br />
deny from all</p>
<p>以上代码将阻止那些IP地址不是 a.b.c.d 的访客通过浏览器访问此目录中的任何文件。这里的“a.b.c.d”应当与您的静态IP地址一致。</p>
<p>或者您还可以通过密码来限制：</p>
<p>AuthUserFile /etc/httpd/htpasswd<br />
AuthType Basic<br />
AuthName &#8220;restricted&#8221;<br />
Order Deny,Allow<br />
Deny from all<br />
Require valid-user<br />
Satisfy any</p>
<p>这里有一个bug。以上的规则代码会引发一个问题，如果那些在您的博客上发表评论的人没有输入邮箱地址，那么就会弹出一个输入密码的输入框。这是因为某些样式表和图片文件也位于wp-admin 目录之中。为了解决这一问题，我们可以将以上的代码包含于文件指令中，这个文件指令只会阻止 .php 文件被访问，不会阻止其它文件。这仍然能够阻止许多直接的攻击，并且同时还提供了许多额外的特性。下面是一个改进版：</p>
<p>&lt;Files ~ &#8220;\.(php)$&#8221;&gt;<br />
AuthUserFile /etc/httpd/htpasswd<br />
AuthType Basic<br />
AuthName &#8220;restricted&#8221;<br />
Order Deny,Allow<br />
Deny from all<br />
Require valid-user<br />
Satisfy any<br />
&lt;/Files&gt;</p>
<p>就是这样，有了这些措施，您的博客将更加安全。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yinzhili.com/2010/07/hardening-wordpress-with-htaccess.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>选择Web开发框架时需要考虑的15个重要因素</title>
		<link>http://www.yinzhili.com/2010/04/15-most-important-considerations-when-choosing-a-web-development-framework.html</link>
		<comments>http://www.yinzhili.com/2010/04/15-most-important-considerations-when-choosing-a-web-development-framework.html#comments</comments>
		<pubDate>Tue, 06 Apr 2010 02:37:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[译文]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[AVC]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[CURD]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[MVP]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[框架]]></category>

		<guid isPermaLink="false">http://www.yinzhili.com/?p=200</guid>
		<description><![CDATA[<div style="color: red; font-weight: bold;">原创译文，未经许可不得转载。
原文地址：<a href="http://net.tutsplus.com/tutorials/other/15-most-important-considerations-when-choosing-a-web-development-framework/">http://net.tutsplus.com/tutorials/other/15-most-important-considerations-when-choosing-a-web-development-framework/</a></div>
    新的Web开发框架正[......]<p class='read-more'><a href='http://www.yinzhili.com/2010/04/15-most-important-considerations-when-choosing-a-web-development-framework.html'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<div style="color: red; font-weight: bold;">原创译文，未经许可不得转载。<br />
原文地址：<a href="http://net.tutsplus.com/tutorials/other/15-most-important-considerations-when-choosing-a-web-development-framework/">http://net.tutsplus.com/tutorials/other/15-most-important-considerations-when-choosing-a-web-development-framework/</a></div>
<p>    新的Web开发框架正在以一种人们无法企及的速度涌现出来。在本文中，我们将会讨论你的下一个热门Web应用程序应该使用什么样的框架。<br />
    在如今这个时代，抢在您的竞争对手之前发布一个已完成的优雅的应用程序是至关重要的。从头开始编写代码(琐碎事情除外)是一件很费时的事，开发者要花很多时间去重新发明轮子，而这些时间如果用于开发新功能或完善代码会更好。<br />
    这就是Web开发框架存在的理由。它们往往已经包含了应用程序中所有的通用模块，包括数据库存取、权限控制、会话管理以及其它更多功能。<br />
    今天，我们将会讨论的是，你在选择一个框架之前所需要关心的各方面因素。有兴趣吗？那就马上开始。</p>
<h2>1. 使用环境</h2>
<p><a href="http://www.yinzhili.com/wp-content/uploads/2010/04/1.jpg"><img class="aligncenter size-full wp-image-202" title="图1" src="http://www.yinzhili.com/wp-content/uploads/2010/04/1.jpg" alt="" width="500" height="375" /></a><br />
    在你开始考察一个框架之前，你需要列出你的需求，看看这框架能否满足它们。<br />
    如果符合下面这些情形，你需要使用框架：<br />
        你的应用程序主要基于CRUD操作；<br />
        你需要将UI与底层逻辑合理地分开，但你没有时间去实现一个合适的系统；<br />
        你发现你为自己的Web应用程序所编写的程序库覆盖了用户授权、会话以及其它相关的常用功能；<br />
        你的老板希望你能在两天内为他开发一个CMS，而且你已经对框架有所了解；</p>
<p>如果符合下面这些情形，你就不需要框架：<br />
    你需要一个单独的漂亮的URL系统；<br />
    你只需要框架的某一特定部分，如ORM；<br />
    你的时间很紧，而且你必须从头开始学习框架；<br />
    有人告诉你框架能治疗癌症；</p>
<h2>2. 许<a href="http://www.yinzhili.com/wp-content/uploads/2010/04/2.jpg"></a>可证</h2>
<p><a href="http://www.yinzhili.com/wp-content/uploads/2010/04/2.jpg"><img class="aligncenter size-full wp-image-203" title="2" src="http://www.yinzhili.com/wp-content/uploads/2010/04/2.jpg" alt="" width="550" height="475" /></a></p>
<p>    在你开始使用框架进行开发之前，你得看一下这个框架是基于什么许可证发布的。尽管大部分许可证对于商业应用开发来说是自由的，但仍有一部分不那么自由。你最不希望看到的情况就是，你做完了整个应用程序后才发现，框架的许可证不允许你以商业形式发布代码。事先做好研究功课总好过事后的痛苦。<br />
    切记这不仅仅限制框架本身。你用于额外功能的插件或者扩展项都可能有一个隐藏的使用条款，所以你还得检查一下它的许可证才行。</p>
<h2>3. 软件模式</h2>
<p><a href="http://www.yinzhili.com/wp-content/uploads/2010/04/3.jpg"><img class="aligncenter size-full wp-image-204" title="3" src="http://www.yinzhili.com/wp-content/uploads/2010/04/3.jpg" alt="" width="500" height="400" /></a></p>
<p>    几乎所有的框架都无一例外地使用了MVC模式。MVC代表的是Model(模型)-View(视图)-Controller(控制器)，帮助你保存数据：模型，业务逻辑——控制器以及用户界面——视图，都是各自分开的。这些允许你编写更好更完善的代码，最终完成更好的应用程序。大家都用MVC并不代表你只需要知道这么多。还有其他不同的变种，包括MVP:Model(模型)-View(视图)-Presenter(呈现器), MVA: Model(模型)-View(视图)-Adapter(适配器) 以及 AVC: Application(应用程序)-View(视图)-Controller(控制器)。</p>
<h2>4. 主机需求</h2>
<p><a href="http://www.yinzhili.com/wp-content/uploads/2010/04/4.jpg"><img class="aligncenter size-full wp-image-205" title="4" src="http://www.yinzhili.com/wp-content/uploads/2010/04/4.jpg" alt="" width="600" height="396" /></a><br />
    作为Web开发者，我们可能更倾向于使用最尖端最顶级的平台，但是我们往往先要考虑到客户的需求以及预算的限制。使用独享主机来发布我们的应用程序往往会导致超出预算，因此我们不得不使用那些拥有正常模块和配置的共享主机。<br />
能很好兼容共享主机的框架包括：<br />
CodeIgniter<br />
CakePHP<br />
Kohana<br />
Zend Framework<br />
大多数其它 PHP框架</p>
<p>安装起来相对复杂的框架包括：</p>
<p>Ruby on Rails<br />
Django<br />
Pylons<br />
大多数非PHP框架</p>
<p>    事实上，你还是能够在共享主机上运行类似于Django的框架，前提是服务器上已经安装了必需的模块。你也可以在CGI模式下运行它，但速度会比原生模式慢很多。</p>
<h2>5. 安装容易程度</h2>
<p><a href="http://www.yinzhili.com/wp-content/uploads/2010/04/5.jpg"><img class="aligncenter size-full wp-image-206" title="5" src="http://www.yinzhili.com/wp-content/uploads/2010/04/5.jpg" alt="" width="575" height="322" /></a></p>
<p>    选择框架时，安装容易程度也是很重要的因素。一个框架，无论是重量级还是轻量级，如果使用者需要经过一系列繁琐步骤才能安装并且运行它，这就是问题了。<br />
    当应用程序已准备就绪并且测试完成，需要发布到生产服务器上的时候，这也会导致一个大问题。在这种情况下，一个安装和部署都很简单的框架就很有意义。<br />
    对大多数框架而言，安装过程和设置配置文件中的正确参数一样简单，然而对其它框架来说就是一件费时费力的事情。选择一个能让你尽快上手运行的框架。</p>
<h2>6. 学习曲线</h2>
<p><a href="http://www.yinzhili.com/wp-content/uploads/2010/04/6.jpg"><img class="aligncenter size-full wp-image-207" title="6" src="http://www.yinzhili.com/wp-content/uploads/2010/04/6.jpg" alt="" width="550" height="367" /></a></p>
<p>    每个框架都有它自己的小宇宙：命名规范、目录结构以及诸如此类的东西。某些框架在这方面非常灵活，而其它的就非常严格，例如在出现极小的错误时要抛出错误都非常繁琐。<br />
    某些框架在实现一个功能的时候会遵循一个规范，而其它的就各行其是。<br />
    在选择框架的时候，记住要选择学习曲线最平缓的那个。如果你不知道这框架是用什么语言编写的，那就必须把学习这语言本身的学习曲线也考虑在内。我曾见过不少从CakePHP转向Django的开发者，他们不得不同时学习Python和Django，因此他们纷纷表示压力很大。<br />
    如果你需要同时学习框架和它所使用的语言，你就得悠着点了。</p>
<h2>7. 代码库</h2>
<p><a href="http://www.yinzhili.com/wp-content/uploads/2010/04/7.jpg"><img class="aligncenter size-full wp-image-208" title="7" src="http://www.yinzhili.com/wp-content/uploads/2010/04/7.jpg" alt="" width="530" height="282" /></a></p>
<p>让我们面对这样一个现实，那就是，人们接受一个框架是因为它的核心库。库必须能让你从编写重复代码的过程中解脱出来，同时也能允许你自行增加更多的功能和特性。<br />
大多数框架提供了以下大部分功能的类库：<br />
AJAX<br />
身份验证<br />
授权<br />
缓存<br />
数据清理<br />
数据验证<br />
模板<br />
URL 映射和重写</p>
<p>    当然，并不是人人都需要一个包罗万象的框架。很多人更希望框架能处理小部分功能而让开发者来处理剩下的那部分。在这些情况下，你需要确保你所考虑的框架是否只拥有你所需要的特性。<br />
    目前框架中流行的趋势是以类库的形式创建框架。换句话说，它允许你根据需要来对库进行替换。在这方面的绝佳典范就是Pylons。它甚至允许你替换它的大多数部分，从ORM到模板语言都行。相对于那些紧耦合的框架，人们喜欢这种松耦合的框架。</p>
<h2>8. 数据库抽象以及ORM</h2>
<p><a href="http://www.yinzhili.com/wp-content/uploads/2010/04/8.jpg"><img class="aligncenter size-full wp-image-209" title="8" src="http://www.yinzhili.com/wp-content/uploads/2010/04/8.jpg" alt="" width="362" height="438" /></a></p>
<p>    几乎所有应用程序都要存取数据库。如论如何，你都要在开发整个应用程序的过程中这么做，大多数框架都提供了数据库存取类给你使用。因此，当你在选择应用程序的时候，选择能使你的应用程序变得与数据库无关的那一个。万一你要切换数据库，而如果你的框架为你做了这些工作的话，你永远都不用在数据库那部分操心。<br />
    你所要考虑的第二部分就是框架的ORM功能。不需太多技巧，ORM或者Object Relational Mapping(对象关系映射)允许你将数据以对象的形式表现出来，并且将它与其它对象关联起来。如果你想的话，想象一下一个能够获取信息的对象数据库。<br />
包含了ORM特性的框架包括：CakePHP、Django以及Ruby。使用类似Pylons的框架的时候你甚至可以用你自己选择的ORM。</p>
<h2>9. 内置的JS库</h2>
<p><a href="http://www.yinzhili.com/wp-content/uploads/2010/04/9.jpg"><img class="aligncenter size-full wp-image-210" title="9" src="http://www.yinzhili.com/wp-content/uploads/2010/04/9.jpg" alt="" width="475" height="396" /></a></p>
<p>    争论的另一点就是捆绑的JavaScript库。大多数允许你轻松地切换，然而框架内置的AJAX方法大多数情况下仍然只针对某一特定的JS库。这种潜规则意味着你将不得不手动去开发那一功能。<br />
    另一方面，提供了通用方法的那些框架对你来说的好处是，你可以轻而易举地切换你要使用的JavaScript库。<br />
仅供参考：CakePHP和Ruby on Rails能够以标准形式在Prototype和Scriptaculous之间切换。</p>
<h2>10. 单元测试</h2>
<p><a href="http://www.yinzhili.com/wp-content/uploads/2010/04/10.jpg"><img class="aligncenter size-full wp-image-211" title="10" src="http://www.yinzhili.com/wp-content/uploads/2010/04/10.jpg" alt="" width="308" height="502" /></a></p>
<p>    我就是那种极其依赖于单元测试的开发者。维基百科上对单元测试的定义是这样的：<br />
单元测试是一种软件检验测试方法，程序员可以通过它来测试源代码中的单个部分是否符合要求。一个单元就是应用程序中最小的可测试的部分。<br />
    在这种情况下，能让我编写单元测试的框架对我很有益处。很多框架，如CodeIgniter、CakePHP还有Zend都允许你创建自定义的测试，作为对核心测试的补充，目的是对应用程序的重要部分进行检查。</p>
<h2>11. 可伸缩性</h2>
<p><a href="http://www.yinzhili.com/wp-content/uploads/2010/04/11.jpg"><img class="aligncenter size-full wp-image-212" title="11" src="http://www.yinzhili.com/wp-content/uploads/2010/04/11.jpg" alt="" width="550" height="388" /></a></p>
<p>    一般的Web开发者不必考虑框架的可伸缩性问题。通常情况下I/O和网络延迟比框架的可伸缩性更为重要。甚至Twitter那神话般的可伸缩性问题都不是所考虑的框架本身的过错。如果有人要求你放弃一个框架并指出它的伸缩问题，你可以笑而不语。伸缩问题的原因很少由框架产生。当然你也可以对代码稍作优化，但是通常情况下伸缩问题的主要原因在别的方面。</p>
<h2>12. 文档</h2>
<p><a href="http://www.yinzhili.com/wp-content/uploads/2010/04/12.jpg"><img class="aligncenter size-full wp-image-213" title="12" src="http://www.yinzhili.com/wp-content/uploads/2010/04/12.jpg" alt="" width="575" height="309" /></a><br />
    框架的文档往往是它能否成功的关键。解释详尽的文档能够吸引更多用户和爱好者。质量差的、令人费解的文档会使人们感到迷惑并且惹恼他们，使他们放弃该框架。<br />
    寻找一个文档中包含有丰富的范例、实例代码、文章以及教程的框架。</p>
<h2>13. 社区</h2>
<p><a href="http://www.yinzhili.com/wp-content/uploads/2010/04/13.jpg"><img class="aligncenter size-full wp-image-214" title="13" src="http://www.yinzhili.com/wp-content/uploads/2010/04/13.jpg" alt="" width="464" height="354" /></a></p>
<p>    尽管有合适的文档，但你不可避免地还是会遇到需要解决的问题，因此你需要去框架的支持社区寻求帮助。我个人已经在很多个社区进行过交流，其中一个社区的成员尖酸刻薄地对新手进行嘲笑，然而另一个社区的成员们却十分热心地为新手提供力所能及的帮助。因此对于最终选择的是哪个框架开始工作的这一问题，我就不做解释了。<br />
    如果一直如此，支持社区将会成就或者毁掉一个框架。社区成员表现得这样急功近利的话，你将会对框架心生怨恨，而不是那些人。社区成员表现得彬彬有礼的话，你就会更倾向于选择那个框架。如果框架拥有友好的社区，能够为新开发者提供帮助的话，那就选择它。</p>
<h2>14. Bug 修复/更新</h2>
<p><a href="http://www.yinzhili.com/wp-content/uploads/2010/04/14.jpg"><img class="aligncenter size-full wp-image-215" title="14" src="http://www.yinzhili.com/wp-content/uploads/2010/04/14.jpg" alt="" width="550" height="344" /></a></p>
<p>    Web开发者们不愿意自己编写框架的原因之一是他们将要独自完成bug的修复以及更新工作。而对于一个大的框架，每天都有成千上万的开发者对代码进行审视。一旦发现有bug，就能立即得到修复。<br />
    选择一个不那么死气沉沉的框架。你不希望有黑客来告诉你框架有个安全漏洞可以被用来入侵你的网站吧。相对而言，你更希望由框架的开发者们给你提供一个补丁来修正问题。 选择一个更新频繁的框架，更重要的是该框架是开放性的，大家都能发现bugs和尽快修复它们。</p>
<h2>15. 创建扩展的容易程度以及可用性</h2>
<p><a href="http://www.yinzhili.com/wp-content/uploads/2010/04/15.jpg"><img class="aligncenter size-full wp-image-216" title="15" src="http://www.yinzhili.com/wp-content/uploads/2010/04/15.jpg" alt="" width="564" height="339" /></a></p>
<p>    尽管框架覆盖了一个应用程序的重要基础部分，但是你还需要编写一些代码。尽量使它变得通用，这样你就可以在你的其它应用程序中对它进行重用，甚至是公开发布给人们使用。<br />
    选择一个能够让你轻松进行扩展的框架。以CakePHP为例，扩展一个控制器需要顾及到各个组件以及由辅助函数和视图。无论是那种情况，创建一个扩展就像定义一个继承于父类的子类一样简单。<br />
    选择框架的时候，记住要考虑到插件的可用性。通常情况下你没有时间从头开始创建一个自定义扩展。拥有一个巨大的扩展库可供选择，这就在很大程度上解决了这一问题。扩展的质量比数量更重要。</p>
<h2>结论</h2>
<p>    现在我们已经讨论了你在选择框架之前所应该考虑的各个方面，包含从框架是否满足需要到bug修复和更新在内的所有内容。但愿这对你有所帮助，也希望你能觉得有趣。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yinzhili.com/2010/04/15-most-important-considerations-when-choosing-a-web-development-framework.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>通过伪造Referer来解决外链问题</title>
		<link>http://www.yinzhili.com/2010/01/the-anti-leech-issue-and-referer.html</link>
		<comments>http://www.yinzhili.com/2010/01/the-anti-leech-issue-and-referer.html#comments</comments>
		<pubDate>Fri, 08 Jan 2010 07:47:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[外链]]></category>
		<category><![CDATA[盗链]]></category>

		<guid isPermaLink="false">http://www.yinzhili.com/?p=163</guid>
		<description><![CDATA[什么是Referer?
Referer是HTTP Header的一个字段，当浏览器向服务器发送请求的时候一般会包含Referer信息，这一字段保存的是访客的来源URI。
以PHP为例，通过输出$_SERVER变量，你就可以看到HTTP_REFERER信息：
<div id="attachment_164" class="wp-caption aligncenter" style="width: 509px"><a href="http://www.yinzhili.com/wp-content/uploads/2010/01/01.png"><img src="http://www.yinzhili.com/wp-content/uploads/2010/01/01.png" alt="图1" title="图1" width="499" height="197" class="size-full wp-image-164" /></a>图1</div>
如今很多知名的网络相册(如网易相册、[......]<p class='read-more'><a href='http://www.yinzhili.com/2010/01/the-anti-leech-issue-and-referer.html'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>什么是Referer?<br />
Referer是HTTP Header的一个字段，当浏览器向服务器发送请求的时候一般会包含Referer信息，这一字段保存的是访客的来源URI。</p>
<p>以PHP为例，通过输出$_SERVER变量，你就可以看到HTTP_REFERER信息：<br />
<div id="attachment_164" class="wp-caption aligncenter" style="width: 509px"><a href="http://www.yinzhili.com/wp-content/uploads/2010/01/01.png"><img src="http://www.yinzhili.com/wp-content/uploads/2010/01/01.png" alt="图1" title="图1" width="499" height="197" class="size-full wp-image-164" /></a><p class="wp-caption-text">图1</p></div></p>
<p>如今很多知名的网络相册(如网易相册、百度相册、51相册等等)都限制了外链，我不知道它们用什么方式实现，但是目前而言大多数防盗链的机制都是基于对Referer的判断来实现的。<br />
比如说，我有一个网站，其中一个页面地址是 http://example.com/test.html，里面需要外链一张猫扑的图片，因此，image.html里面可以这么写：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;img src=&quot;http://upload3.mop.com/upload3/2009/12/18/08/1261139622733.jpg&quot;/&gt;</pre></td></tr></table></div>

<p>但是我们会发现这样外链的图片是无法显示出来的。原因在于，当我们访问http://example.com/test.html时，浏览器会向upload3.mop.com也就是猫扑的服务器发送一个请求，这一请求中包含的Referer信息应该就是这样：</p>
<p>http://example.com/test.html</p>
<p>这样，猫扑的服务器就可以判断出这是一个来自外部网站的请求，从而予以拒绝，这样我们就无法显示这张图片了。</p>
<p>那么，应该如何解决这一问题呢? 用火狐浏览器的可能知道，火狐有个插件叫做RefControl，可以用它来伪造Referer，从而正常显示图片。但是如果你是站长，你总不能要求你的访客都使用火狐浏览器对吧？即便你所有的访客都使用火狐浏览器，你也很难保证他们都安装了RefControl这个插件。<br />
这样，我们只能从程序方面入手解决问题：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">ob_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$img</span><span style="color: #339933;">=</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'url'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$host</span><span style="color: #339933;">=</span><span style="color: #000088;">$path</span><span style="color: #339933;">=</span><span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'http://'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">''</span><span style="color: #339933;">,</span><span style="color: #000088;">$img</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$host</span><span style="color: #339933;">=</span><span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">,</span><span style="color: #000088;">$host</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$host</span><span style="color: #339933;">=</span><span style="color: #000088;">$host</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$path</span><span style="color: #339933;">=</span><span style="color: #990000;">strstr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$fp</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fsockopen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$host</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">80</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errno</span><span style="color: #339933;">,</span> <span style="color: #000088;">$errstr</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">30</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #339933;">@</span><span style="color: #990000;">fputs</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;GET <span style="color: #006699; font-weight: bold;">$path</span> HTTP/1.1<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #339933;">@</span><span style="color: #990000;">fputs</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Host: <span style="color: #006699; font-weight: bold;">$host</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #339933;">@</span><span style="color: #990000;">fputs</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Accept: */*<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #339933;">@</span><span style="color: #990000;">fputs</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Referer: http://<span style="color: #006699; font-weight: bold;">$host</span>/<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #339933;">@</span><span style="color: #990000;">fputs</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #339933;">@</span><span style="color: #990000;">fputs</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Connection: Close<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$Content</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fread</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">4096</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000088;">$Content</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$str</span><span style="color: #339933;">;</span>
<span style="color: #339933;">@</span><span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pos</span><span style="color: #339933;">=</span><span style="color: #990000;">strpos</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$Content</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$head</span><span style="color: #339933;">=</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$Content</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #000088;">$pos</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$text</span><span style="color: #339933;">=</span><span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$Content</span><span style="color: #339933;">,</span><span style="color: #000088;">$pos</span><span style="color: #339933;">+</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$head</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$text</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>实际上这就是通过伪造Referer来实现我们想要的效果。<br />
我们把这段程序保存为redirect.php，放到服务器上，例如http://example.com/redirect.php，那么，接下来我们只需要将原来的外链图片地址经由这段程序处理，就可以正常显示。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;img src=&quot;http://example.com/redirect.php?url=http://upload3.mop.com/upload3/2009/12/18/08/1261139622733.jpg&quot;/&gt;</pre></td></tr></table></div>

<p>效果如下：<br />
<div id="attachment_165" class="wp-caption aligncenter" style="width: 368px"><a href="http://www.yinzhili.com/wp-content/uploads/2010/01/02.png"><img src="http://www.yinzhili.com/wp-content/uploads/2010/01/02.png" alt="图2" title="图2" width="358" height="427" class="size-full wp-image-165" /></a><p class="wp-caption-text">图2</p></div></p>
<p>由此可见，Referer信息不一定可靠，因为它是可以伪造出来的，通过这一手段来防盗链并不是一个完美的办法。<br />
同时，我们也应该尽可能少的外链文件，毕竟大多数服务器都有带宽的限制和成本的考虑，限制外链对它们的生存也是很重要的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yinzhili.com/2010/01/the-anti-leech-issue-and-referer.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>phpMyAdmin升级到3.2.x版遇到的常见问题</title>
		<link>http://www.yinzhili.com/2009/09/problems-you-will-encounter-when-using-phpmyadmin3.html</link>
		<comments>http://www.yinzhili.com/2009/09/problems-you-will-encounter-when-using-phpmyadmin3.html#comments</comments>
		<pubDate>Wed, 30 Sep 2009 02:32:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[MYSQL]]></category>
		<category><![CDATA[phpMyAdmin]]></category>

		<guid isPermaLink="false">http://www.yinzhili.com/?p=93</guid>
		<description><![CDATA[phpMyAdmin是一个用PHP编写的基于Web的MySQL管理工具。从事过PHP+MySQL开发的朋友肯定接触过它，非常方便。最近把电脑上的phpMyAdmin升级到了3.2.2版，遇到了一些问题，在此总结一下。
1. “空密码登录被禁止” &#160;问题
很多时候我们在本机测试时会将root[......]<p class='read-more'><a href='http://www.yinzhili.com/2009/09/problems-you-will-encounter-when-using-phpmyadmin3.html'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>phpMyAdmin是一个用PHP编写的基于Web的MySQL管理工具。从事过PHP+MySQL开发的朋友肯定接触过它，非常方便。最近把电脑上的phpMyAdmin升级到了3.2.2版，遇到了一些问题，在此总结一下。</p>
<p>1. <font color="Red">“空密码登录被禁止”</font> &nbsp;问题<br />
很多时候我们在本机测试时会将root用户密码设置为空。但升级到phpMyAdmin 3.2.2版的时候，会遇到无法以空密码登录root用户的情况。怎么解决呢? 请参照如下步骤：<br />
(1) 找到你的phpMyAdmin程序所在的目录，这个根据你个人的情况有所不同。<br />
(2) 打开 phpMyAdmin\libraries\ 路径下的 <strong>config.default.php</strong> 这个文件，找到下面这行</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$cfg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Servers'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'AllowNoPassword'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span></pre></div></div>

<p>将其修改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$cfg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'Servers'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'AllowNoPassword'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span></pre></div></div>

<p>(3) 重新访问你的phpMyAdmin，你会发现空密码的root用户也可以登录了。</p>
<p>2. <font color="Red">“配置文件现在需要一个短语密码”</font>&nbsp;问题<br />
在登录进去之后可能会看到<font color="Red">“配置文件现在需要一个短语密码”</font>这条警告信息。这是因为你没有设置一个用来给Cookie加密的密钥。解决方法还是首先打开上文所说的 config.default.php 文件，并找到下面这行</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$cfg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'blowfish_secret'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span></pre></div></div>

<p>将其修改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$cfg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'blowfish_secret'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'你的密钥'</span><span style="color: #339933;">;</span></pre></div></div>

<p>说明: 这里的“你的密钥”是你所设置的密钥字符串，可以随意设置。<br />
修改保存之后，重新登录phpMyAdmin就可以了。</p>
<p>3. <font color="Red">“无法载入mcrypt扩展”</font>&nbsp;问题<br />
这个问题与phpMyAdmin没有多少关系，是因为你的 PHP 运行环境没有开启mcrypt扩展。以Windows下为例，首先你要确保PHP目录的ext子目录下有 php_mcrypt.dll 这个文件，没有的话去网上下载一个。然后打开你的 php.ini 文件，找到下面这行</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">;</span>extension<span style="color: #339933;">=</span>php_mcrypt<span style="color: #339933;">.</span>dll</pre></div></div>

<p>去掉这行行首的分号，保存，然后重启Apache就可以开启mcrypt支持了。这个时候重新登陆phpMyAdmin，此问题就已经解决。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yinzhili.com/2009/09/problems-you-will-encounter-when-using-phpmyadmin3.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Techified主题的footer文件解密版</title>
		<link>http://www.yinzhili.com/2009/08/wordpress-techified-theme-footer.html</link>
		<comments>http://www.yinzhili.com/2009/08/wordpress-techified-theme-footer.html#comments</comments>
		<pubDate>Wed, 19 Aug 2009 07:45:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[footer]]></category>
		<category><![CDATA[techified]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.yinzhili.com/?p=43</guid>
		<description><![CDATA[众所周知Wordpress是一个开放的平台，各种免费和收费的主题层出不穷。其中有一款名叫&#8221;Techified&#8221;的主题我非常喜欢，现在我用的就是它。然而这款主题的作者为了保留版权信息，居然将footer部分加密，我无法猜测他用的是什么算法(因为我用Base64解密程序是无法将它[......]<p class='read-more'><a href='http://www.yinzhili.com/2009/08/wordpress-techified-theme-footer.html'>继续阅读</a></p>]]></description>
			<content:encoded><![CDATA[<p>众所周知Wordpress是一个开放的平台，各种免费和收费的主题层出不穷。其中有一款名叫&#8221;Techified&#8221;的主题我非常喜欢，现在我用的就是它。然而这款主题的作者为了保留版权信息，居然将footer部分加密，我无法猜测他用的是什么算法(因为我用Base64解密程序是无法将它解密的)，总之直接解密可能会很麻烦，但是就像很多站长那样，我们都希望在footer部分加入一些信息，比如备案信息或者统计代码之类。幸好在一个论坛上(抱歉，我都忘了是哪个论坛了)发现一位高手写了一份解密版的代码，我试着用在了现在的主题上，确实可用，因此在这里共享一下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&nbsp;
&lt;div id=&quot;footer_area&quot;&gt;&lt;div id=&quot;footer_area_content&quot;&gt;
                        &lt; ?php include (TEMPLATEPATH . '/footer_content.php'); ?&gt; 
                &lt;/div&gt;
        &lt;/div&gt;
        &lt;div id=&quot;footer_bottom&quot;&gt;
                &lt;div id=&quot;footer_bottom_content&quot;&gt; Copyright &amp;copy; &lt; ?php echo gmdate(__('Y')); ?&gt; &lt;a href=&quot;&lt;?php echo get_settings('home'); ?&gt;&quot;&gt;&lt; ?php bloginfo('name'); ?&gt;&lt;/a&gt;. &lt;a href=&quot;http://www.technologytricks.com/techified-just-another-premium-wordpress-themes/&quot;&gt;Techified&lt;/a&gt; theme by &lt;a href=&quot;http://www.ifreecellphones.com/&quot;&gt;Cell Phones&lt;/a&gt;. Supported by &lt;a href=&quot;http://www.ifreecellphones.com/cheap-verizon-wireless-phones.asp&quot;&gt;Verizon Wireless&lt;/a&gt;, &lt;a href=&quot;http://www.ifreecellphones.com/cheap-t-mobile-phones.asp&quot;&gt;T-Mobile&lt;/a&gt; &amp;amp; &lt;a href=&quot;http://www.ifreecellphones.com/cheap-sprint-pcs-phones.asp&quot;&gt;Sprint&lt;/a&gt;
&lt;/div&gt;
        &lt;/div&gt;</pre></td></tr></table></div>

<p>说明：请尊重设计者的劳动成果，在这一文件的基础上添加自己的信息就可以了，不要修改或删除作者原有的链接。</p>
<p>补充说明：网友 <strong>最后块烧饼</strong> 提醒说，上面这段代码可能会引发错位问题，虽然我测试时没有遇到，但还是感谢他/她给予的指正。你可以在 <a href="http://www.onlysb.com/design/180.html">这里</a> 看到他/她制作的完美版。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.yinzhili.com/2009/08/wordpress-techified-theme-footer.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
