跟踪文件请求引用者

时间:2012-04-14 20:38:24

标签: php

我在服务器上有一个文件,例如“file.txt”。可以从不同的域请求它。

有没有办法从这个文件被请求跟踪哪个域并将这些数据保存到某个地方?

谢谢。

2 个答案:

答案 0 :(得分:1)

是的,只需获得引用并存储它。变量是$ _SERVER ['HTTP_REFERER']

你有两个选择。您可以编写一个提供文件(http://teddy.fr/blog/how-serve-big-files-through-php)的PHP脚本,并使用PHP存储引用文件。

或者,Web服务器会记录所有访问过的文件。您可以扫描此(结构化)日志以访问您的文件并获取引用。有几个日志分析项目,如AWStats。

答案 1 :(得分:1)

我认为域名不是您的最佳选择..我建议您坚持IP address for限制

您还可以使用$_SERVER ['HTTP_REFERER']来验证调用文件或即将加载文件的确切脚本

尝试

$allowedReferer = array (
        "http://me.test.com/xxx/bbb/zmy.php?",
        "https://me.why.com/xxx/bbb/zmy.axpx" ,
        "http://localhost/lab/stockoverflow/"
);

$allowedIP = array (
        "192.168.0.1",
        "192.168.0.1" ,
        "::1"
);

$file = "file.pdf"; // its can also be a value form $_GET

if (! in_array ( quickIP (), $allowedIP )) {
    die ( "IP LockDown : " . quickIP () );
}

if (! isset ( $_SERVER ['HTTP_REFERER'] )) {
    die ( "Missing Referer" );
}

if (! in_array ($_SERVER ['HTTP_REFERER'] , $allowedReferer)) {
    die ( "Referer Lockdown "  . $_SERVER ['HTTP_REFERER']);
}

$array = parse_url ( $_SERVER ['HTTP_REFERER'] );

header ( 'Content-type: application/pdf' );
header ( 'Content-Disposition: attachment; filename="' . $file . '"' );
readfile ( $file );

function quickIP() {
    return (empty ( $_SERVER ['HTTP_CLIENT_IP'] ) ? (empty ( $_SERVER ['HTTP_X_FORWARDED_FOR'] ) ? $_SERVER ['REMOTE_ADDR'] : $_SERVER ['HTTP_X_FORWARDED_FOR']) : $_SERVER ['HTTP_CLIENT_IP']);
}