设为首页收藏本站

LinuxTone | 运维专家网论坛 - 最棒的Linux运维与开源架构技术交流社区!

 找回密码
 注册

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 2480|回复: 0

[lighttpd] lighttpd防盗链技术的一个变形 [复制链接]

LT管理团队

社区首席勤杂工

Rank: 9Rank: 9Rank: 9

签到
81
注册时间
2008-5-19
最后登录
2012-5-3
在线时间
1762 小时
阅读权限
200
积分
14979
帖子
2524
主题
1200
精华
25
UID
1

LT总司令

发表于 2008-9-18 13:25:58 |显示全部楼层
lighttpd 中的mod_secure_download.c模块中的防盗链技术大家已经很清楚了,但是这个模块要求会改写一些url的地址,形如:
The generated URL has to have the format:

<uri-prefix>/<token>/<timestamp-in-hex>/<rel-path> which looks like "yourserver.com/bf32df9cdb54894b22e09d0ed87326fc/435cc8cc/secure.tar.gz"

<token> is an MD5 of

   1. a secret string (user supplied)
   2. (rel-path)(starts with /)
   3. (timestamp-in-hex)

具体参考:http://trac.lighttpd.net/trac/wiki/Docs%3AModSecDownload

如果有这样的需求,要求不改变原来的下载url,而做到对某些资源进行防盗链呢?
最后我们可以这样做,增加get方法,即是把加密额的部分通过get方法传递给lighttpd的mod_secure_download.c模块
例如,
原来的url: yourserver.com/secure/secure.tar.gz
新的url:yourserver.com/secure/secure.tar.gz?credentials=fhsfhskfaskfhsakfsk2343askfskfsk

这样,我们就做到在不改变原来url的情况下又可以用到mod_secure_download.c模块的防盗链功能

下面要修改mod_secure_download.c模块的源代码,其实很简单,只要熟悉lighttpd的一些常见插件就可以在几分钟内搞定这个功能
/*
* if there is a key = md5,
* otherwise sent 403
* */
if (NULL != (get_param = (data_string *)array_get_element(p->get_params, "key"))) {
    /* too short */
    if (get_param->value->used < 2) {
con->http_status = 403;
return HANDLER_FINISHED;
    }

    md5_str = get_param->value->ptr;

    /* check if it is a md5 string */
    if ( strlen(md5_str) != 40 || !is_hex_len(md5_str, 40) ) {
con->http_status = 403;
log_error_write(srv, __FILE__, __LINE__, "ss", "key-md5 invalid:", md5_str);

return HANDLER_FINISHED;
    }
}
else{
    con->http_status = 403;

    return HANDLER_FINISHED;   
}

上面的代码就是通过get方法获得加密的字符串,然后下面的代码就是原来lighttpd中的防盗链出来流程

lighttpd的这个加密模块,我个人认为还是有点需要改进的地方
大家也看出来了,对于防盗链,这里采用的是md5单向加密的技术,但是client端向服务器发送的请求加密串是包含时间的(也正是这个时间才是我们用于判断这个url的有效时间,从而达到防盗链的目的),个人觉得可以对明文传输的时间进行一下简单的加密(当然要是可以双向的加密)

还有一点需要注意的地方,就是这个防盗链模块在lighttpd的配置文件中的lighttpd.conf加载顺序是很重要的,
一定要将这个防盗链模块放在mod_flv_streaming.c/mod_h264_streaming.c模块加载之前加载
server.modules = ( ..., "mod_secdownload",
“mod_flv_streaming”,
"mod_h264-streaming",
... )

不然,防盗链模块会不起作用的,因为flv/h264这些模块里面会有
con->file_finished = 1;
return HANDLER_FINISHED;

从 架构研究室 作者:Tommy
感谢大家对linuxtone的支持!
您需要登录后才可以回帖 登录 | 注册

IT运维专家网感谢红之盟网络提供带宽支持

合作联系: QQ:67888954/MSN:cnseek@msn.com/mail:netseek@linuxtone.org

Archiver|手机版|感谢所有关心和支持过LinuxTone的朋友们 转载本站内容请注明原作者名及出处 ( 京ICP备08103151 )   |

GMT+8, 2012-5-23 11:21 , Processed in 0.144011 second(s), 12 queries , Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部