在如今的互联网环境下,像我这样的重度Twitter使用者必须配备以下设备才能存活:1,VPN;2,iPhone;3,Dabr。当然,还有自建API这种高级产品,但因为我能力有限,实在是没有机会去好好研究一把。
前几天,艺术家刘淼老师(@liumiao)在blog上写了一篇文章《不求人也能获得大量twitter第三方客户端地址的方法》,这唤醒了我。因为Dabr这种东西,用惯之后被封杀还是很痛苦的。这篇文章就是我的一些想法,谈谈如何保证私有Dabr的安全。其实就两点:
- 增加授权用户名单
- 为跳出链接做个重定向
授权用户名单
安装完Dabr并做完必要的设置之后,请手工修改/config.php文件,增加一个函数。代码如下:
function config_log_request() { // This function is called from menu.php if it exists // Ignore people that aren't logged in if (!user_is_authenticated()) return; // Create a *lowercase* list of allowed users $allowed_users = array( 'bfishadow', ); // Check if the current user is in our allowed user list if (!in_array(strtolower(user_current_username()), $allowed_users)) { // They're not, kick them out! user_logout(); die("Sorry, you're not on the list of allowed users."); } }
把授权用户的ID放在 $allowed_users 数组里即可,一行一个,全小写。上面这段代码表明,只有 @bfishadow 才可以用。
链接重定向
这需要两个步骤,第一步需要在你的服务器上做一个跳转用的PHP文件,比如 /go.php ,代码如下:
<?php //get value of parameter URL $Url = $_GET['url']; //meta jump echo '<html><head><meta http-equiv="refresh" content="1;url='.$Url.'"></head><body></body></html>'; ?>
主要目的就是接收一个地址,然后使用META方式跳转到目的地。为什么要用META跳转,稍后给解释。
第二步,请打开 common/twitter.php 文件,手工修改其中一个函数,搜索: function replacementURLs($matches) 可以快速定位。
原来的代码:
function replacementURLs($matches) { $replacement = $matches[2]; $url = $matches[3]; if (!preg_match("#^https{0,1}://#i", $url)) { $url = "http://{$url}"; } if (setting_fetch('gwt') == 'on') { $encoded = urlencode($url); $replacement .= "<a href='http://google.com/gwt/n?u={$encoded}' target='_blank'>{$url}</a>"; } else { $replacement .= theme('external_link', $url); } return $replacement; }
修改完毕的代码:
function replacementURLs($matches) { $replacement = $matches[2]; $url = $matches[3]; if (!preg_match("#^https{0,1}://#i", $url)) { $url = "http://{$url}"; } if (setting_fetch('gwt') == 'on') { $encoded = urlencode($url); $replacement .= "<a href='http://google.com/gwt/n?u={$encoded}' target='_blank'>{$url}</a>"; } else { //mod hide referer //$replacement .= theme('external_link', $url); $encoded = urlencode($url); $replacement .= "<a href='http://xxx.com/go.php?url={$encoded}' target='_blank'>{$url}</a>"; } return $replacement; }
这段代码的意思是说,如果没有打开gwt(Google Web Transcoder),那么Dabr会直接给出外部链接。当你点击的时候,你的Private Dabr地址将作为referer传递出去。为了避免此问题,我在这里作了一个Hack,把目的地URL作为参数传递到之前制作的跳转页,然后由跳转页来传递referer参数,从而实现隐藏Private Dabr地址的目的。
到此,任务完成。我们来做一下测试,访问 http://gongm.in/beta/refchk.php 的时候,看它是否还显示你的Private Dabr地址。如果没有,那么目标达成。
ps. 最后说说为什么要用META跳转,而不是302或者是其他。请看一下这篇文章,它的本意是解决referer丢失的问题,但恰好帮上了我的忙,呵呵。我觉得,META跳转不传递referer应该是浏览器的Bug。站在网站主的立场上来看,没人喜欢这么做。但在这个特殊的环境下,能小心点就多小心点吧。
在我没有自己搭建时,我靠点别人链接来获取第三方客户端的。开始自己搭建之后,就一直使用API+Tweetdeck来上推了。
我搭建API的时候,我朋友还特意说了referer,提醒我不要乱点别人链接来着。现在用上独立IP了更是小心
学习了~
This might help. Auto refresh you dabr client. http://bibhas.in/blog/2010/10/auto-refresh-your-dabr-client/
赞,给自己的dabr加上了。另外,最好加个判断,现在直接访问http://xxx.com/go.php会进入死循环的…
类似这样:
$YOURDOMAIN = “xxx.com”;
if (! preg_match(“/https?://$YOURDOMAIN//”, $URL)) {
//meta jump
echo ”;
} else {
echo “don’t fool me.”;
}
@vvoody
不对,我这样写还是有问题,if (! empty($URL)) {就行
奶瓶腿的最新版根本找不到地方修改……