我正在尝试在Nginx上创建Time Limited链接...
我有一个PHP脚本,它将一个md5hash的时间和密码添加到URL,然后nginx应该读取并比较时间,看看链接是否应该存活......实际上,它不起作用...对于包含$ st和$ arg_e
的所有内容,它返回403我有一个服务器人,所以nginx的东西不是我的(他把它)并且我不是最好的....所以我需要你的帮助,如果你可以......
这是PHP脚本,我运行所有流量来附加密码和超时参数......这基本上只是一个脚本添加标记“& st =”和“& e =”到网址
<?php
$params = $_SERVER['QUERY_STRING'];
define(URL_TIMEOUT, 120); # 2min timeout
$secret = "xxxmysecretxxx";
$time = pack('N', time() + URL_TIMEOUT);
$timeout = bin2hex($time);
$hashmac = md5($secret.$time);
$url = "http://mytracker.net"."/".$params."&st=".$hashmac."&e=".$timeout;
header('location: '.$url);
//echo $url;
?>
这是带有/ protected文件夹
规范的Nginx配置location /protected {
secure_link_md5 xxxmysecretxxx$arg_e;
secure_link $arg_st,$arg_e;
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 403;
}
location ~ \.php$ {
secure_link_md5 xxxmysecretxxx$arg_e;
secure_link $arg_st,$arg_e;
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 403;
}
#try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
对于我做错什么会有所帮助吗?
期望服务器会根据当前时间检查时间戳,如果从创建哈希值起过去2分钟,则显示403,如果没有显示页面...
请加入......
答案 0 :(得分:1)
Nginx使用“特殊”md5校验和。 “特殊”喜欢“二进制文件,base64编码并且替换了一些字符”。
您可以在nginx manual:
的命令行示例中看到echo -n '2147483647/s/link127.0.0.1 secret' | \
openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =
你可以用php实现类似的东西:
$md5 = md5($your_secure_parameters);
$nginx_md5 = base64_encode(hex2bin($md5));
$nginx_md5 = str_replace(array('+', '/', '='), array('-', '_', ''), $nginx_md5);
此外,我认为时间戳上的bin2hex
和pack
调用过多。