二蛋 发布的文章

利用Nginx的accesskey和secure_link模块实现防盗链

之前文章Nginx搭建flv mp4流媒体服务器中介绍了通过referer判断实现简单的防盗链,弊端是来源容易被伪造。今天介绍一下更高级的防盗链策略。

软件版本:
nginx-1.22.1
nginx-accesskey-2.0.3

增加编译参数 --with-http_secure_link_module --add-module=/root/nginx-accesskey-2.0.3 并重新编译 nginx

./configure --prefix=/usr/local/nginx --add-module=../nginx_mod_h264_streaming-2.2.7 --with-pcre=../pcre-8.41 --with-zlib=../zlib-1.2.11 --user=www --group=www --with-http_flv_module --with-http_stub_status_module --with-threads --with-http_ssl_module --with-http_secure_link_module --add-module=/root/nginx-accesskey-2.0.3 --with-openssl-opt='enable-tls1_3 enable-weak-ssl-ciphers' --with-http_v2_module --with-http_mp4_module --with-cc-opt='-O3'
make && make install

完整的配置文件示例:

user www www;

worker_processes auto;

error_log  /usr/local/nginx/logs/error.log  crit;

pid /usr/local/nginx/logs/nginx.pid;

events {
    use epoll;
    worker_connections 65535;
}

http {
    include mime.types;
    default_type application/octet-stream;
    
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 150m;
    tcp_nopush on;
    tcp_nodelay on;
    
    sendfile on;
    
    keepalive_timeout 65;
    limit_conn_zone $binary_remote_addr zone=perip:10m; #容器共使用10M的内存来应对IP传输开销
    
    gzip on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;
    gzip_proxied        expired no-cache no-store private auth;
    gzip_disable        "MSIE [1-6]\.";
    
    server {
        listen 80;
        listen 443 ssl http2 fastopen=3 reuseport;
        server_name 2dan.cc; 
        root /home/html;
        limit_conn perip 3; #限制每个IP同一时间只能发起3个连接
        limit_rate_after 10m; #在视频文件下载10M以后开始限速
        limit_rate 100k; #速度限制为100K
        charset utf-8;
        
        ssl on;
        ssl_certificate      2dan.cc_bundle.crt;
        ssl_certificate_key  2dan.cc.key;
        ssl_session_timeout  5m;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
        ssl_prefer_server_ciphers on;
        error_page 497 https://$host$uri; #http重定向到https 

        location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        }
        
        location ~ \.(mp4|m3u8)$ {
                 mp4;
                 valid_referers none blocked *.2dan.cc; #防盗链授权
            if ($invalid_referer) {
                  return 403;
            }
            if (!-e $request_filename) {rewrite ^/(.*)/(.*)/(.*)/(.*) /$4?key=$1&st=$2&e=$3 last;}
            accesskey on;
            accesskey_hashmethod md5;
            accesskey_arg "key";
            accesskey_signature "mypass$REMOTE_ADDR";
            secure_link $arg_st,$arg_e;
            secure_link_md5 mypass$arg_e;
            if ( $secure_link = "" ) {
                return 402;
            }
            if ( $secure_link = "0" ) {
                return 405;
            }
        }
        access_log off;
    }
}

结合PHP实现自动跳转到真实链接地址

- 阅读剩余部分 -

域名从namesilo转移到ename

1、进入 namesilo 域名控制面板中,取消要转出的域名的隐私保护
2、解锁要转出的域名
3、获取转移码到邮箱 Authorization Code
4、进 ename 的 域名转入 频道 输入要转入的域名和邮箱收到的转移码,确认提交并付款。
5、收到 ename 的转移确认邮件!猛日里面的链接!
6、进入 namesilo 的 transfer manager 页面,同意转出。APPROVE--SUBMIT 此时会收到namesilo的转移通知邮件,里面有取消转移的链接。
几分钟后,到 ename 的域名转入频道,查询转入状态 会提示转移成功!

Seacms生成静态的目录结构调整

示例1: 内容页路径:/subtypeEnname/id/

后台第一种目录结构/typeEnname/id/ 在都是顶级分类时生成的是 /dongzuo/1024/ 这种路径,但是存在二级分类时,就变成了 /dianying/dongzuo/1024/

解决方法
编辑 /include/link.func.php 文件第152行,找到:

case "dir1":
    $typePath=getTypePathOnCache($typeId);

修改为

case "dir1":
    $typePath=getTypePathOnCache($typeId,true);

然后到后台清空缓存并重新生成即可。

示例2:
内容页路径:/[dir]/EnName/

后台目录6结构/[dir]/[page]EnName 生成的是 /dongzuo/haizeiwang.html 这种路径,我们在此基础上稍作修改:

解决方法
编辑 /include/link.func.php 文件第178行,找到:

case "dir6":
    $linkStr="/".$GLOBALS['cfg_cmspath'].$GLOBALS['cfg_content_name2']."/".$GLOBALS['cfg_contentpage_name2'].$videoenname.$GLOBALS['cfg_filesuffix2'];
    break;

修改为:

case "dir6":
    $typePath=getTypePathOnCache($typeId);
    $linkStr="/".$GLOBALS['cfg_cmspath'].$GLOBALS['cfg_content_name2']."/".$videoenname.'/';
    if($linkType!='link')$linkStr.=$GLOBALS['cfg_contentpage_name2'].$GLOBALS['cfg_filesuffix2'];
    break;

这样即实现了内容页生成路径为: /[dir]/EnName/

- 阅读剩余部分 -

中国联通短信呼转业务

呼叫转移 是一个我们熟悉的语音来电转移功能,最近换了手机号,想到有没有一项业务可以把短信也转移到新号码呢?经过查询,还真有此业务。

是否可以转移到其他移动号码上?
短信呼转业务面向全国中国联通用户,呼转业务仅提供点对点消息的呼转服务,呼转号码仅限设置为手机终端号码,包括联通及其他运营商终端

资费是怎样的?
2元/月

短信呼转怎样设置?
发送SZ+转移号码到106555555即可。

用户设置完短信转移后,收到的信息是什么样的?
呼转号码为其他运营商号码时呼转后消息主叫号码填写A号码,被叫号码填写B号码,构造一条呼转告知消息,内容为:“呼转短信来自A”。

如何取消短信呼转业务?
发送ZXZY到106555555进行业务退订。

网络和IO测试 bench 一键脚本

代码放在 Github

https://raw.githubusercontent.com/teddysun/across/master/bench.sh

使用时直接执行下面的命令即可

wget -qO- bench.sh | bash

注:bench.sh 其实是一个域名,这个域名 301 到真正的脚本,脚本名就叫 bench.sh