<?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>Fwolf's Blog &#187; tips - Fwolf's Blog</title>
	<atom:link href="http://www.fwolf.com/blog/post/tag/tips/feed" rel="self" type="application/rss+xml" />
	<link>http://www.fwolf.com/blog</link>
	<description>随心·随意·随缘·努力～</description>
	<lastBuildDate>Sun, 29 Aug 2010 14:52:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>[Git]初学者注意事项</title>
		<link>http://www.fwolf.com/blog/post/446</link>
		<comments>http://www.fwolf.com/blog/post/446#comments</comments>
		<pubDate>Tue, 04 Aug 2009 13:57:05 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Svn/Git]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[newbie]]></category>
		<category><![CDATA[rule]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/?p=446</guid>
		<description><![CDATA[实在是受不了有些人的 Git 提交，费大力气“回滚”，遂整理了这些刚开始用 git 或者还没有建立 scm 概念时容易犯的错误。 和源码无关的东西，尽量不要进仓库 不得不说一些图形化软件，在提交内容的时候大多提供一个“全选”或者“Select All”功能，这是最不好的了，一些懒惰的同志看都不看就连瓢带碗都提交了。 测试时上传的文件，测试时的临时文件，统统不要 对应上一条，强烈建议把所有文件的上传保存目录另行设置，放到源代码目录以外 编辑器产生的备份文件、临时文件，编译时的中间文件，统统不要 对应上一条，有个例外就是为了实现通过 Git 更新系统，.NET 的 bin 文件要进仓库，导致那个仓库现在都 100+m 了 图片等资源文件，进仓库也可以，但应当使用有意义的文件名，便于后期管理 对应上一条，现在设计网站界面喜欢先作图然后切割，产生一大堆 001_r5_c1.jpg 这样的文件，讨厌之极 使用的外部类库，比如 php 类、js 类等，统统扔到源码目录以外，如果实在没办法要放在目录树中，也可以留出空目录，打包发行的时候再包含进来，依然不进代码仓库 不要中文文件名，主要是跨平台使用有问题，文件名完全能够只用字母数字减号下划线 尽量采用相对小、相对独立的提交 Git 是作什么用的？Git 不是代码上传工具，也不是网站更新工具，而是软件开发过程的记录工具，为了更加准确的定位每个问题、每个功能修改，就需要在每完成一部分可以称得上是“一项”的工作时，就 commit 一次。哪怕只是修改了一两行，只要产生了必要的功能改变，就有价值记录。 当采用代码审核机制或者需要用邮件提交补丁时，较小的提交能够更有效、更容易、更准确的被检查和审核，这个在 linux kernel 开发文档中也有提到。 当然不能矫枉过正，必须有可记录的改变才有提交的价值。对应的，Git 日志大多数情况下主要显示第一行，控制每次提交都能用一句话简单概括，也是有必要的。 注释格式 格式属于个人习惯和团队规范范围，有必要采用相对统一的风格。 Git 本身不允许空注释，同时建议注释的第一行写简要说明，下面留一行空行，再写详细说明。 我的个人习惯，喜欢在每条注释前面用大约三个字母来表示本次修改的性质： Add something Bug [fix&#124;found]: describe the bug or [...]]]></description>
			<content:encoded><![CDATA[<p>实在是受不了有些人的 Git 提交，费大力气“<a href="441">回滚</a>”，遂整理了这些刚开始用 git 或者还没有建立 scm 概念时容易犯的错误。</p>

<h3>和源码无关的东西，尽量不要进仓库</h3>

<p>不得不说一些图形化软件，在提交内容的时候大多提供一个“全选”或者“Select All”功能，这是最不好的了，一些懒惰的同志看都不看就连瓢带碗都提交了。</p>

<ul>
<li>测试时上传的文件，测试时的临时文件，统统不要</li>
<li>对应上一条，强烈建议把所有文件的上传保存目录另行设置，放到源代码目录以外</li>
<li>编辑器产生的备份文件、临时文件，编译时的中间文件，统统不要</li>
<li>对应上一条，有个例外就是为了实现通过 Git 更新系统，.NET 的 bin 文件要进仓库，导致那个仓库现在都 100+m 了</li>
<li>图片等资源文件，进仓库也可以，但应当使用有意义的文件名，便于后期管理</li>
<li>对应上一条，现在设计网站界面喜欢先作图然后切割，产生一大堆 001_r5_c1.jpg 这样的文件，讨厌之极</li>
<li>使用的外部类库，比如 php 类、js 类等，统统扔到源码目录以外，如果实在没办法要放在目录树中，也可以留出空目录，打包发行的时候再包含进来，依然不进代码仓库</li>
<li>不要中文文件名，主要是跨平台使用有问题，文件名完全能够只用字母数字减号下划线</li>
</ul>

<h3>尽量采用相对小、相对独立的提交</h3>

<p>Git 是作什么用的？Git 不是代码上传工具，也不是网站更新工具，而是软件开发过程的记录工具，为了更加准确的定位每个问题、每个功能修改，就需要在每完成一部分可以称得上是“一项”的工作时，就 commit 一次。哪怕只是修改了一两行，只要产生了必要的功能改变，就有价值记录。</p>

<p>当采用代码审核机制或者需要用邮件提交补丁时，较小的提交能够更有效、更容易、更准确的被检查和审核，这个在 <a href="http://wiki.zh-kernel.org/doc/%E5%A6%82%E4%BD%95%E5%8F%82%E4%B8%8E_linux_%E5%86%85%E6%A0%B8%E5%BC%80%E5%8F%91">linux kernel 开发文档</a>中也有提到。</p>

<p>当然不能矫枉过正，必须有可记录的改变才有提交的价值。对应的，Git 日志大多数情况下主要显示第一行，控制每次提交都能用一句话简单概括，也是有必要的。</p>

<h3>注释格式</h3>

<p>格式属于个人习惯和团队规范范围，有必要采用相对统一的风格。</p>

<p>Git 本身不允许空注释，同时建议注释的第一行写简要说明，下面留一行空行，再写详细说明。</p>

<p>我的个人习惯，喜欢在每条注释前面用大约三个字母来表示本次修改的性质：</p>

<ul>
<li>Add something</li>
<li>Bug [fix|found]: describe the bug or fix.</li>
<li>Chg something</li>
<li>Del something</li>
<li>Enh some treatment</li>
<li>New something</li>
<li>Tmp for some cause</li>
</ul>

<p>为了保持语法通顺，也可以采用前三个字母后面加冒号，后面有啥写啥的方法。</p>

<p>最后，我觉得，能够遵守行业规范和团队约定，主动养成良好习惯，应当是鉴别人才的一项重要因素。</p>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/git" title="git" rel="tag">git</a>, <a href="http://www.fwolf.com/blog/post/tag/newbie" title="newbie" rel="tag">newbie</a>, <a href="http://www.fwolf.com/blog/post/tag/rule" title="rule" rel="tag">rule</a>, <a href="http://www.fwolf.com/blog/post/tag/scm" title="Svn/Git" rel="tag">Svn/Git</a>, <a href="http://www.fwolf.com/blog/post/tag/tips" title="tips" rel="tag">tips</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/448" title="Git 合并 patch 时的冲突处理一例 (2009-08-25)">Git 合并 patch 时的冲突处理一例</a> (0)</li>
	<li><a href="http://www.fwolf.com/blog/post/300" title="针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS） (2007-03-18)">针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS）</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/410" title="用ssh打通反向隧道，内网也可对外提供服务 (2008-07-10)">用ssh打通反向隧道，内网也可对外提供服务</a> (2)</li>
	<li><a href="http://www.fwolf.com/blog/post/127" title="利用SVN更新网站 (2006-01-19)">利用SVN更新网站</a> (7)</li>
	<li><a href="http://www.fwolf.com/blog/post/377" title="你最希望在哪里看到TIPS？ (2008-01-10)">你最希望在哪里看到TIPS？</a> (5)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/446/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用ssh打通反向隧道，内网也可对外提供服务</title>
		<link>http://www.fwolf.com/blog/post/410</link>
		<comments>http://www.fwolf.com/blog/post/410#comments</comments>
		<pubDate>Thu, 10 Jul 2008 11:38:30 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[allow]]></category>
		<category><![CDATA[denyhosts]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[reverse]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tunnel]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/?p=410</guid>
		<description><![CDATA[一般正规一点的网络环境，大多是这样的：防火墙后分为内网和中立区（DMZ），并且内网和DMZ虽然都能访问外网，互相却是无法直接访问的。内网和DMZ的区别就是，来自外网的访问，都通过防火墙上的规则映射到DMZ里的服务器上，而内网一般是不允许这样的。 现在需要解决的问题就是，在防火墙只能给DMZ开端口，内网和外网不可直接互访的情况下，如果让内网的机器对外提供服务。 ssh是很神奇的，使用它创建的隧道，可以起到代理的作用，数据流的方向是： 本机 -&#62; 隧道 -&#62; 外网 应用到我们的问题中，如果把隧道反过来，就是： 外网 -&#62; DMZ -&#62; 隧道 -&#62; 内网 这就需要用到ssh的反向隧道，它在服务器上打开一个监听端口，这个端口的访问会被隧道传输到本地，结果再通过隧道传到服务器上，从监听端口返回给客户。这样，在我们的应用中，内网机器通过外网访问DMZ服务器，创建ssh反向隧道，就能够对外提供服务了。当然，防火墙上要将相应端口映射到DMZ的服务器上。 比如，在内网登录DMZ服务器： ssh -R 8082:localhost:82 fwolf@svr5.tld -o ControlPath=/tmp/ssh_svr5_reverse_tunnel 这样，访问DMZ服务器svr5的8082端口，就是在访问本机的82端口。之所以带上-o ControlPath，是为了和其它访问svr5的进程使用不同的master模式（如果不是第一次创建这个master，而是使用了原来的连接的sockts，肯定就不会创建隧道了）。 有几个问题还需要注意一下： 如果DMZ上监听端口小于1000的话，就必须用root用户登录DMZ服务器，比如root@svr5.tld。 DMZ服务器上的sshd必须开启GatewayPorts选项，在文件/etc/ssh/sshd_config中加入GatewayPorts yes。 记得不要idle，参考中有在服务端设置的方法。 如果放在其它脚本，比如/etc/rc.local中执行的话，除了配置自动登录，还可以带上-fN参数，放到后台去。 参考 TIP SSH Reverse Tunnel ssh reverse tunneling PuTTY 中文教程 作者：柴锋 2006年11月 Update @ 2008-07-25 注意，由于使用了反向隧道，所以ssh隧道实际作用相当于一个代理，访问的来源也自然就都成了127.0.0.1，如果同时还启用了denyhosts，千万记得要把本机地址127.0.0.1放入白名单/etc/hosts.allow，不然就会成为其他登录失败的牺牲品（失败的登录，其来源也成了loopback的地址）： ssh_exchange_identification: Connection closed by remote host Fatal [...]]]></description>
			<content:encoded><![CDATA[<p>一般正规一点的网络环境，大多是这样的：防火墙后分为内网和中立区（DMZ），并且内网和DMZ虽然都能访问外网，互相却是无法直接访问的。内网和DMZ的区别就是，来自外网的访问，都通过防火墙上的规则映射到DMZ里的服务器上，而内网一般是不允许这样的。</p>

<p>现在需要解决的问题就是，在防火墙只能给DMZ开端口，内网和外网不可直接互访的情况下，如果让内网的机器对外提供服务。</p>

<p>ssh是很神奇的，使用它创建的隧道，可以起到代理的作用，数据流的方向是：</p>

<pre><code>本机 -&gt; 隧道 -&gt; 外网
</code></pre>

<p>应用到我们的问题中，如果把隧道反过来，就是：</p>

<pre><code>外网 -&gt; DMZ -&gt; 隧道 -&gt; 内网
</code></pre>

<p>这就需要用到ssh的反向隧道，它在服务器上打开一个监听端口，这个端口的访问会被隧道传输到本地，结果再通过隧道传到服务器上，从监听端口返回给客户。这样，在我们的应用中，内网机器通过外网访问DMZ服务器，创建ssh反向隧道，就能够对外提供服务了。当然，防火墙上要将相应端口映射到DMZ的服务器上。</p>

<p>比如，在内网登录DMZ服务器：</p>

<pre><code>ssh -R 8082:localhost:82 fwolf@svr5.tld -o ControlPath=/tmp/ssh_svr5_reverse_tunnel
</code></pre>

<p>这样，访问DMZ服务器svr5的8082端口，就是在访问本机的82端口。之所以带上<code>-o ControlPath</code>，是为了和其它访问svr5的进程使用不同的<a href="385">master模式</a>（如果不是第一次创建这个master，而是使用了原来的连接的sockts，肯定就不会创建隧道了）。</p>

<p>有几个问题还需要注意一下：</p>

<ul>
<li>如果DMZ上监听端口小于1000的话，就必须用root用户登录DMZ服务器，比如<code>root@svr5.tld</code>。</li>
<li>DMZ服务器上的sshd必须开启GatewayPorts选项，在文件<code>/etc/ssh/sshd_config</code>中加入<code>GatewayPorts yes</code>。</li>
<li>记得不要idle，参考中有在服务端设置的方法。</li>
<li>如果放在其它脚本，比如<code>/etc/rc.local</code>中执行的话，除了配置<a href="279">自动登录</a>，还可以带上<code>-fN</code>参数，放到后台去。</li>
</ul>

<h4>参考</h4>

<ul>
<li><a href="http://gentoo-wiki.com/TIP_SSH_Reverse_Tunnel">TIP SSH Reverse Tunnel</a></li>
<li><a href="http://linux.byexamples.com/archives/238/ssh-reverse-tunneling/">ssh reverse tunneling</a></li>
<li><a href="http://chaifeng.com/blog/2007/06/putty_200611.html">PuTTY 中文教程 作者：柴锋 2006年11月</a></li>
</ul>

<h4>Update @ 2008-07-25</h4>

<p>注意，由于使用了反向隧道，所以ssh隧道实际作用相当于一个代理，访问的来源也自然就都成了<code>127.0.0.1</code>，如果同时还启用了<a href="http://denyhosts.sourceforge.net/">denyhosts</a>，千万记得要把本机地址<code>127.0.0.1</code>放入白名单<code>/etc/hosts.allow</code>，不然就会成为其他登录失败的牺牲品（失败的登录，其来源也成了loopback的地址）：</p>

<pre><code>ssh_exchange_identification: Connection closed by remote host
Fatal error: Lost connection with the server
</code></pre>

<p>没办法，为了网络通道的畅通，只能牺牲一部分安全性了。</p>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/allow" title="allow" rel="tag">allow</a>, <a href="http://www.fwolf.com/blog/post/tag/denyhosts" title="denyhosts" rel="tag">denyhosts</a>, <a href="http://www.fwolf.com/blog/post/tag/internet" title="Internet" rel="tag">Internet</a>, <a href="http://www.fwolf.com/blog/post/tag/linux" title="Linux" rel="tag">Linux</a>, <a href="http://www.fwolf.com/blog/post/tag/network" title="network" rel="tag">network</a>, <a href="http://www.fwolf.com/blog/post/tag/reverse" title="reverse" rel="tag">reverse</a>, <a href="http://www.fwolf.com/blog/post/tag/ssh" title="ssh" rel="tag">ssh</a>, <a href="http://www.fwolf.com/blog/post/tag/tips" title="tips" rel="tag">tips</a>, <a href="http://www.fwolf.com/blog/post/tag/tunnel" title="tunnel" rel="tag">tunnel</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/279" title="配置ssh的自动登录 (2007-01-05)">配置ssh的自动登录</a> (13)</li>
	<li><a href="http://www.fwolf.com/blog/post/385" title="ssh的连接重用 (2008-03-04)">ssh的连接重用</a> (2)</li>
	<li><a href="http://www.fwolf.com/blog/post/300" title="针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS） (2007-03-18)">针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS）</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/443" title="配置安全的共享web服务器（抛砖引玉） (2009-06-09)">配置安全的共享web服务器（抛砖引玉）</a> (4)</li>
	<li><a href="http://www.fwolf.com/blog/post/400" title="选择Eclipse PHP Development Tools(PDT)作为PHP开发工具 (2008-05-03)">选择Eclipse PHP Development Tools(PDT)作为PHP开发工具</a> (8)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/410/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ssh的连接重用</title>
		<link>http://www.fwolf.com/blog/post/385</link>
		<comments>http://www.fwolf.com/blog/post/385#comments</comments>
		<pubDate>Tue, 04 Mar 2008 14:58:00 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[reuse]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[time]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/post/385</guid>
		<description><![CDATA[原理很简单，开一个ssh连接在后台放着，以后再有需要用到ssh到同样主机的时候，直接使用这个连接的socket文件，不用再创建连接了，同理，也不需要再进行用户身份验证。 默认是关闭的，可以在~/.ssh/config中打开： Host * ControlMaster auto ControlPath ~/.ssh/master-%r@%h:%p 创建“Master”连接就可以用： ssh -M -N -f fwolf.com 认证成功后会创建socket文件master-fwolf@fwolf.com:22。 其它的介绍资料也很多，我是在邮件列表中看到的，惭愧，使用ssh很久了，现在才知道，网上用ssh master ControlMaster搜索资料很多。 实际使用中，我倒有一个反面的感觉，创建了“Master”之后，一般的scp什么的操作的确是快了，可如果单独开一个ssh terminal上去的话，输入的响应速度很变慢。开始以为是这个ssh连接也重用了“Master”的原因，后来加上-o ControlMaster=no参数强制不使用Master，单独创建新连接也是一样，不知道是什么原因导致的。 仔细测试一下效果，首先在已经创建Master的情况下连接主机，执行命令并马上退出： $ time ssh fwolf.com -C pwd 执行多次，得到的执行时间一般在0.33秒左右，然后关闭Master，再次执行这个命令，平均执行时间为6.7秒，的确是快了许多。 后来才发现，刚才对响应速度“慢”的感觉应该是错误的，可能是由于另外开着一个scp的缘故，scp完成之后，速度就快很多了。之所以会感觉“慢”，其实也是相对而言的，因为单独ssh连接上去之后，也是不中断的持续连接、持续响应，同样没有重新建立连接的时间，速度也是非常快的。开启Master主要对那些一会儿连接、一会儿断开，请求断断续续的情况最有效果。 另外，还有两个比较有用的相关控制命令： # 检查当前是否已经创建Master连接 $ ssh fwolf.com -O check Master running (pid=6350) # 发送断开当前Master连接的请求，比我用的笨kill方式好多了 $ ssh fwolf.com -O exit Exit request sent. $ ssh fwolf.com -O [...]]]></description>
			<content:encoded><![CDATA[<p>原理很简单，开一个ssh连接在后台放着，以后再有需要用到ssh到同样主机的时候，直接使用这个连接的socket文件，不用再创建连接了，同理，也不需要再进行用户身份验证。</p>

<p>默认是关闭的，可以在<code>~/.ssh/config</code>中打开：</p>

<pre><code>Host *
    ControlMaster auto
    ControlPath ~/.ssh/master-%r@%h:%p
</code></pre>

<p>创建“Master”连接就可以用：</p>

<pre><code>ssh -M -N -f fwolf.com
</code></pre>

<p>认证成功后会创建socket文件<code>master-fwolf@fwolf.com:22</code>。</p>

<p>其它的介绍资料也很多，我是在<a href="http://groups.google.com/group/szlug/t/e504940647256c1f">邮件列表</a>中看到的，惭愧，使用ssh很久了，现在才知道，网上用ssh master ControlMaster搜索资料很多。</p>

<p>实际使用中，我倒有一个反面的感觉，创建了“Master”之后，一般的scp什么的操作的确是快了，可如果单独开一个ssh terminal上去的话，输入的响应速度很变慢。开始以为是这个ssh连接也重用了“Master”的原因，后来加上<code>-o ControlMaster=no</code>参数强制不使用Master，单独创建新连接也是一样，不知道是什么原因导致的。</p>

<p>仔细测试一下效果，首先在已经创建Master的情况下连接主机，执行命令并马上退出：</p>

<pre><code>$ time ssh fwolf.com -C pwd
</code></pre>

<p>执行多次，得到的执行时间一般在0.33秒左右，然后关闭Master，再次执行这个命令，平均执行时间为6.7秒，的确是快了许多。</p>

<p>后来才发现，刚才对响应速度“慢”的感觉应该是错误的，可能是由于另外开着一个scp的缘故，scp完成之后，速度就快很多了。之所以会感觉“慢”，其实也是相对而言的，因为单独ssh连接上去之后，也是不中断的持续连接、持续响应，同样没有重新建立连接的时间，速度也是非常快的。开启Master主要对那些一会儿连接、一会儿断开，请求断断续续的情况最有效果。</p>

<p>另外，还有两个比较有用的相关控制命令：</p>

<pre><code># 检查当前是否已经创建Master连接
$ ssh fwolf.com -O check
Master running (pid=6350)

# 发送断开当前Master连接的请求，比我用的笨kill方式好多了
$ ssh fwolf.com -O exit
Exit request sent.
$ ssh fwolf.com -O check
Control socket connect(/home/fwolf/.ssh/master-fwolf@fwolf.com:22): No such file or directory
</code></pre>

<h4>参考</h4>

<p><a href="http://www.linux.com/feature/54498">Accelerating OpenSSH connections with ControlMaster</a></p>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/reuse" title="reuse" rel="tag">reuse</a>, <a href="http://www.fwolf.com/blog/post/tag/ssh" title="ssh" rel="tag">ssh</a>, <a href="http://www.fwolf.com/blog/post/tag/time" title="time" rel="tag">time</a>, <a href="http://www.fwolf.com/blog/post/tag/tips" title="tips" rel="tag">tips</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/410" title="用ssh打通反向隧道，内网也可对外提供服务 (2008-07-10)">用ssh打通反向隧道，内网也可对外提供服务</a> (2)</li>
	<li><a href="http://www.fwolf.com/blog/post/300" title="针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS） (2007-03-18)">针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS）</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/443" title="配置安全的共享web服务器（抛砖引玉） (2009-06-09)">配置安全的共享web服务器（抛砖引玉）</a> (4)</li>
	<li><a href="http://www.fwolf.com/blog/post/279" title="配置ssh的自动登录 (2007-01-05)">配置ssh的自动登录</a> (13)</li>
	<li><a href="http://www.fwolf.com/blog/post/257" title="用unison来同步你的远程文件夹 (2006-11-26)">用unison来同步你的远程文件夹</a> (9)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/385/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>你最希望在哪里看到TIPS？</title>
		<link>http://www.fwolf.com/blog/post/377</link>
		<comments>http://www.fwolf.com/blog/post/377#comments</comments>
		<pubDate>Wed, 09 Jan 2008 16:20:05 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Living]]></category>
		<category><![CDATA[think]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/post/377</guid>
		<description><![CDATA[最近比较忙，疏于更新，已经是2008年了，总结畅想也过了季了，简单冒个泡，以示活着。 很多软件在启动时，都会显示一个tips提示，也有叫每日一xx的，内容嘛，有些是一些操作技巧，有些则是轻松的提示、笑话什么的，比如我以前也玩过（现在还在用）的fortune。 问题是，我们最希望在哪里看到tips呢？换个说法，tips在哪里出现，才会让我们觉得不讨厌呢？我先扔点砖吧，希望能砌成“5000个最希望tips出现的地方”，2008年终总结就指望它了！ Windows或者Gnome、Kde启动的时候来一条吧，我的机器很慢，足够让我看清楚了。 Firefox启动的时候最好能先快速弹出一个tips窗口，然后再后台处理启动任务，这玩意儿虽然好用，启动确实慢了些，tips内容最好就是firefox加速技巧或节省内存占用的技巧。 图片啊图片，大图片还没加载的时候别显示alt了，来点tips吧，如果图片放在flickr上，tips内容当然是那些忍者之术最好不过了。此招数对在线视频应该更加适用。 ADSL猫的灯也别总是有数据传输的时候就闪，把tips转换成摩尔斯电码，di-di-di-DAH-DAH-DAH-di-di-dit，此方法对所有网络设备led灯有效。 程序编译出错时，除了错误信息，也来一条tips吧，内容就是300条良好的编程习惯。 马路上等红灯的时候，多无聊啊，如果旁边有一显示屏，来点路况tips或者笑话来解闷就好了。 安装进度条，好像大部分软件都没有聪明到让用户狂等待的时候再给他们灌输点啥，windows都白装了么，多好的一个例子啊，还是现在都用深度什么的ghost直接装了？ 说到ghost，那个灰蓝的界面上，有太多的空地儿可以显示tips了。 说到安装，apt dist-upgrade的时候能来点tips解闷么？以前安装linux的时候还有俄罗斯方块玩咧。 用随机的tips作im的状态签名、邮件签名、论坛签名，虽不算新鲜，也不是谁都能搞出来的。 用语音tips来作闹钟铃声，天天被一种声音闹醒，真怕被训练成条件反射。 xx或bb的时候，tips出现在目光自然聚焦的地方，这个已经有人做了，不过广告居多。 im机器人，每天放出一条tips，不知道会不会有无聊的人加这种好友，但再怎么着总比qq尾巴好吧。 老是用枯燥的数字来作产品序列号太没劲了，用tips吧，哪天Windows的序列号就会变成“30+ Basic Linux Commands”才好玩呢。 在名片上印点tips效果肯定不错。 大家继续，解放思想，tips是无处不在滴~ 另外预告一下，2008年依然会很忙碌，blog质量和频率估计都会有所下降，没办法，人老了嘛。。。 Tags: Living, think, tips Related posts 针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS） (3) 纪念老妈的半颗大牙 (1) 真正的“AI”，是不是可以这样？ (3) 用ssh打通反向隧道，内网也可对外提供服务 (2) 更安全的原因所在 (1)]]></description>
			<content:encoded><![CDATA[<p>最近比较忙，疏于更新，已经是2008年了，总结畅想也过了季了，简单冒个泡，以示活着。</p>

<p>很多软件在启动时，都会显示一个tips提示，也有叫每日一xx的，内容嘛，有些是一些操作技巧，有些则是轻松的提示、笑话什么的，比如我以前也玩过（现在还在用）的<a href="264">fortune</a>。</p>

<p>问题是，我们最希望在哪里看到tips呢？换个说法，tips在哪里出现，才会让我们觉得不讨厌呢？我先扔点砖吧，希望能砌成“5000个最希望tips出现的地方”，2008年终总结就指望它了！</p>

<ol>
<li>Windows或者Gnome、Kde启动的时候来一条吧，我的机器很慢，足够让我看清楚了。</li>
<li>Firefox启动的时候最好能先快速弹出一个tips窗口，然后再后台处理启动任务，这玩意儿虽然好用，启动确实慢了些，tips内容最好就是firefox加速技巧或节省内存占用的技巧。</li>
<li>图片啊图片，大图片还没加载的时候别显示alt了，来点tips吧，如果图片放在flickr上，tips内容当然是那些忍者之术最好不过了。此招数对在线视频应该更加适用。</li>
<li>ADSL猫的灯也别总是有数据传输的时候就闪，把tips转换成摩尔斯电码，di-di-di-DAH-DAH-DAH-di-di-dit，此方法对所有网络设备led灯有效。</li>
<li>程序编译出错时，除了错误信息，也来一条tips吧，内容就是300条良好的编程习惯。</li>
<li>马路上等红灯的时候，多无聊啊，如果旁边有一显示屏，来点路况tips或者笑话来解闷就好了。</li>
<li>安装进度条，好像大部分软件都没有聪明到让用户狂等待的时候再给他们灌输点啥，windows都白装了么，多好的一个例子啊，还是现在都用深度什么的ghost直接装了？</li>
<li>说到ghost，那个灰蓝的界面上，有太多的空地儿可以显示tips了。</li>
<li>说到安装，apt dist-upgrade的时候能来点tips解闷么？以前安装linux的时候还有俄罗斯方块玩咧。</li>
<li>用随机的tips作im的状态签名、邮件签名、论坛签名，虽不算新鲜，也不是谁都能搞出来的。</li>
<li>用语音tips来作闹钟铃声，天天被一种声音闹醒，真怕被训练成条件反射。</li>
<li>xx或bb的时候，tips出现在目光自然聚焦的地方，这个已经有人做了，不过广告居多。</li>
<li>im机器人，每天放出一条tips，不知道会不会有无聊的人加这种好友，但再怎么着总比qq尾巴好吧。</li>
<li>老是用枯燥的数字来作产品序列号太没劲了，用tips吧，哪天Windows的序列号就会变成“30+ Basic Linux Commands”才好玩呢。</li>
<li>在名片上印点tips效果肯定不错。</li>
</ol>

<p>大家继续，解放思想，tips是无处不在滴~</p>

<p>另外预告一下，2008年依然会很忙碌，blog质量和频率估计都会有所下降，没办法，人老了嘛。。。</p>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/living" title="Living" rel="tag">Living</a>, <a href="http://www.fwolf.com/blog/post/tag/think" title="think" rel="tag">think</a>, <a href="http://www.fwolf.com/blog/post/tag/tips" title="tips" rel="tag">tips</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/300" title="针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS） (2007-03-18)">针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS）</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/373" title="纪念老妈的半颗大牙 (2007-12-05)">纪念老妈的半颗大牙</a> (1)</li>
	<li><a href="http://www.fwolf.com/blog/post/364" title="真正的“AI”，是不是可以这样？ (2007-10-30)">真正的“AI”，是不是可以这样？</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/410" title="用ssh打通反向隧道，内网也可对外提供服务 (2008-07-10)">用ssh打通反向隧道，内网也可对外提供服务</a> (2)</li>
	<li><a href="http://www.fwolf.com/blog/post/380" title="更安全的原因所在 (2008-01-17)">更安全的原因所在</a> (1)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/377/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>HTTP Referer二三事</title>
		<link>http://www.fwolf.com/blog/post/320</link>
		<comments>http://www.fwolf.com/blog/post/320#comments</comments>
		<pubDate>Sat, 05 May 2007 08:35:48 +0000</pubDate>
		<dc:creator>Fwolf</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[privoxy]]></category>
		<category><![CDATA[referrer]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.fwolf.com/blog/post/320</guid>
		<description><![CDATA[什么是HTTP Referer 简言之，HTTP Referer是header的一部分，当浏览器向web服务器发送请求的时候，一般会带上Referer，告诉服务器我是从哪个页面链接过来的，服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里，他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。 Referer其实应该是英文单词Referrer，不过拼错的人太多了，所以编写标准的人也就将错就错了。 我的问题 我刚刚把feed阅读器改变为Gregarius，但他不像我以前用的liferea，访问新浪博客的时候，无法显示其中的图片，提示“此图片仅限于新浪博客用户交流与沟通”，我知道，这就是HTTP Referer导致的。 由于我上网客户端配置的特殊性，首先怀疑是squid的问题，但通过实验排除了，不过同时发现了一个Squid和Tor、Privoxy协同使用的隐私泄露问题，留待以后研究。 Gregarius能处理这个问题么？ 答案是否定的，因为Gregarius只是负责输出html代码，而对图像的访问是有客户端浏览器向服务器请求的。 不过，安装个firefox扩展也许能解决问题，文中推荐的&#8221;Send Referrer&#8221;我没有找到，但发现另外一个可用的：&#8221;RefControl&#8220;，可以根据访问网站的不同，控制使用不同的Referer。 但是我不喜欢用Firefox扩展来解决问题，因为我觉得他效率太低，所以我用更好的方式——Privoxy。 Privoxy真棒 在Privoxy的default.action中添加两行： {+hide-referrer{forge}} .album.sina.com.cn 这样Gregarius中新浪博客的图片就出来了吧？+hide-referrer是Privoxy的一个过滤器，设置访问时对HTTP Referer的处理方式，后面的forge代表用访问地址当作Refere的，还可以换成block，代表取消Referer，或者直接把需要用的Referer网址写在这里。 用Privoxy比用Firefox简单的多，赶紧换吧。 From https to http 我还发现，从一个https页面上的链接访问到一个非加密的http页面的时候，在http页面上是检查不到HTTP Referer的，比如当我点击自己的https页面下面的w3c xhtml验证图标（网址为http://validator.w3.org/check?uri=referer），从来都无法完成校验，提示： No Referer header found! 原来，在http协议的rfc文档中有定义： 15.1.3 Encoding Sensitive Information in URI's ... Clients SHOULD NOT include a Referer header field in a (non-secure) HTTP request if [...]]]></description>
			<content:encoded><![CDATA[<h3>什么是HTTP Referer</h3>

<p>简言之，HTTP Referer是header的一部分，当浏览器向web服务器发送请求的时候，一般会带上Referer，告诉服务器我是从哪个页面链接过来的，服务器籍此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里，他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。</p>

<p>Referer其实应该是英文单词Referrer，不过拼错的人太多了，所以编写标准的人也就将错就错了。</p>

<h3>我的问题</h3>

<p>我刚刚把feed阅读器改变为<a href="http://gregarius.net/">Gregarius</a>，但他不像我以前用的liferea，访问新浪博客的时候，无法显示其中的图片，提示“此图片仅限于新浪博客用户交流与沟通”，我知道，这就是HTTP Referer导致的。</p>

<p>由于<a href="294">我上网客户端配置的特殊性</a>，首先怀疑是squid的问题，但通过实验排除了，不过同时发现了一个<a href="http://wiki.noreply.org/noreply/TheOnionRouter/SquidProxy">Squid和Tor、Privoxy协同使用的隐私泄露问题</a>，留待以后研究。</p>

<h3>Gregarius能处理这个问题么？</h3>

<p><a href="http://forums.gregarius.net/comments.php?DiscussionID=448">答案是否定的</a>，因为Gregarius只是负责输出html代码，而对图像的访问是有客户端浏览器向服务器请求的。</p>

<p>不过，安装个firefox扩展也许能解决问题，文中推荐的&#8221;Send Referrer&#8221;我没有找到，但发现另外一个可用的：&#8221;<a href="https://addons.mozilla.org/en-US/firefox/addon/953">RefControl</a>&#8220;，可以根据访问网站的不同，控制使用不同的Referer。</p>

<p>但是我不喜欢用Firefox扩展来解决问题，因为我觉得他效率太低，所以我用更好的方式——Privoxy。</p>

<h3>Privoxy真棒</h3>

<p>在Privoxy的default.action中添加两行：</p>

<pre><code>{+hide-referrer{forge}}
.album.sina.com.cn
</code></pre>

<p>这样Gregarius中新浪博客的图片就出来了吧？<code>+hide-referrer</code>是Privoxy的一个过滤器，设置访问时对HTTP Referer的处理方式，后面的<code>forge</code>代表用访问地址当作Refere的，还可以换成<code>block</code>，代表取消Referer，或者直接把需要用的Referer网址写在这里。</p>

<p>用Privoxy比用Firefox简单的多，赶紧<a href="294">换</a>吧。</p>

<h3>From https to http</h3>

<p>我还发现，从一个https页面上的链接访问到一个非加密的http页面的时候，在http页面上是检查不到HTTP Referer的，比如当我点击自己的https页面下面的w3c xhtml验证图标（网址为<a href="http://validator.w3.org/check?uri=referer">http://validator.w3.org/check?uri=referer</a>），从来都无法完成校验，提示：</p>

<pre><code>No Referer header found!
</code></pre>

<p>原来，在<a href="http://www.ietf.org/rfc/rfc2616.txt">http协议的rfc文档</a>中有定义：</p>

<pre><code>15.1.3 Encoding Sensitive Information in URI's

...

   Clients SHOULD NOT include a Referer header field in a (non-secure)
   HTTP request if the referring page was transferred with a secure
   protocol.
</code></pre>

<p>这样是出于安全的考虑，访问非加密页时，如果来源是加密页，客户端不发送Referer，<a href="http://support.microsoft.com/kb/178066">IE一直都是这样实现的</a>，<a href="http://kb.mozillazine.org/Network.http.sendSecureXSiteReferrer">Firefox浏览器也不例外</a>。但这并不影响从加密页到加密页的访问。</p>

<h3>Firefox中关于Referer的设置</h3>

<p>都在<about:config>里，有两个键值：</about:config></p>

<ul>
<li><p>network.http.sendRefererHeader (default=2)
设置Referer的发送方式，0为完全不发送，1为只在点击链接时发送，在访问页面中的图像什么的时候不发送，2为始终发送。参见<a href="http://cafe.elharo.com/privacy/privacy-tip-3-block-referer-headers-in-firefox/">Privacy Tip #3: Block Referer Headers in Firefox</a></p></li>
<li><p>network.http.sendSecureXSiteReferrer (default=true)
设置从一个加密页访问到另外一个加密页的时候是否发送Referer，true为发送，false为不发送。</p></li>
</ul>

<h3>利用Referer防止图片盗链</h3>

<p>虽然Referer并不可靠，但用来防止图片盗链还是足够的，毕竟不是每个人都会修改客户端的配置。实现一般都是通过apache的配置文件，首先设置允许访问的地址，标记下来：</p>

<pre><code># 只允许来自domain.com的访问，图片可能就放置在domain.com网站的页面上
SetEnvIfNoCase Referer "^http://www.domain.com/" local_ref
# 直接通过地址访问
SetEnvIf Referer "^$" local_ref
</code></pre>

<p>然后再规定被标记了的访问才被允许：</p>

<pre><code>&lt;FilesMatch ".(gif|jpg)"&gt;
Order Allow,Deny
Allow from env=local_ref
&lt;/FilesMatch&gt;
</code></pre>

<p>或者</p>

<pre><code>&lt;Directory /web/images&gt;
   Order Deny,Allow
   Deny from all
   Allow from env=local_ref
&lt;/Directory&gt;
</code></pre>

<p>这方面的文章网上很多，参考：</p>

<ul>
<li><a href="http://leftleg.hzpub.com/read.php?405">Apache 下防止盗链的解决办法</a></li>
<li><a href="http://blog.51766.com/page/zsc?entry=1144852732034">Apache的环境变量设置</a></li>
<li><a href="http://blog.soueasy.net/post/80.htm">配置 Apache 实现禁止图片盗链</a></li>
</ul>

<h3>不要使用Rerferer的地方</h3>

<p>不要把Rerferer用在身份验证或者其他非常重要的检查上，因为Rerferer非常容易在客户端被改变，不管是通过上面介绍的Firefox扩展，或者是Privoxy，甚至是libcurl的调用，所以Rerferer数据非常之不可信。</p>

<p>如果你想限制用户必须从某个入口页面访问的话，与其使用Referer，不如使用session，在入口页面写入session，然后在其他页面检查，如果用户没有访问过入口页面，那么对应的session就不存在，参见<a href="http://www.thescripts.com/forum/thread3090.html">这里的讨论</a>。不过和上面说的一样，也不要过于相信这种方式的“验证”结果。</p>

<p>个人感觉现在Rerferer除了用在防盗链，其他用途最多的就是访问统计，比如统计用户都是从哪里的链接访问过来的等等。</p>

	Tags: <a href="http://www.fwolf.com/blog/post/tag/http" title="http" rel="tag">http</a>, <a href="http://www.fwolf.com/blog/post/tag/privoxy" title="privoxy" rel="tag">privoxy</a>, <a href="http://www.fwolf.com/blog/post/tag/referrer" title="referrer" rel="tag">referrer</a>, <a href="http://www.fwolf.com/blog/post/tag/tips" title="tips" rel="tag">tips</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.fwolf.com/blog/post/300" title="针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS） (2007-03-18)">针对$_SERVER['PHP_SELF']的跨站脚本攻击（XSS）</a> (3)</li>
	<li><a href="http://www.fwolf.com/blog/post/410" title="用ssh打通反向隧道，内网也可对外提供服务 (2008-07-10)">用ssh打通反向隧道，内网也可对外提供服务</a> (2)</li>
	<li><a href="http://www.fwolf.com/blog/post/377" title="你最希望在哪里看到TIPS？ (2008-01-10)">你最希望在哪里看到TIPS？</a> (5)</li>
	<li><a href="http://www.fwolf.com/blog/post/152" title="[Ubuntu]使用点滴 (2006-07-08)">[Ubuntu]使用点滴</a> (7)</li>
	<li><a href="http://www.fwolf.com/blog/post/446" title="[Git]初学者注意事项 (2009-08-04)">[Git]初学者注意事项</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.fwolf.com/blog/post/320/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
