如果用户没有访问我的网站,则阻止图像,CSS或JS

时间:2011-10-06 13:46:02

标签: apache curl block wget

我突然向我的网站收到了很多请求(wget,curl等......)。

我不希望执行任何这些请求,除非用户使用有效的浏览器(如Firefox或Chrome)访问过我的网站至少一次。

是否有Apache模块可以执行此操作?我该怎么办?

1 个答案:

答案 0 :(得分:24)

概念很简单:创建一个将在您要保护的文件中使用的令牌。这个 此令牌(类似“abc123”的密钥 - 保存在会话中,而不是cookie)将在您加载的每个文件中使用。 这样,如果令牌与文件不匹配,您可以重定向到未找到的页面或拒绝访问。

index.php

中设置令牌
<?php
  session_start();
  header("Cache-Control: no-cache, must-revalidate");
  header("Expires: Mon, 10 Oct 2005 05:00:00 GMT");
  $_SESSION['siteToken'] = "abc123";
?>

<html>
<head> 
  <link rel="stylesheet" type="text/css" href="/style.css" />
</head>
<body>

现在对于CSS和JavaScript文件,您需要检查令牌以确保它已设置并且它是正确的值。

// style.css
<?php
  session_start();
  header("Content-type: text/css");
  header("Cache-Control: no-cache, must-revalidate");
  header("Expires: Mon, 10 Oct 2005 05:00:00 GMT");
  if($_SESSION["siteToken"] != "abc123") {
    session_regenerate_id();
    die(); // or redirect
  } 
?>
body { background-color: #000; color: #fff; }
etc...

您对JavaScript文件执行相同的操作。

如果您更新.htaccess以确保正确解析CSS和JavaScript文件,则执行下一步:

RewriteEngine on
RewriteBase /
RewriteRule style.css style.php [NC,L]

此外,您可以在.htaccess中添加此内容,以防止坏机器人查询文件:

SetEnvIfNoCase User-Agent "^Wget" bad_bot
SetEnvIfNoCase User-Agent "^EmailSiphon" bad_bot
SetEnvIfNoCase User-Agent "^EmailWolf" bad_bot
SetEnvIfNoCase User-Agent "^libwww-perl" bad_bot
#etc...
Deny from env=bad_bot

现在的图像。此解决方案也可以正常工作,但它比解析CSS和JavaScript文件要慢。 逻辑是相同的,但不是回声,你必须读取文件(使用readfile)。 此外,您必须根据文件的扩展名更改标头。

替代方法是在.htaccess文件中设置:

RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?domain.com [NC]
RewriteRule \.jpg$ - [NC,F,L]

虽然这不是防弹的。