【问题标题】:Server headers, referrers, etc服务器标头、引荐来源网址等
【发布时间】:2011-09-03 08:36:51
【问题描述】:

我有一个名为 javascript.php 的脚本,我将其包含在我的 html 中的 SCRIPT 标记中,如下所示:

<script type="text/javascript" src="javascript.php"></script>

我想知道的是,是否可以在javascript.php下检查是否有人直接访问它,例如:

http://myhost.com/javascript.php

如果有人将它包含在他的 HTML 中?

更准确地说:如果客户端直接通过 URL 或通过 HTML 源下的 SCRIPT 请求请求,服务器是否会从客户端收到标头?

【问题讨论】:

  • 别打扰了。 Firebug 会轻而易举地打败它。

标签: php javascript http-headers


【解决方案1】:

不,不会有任何保证。

【讨论】:

  • 他是对的。有一个引用标题,但可以轻松操作。
  • 我需要知道它是作为脚本包含在 HTML 中还是直接访问,仅此而已:)
【解决方案2】:
$_SERVER['HTTP_REFERER']

但是这是从用户代理发送的,这意味着他们可以发送他们想要的任何东西

【讨论】:

    【解决方案3】:

    可能会减少包含脚本的“愚蠢”尝试的简单解决方案:

    if(!empty($_SERVER['HTTP_REFERRER'])){
        $parts = parse_url($_SERVER['HTTP_REFERRER']);
        $allowed_hosts = array('example.com');
    
        if(!in_array($parts['host'], $allowed_hosts)) {
            exit;
        }
    }
    

    正如上面提到的,引荐来源标头可以很容易地被操纵。如果你想真正防止这个问题,你可以在脚本路径中添加一些使用简单规则生成的 GET 参数,然后检查它们。例如:

    index.php

    $c1 = rand();
    $c2 = md5($c1.'HAHA');
    $codes = '?c1='.$c1.'&c2='.$c2;
    ...
    <script type="text/javascript" src="javascript.php<?php echo $codes; ?>"></script>
    

    script.php

    if(!isset($_GET['c1']) || !isset($_GET['c2']) || md5($_GET['c1'].'HAHA') != $_GET['c2']) {
        exit;
    }
    ...
    

    这个解决方案的不足之处在于你的JS文件不会被浏览器缓存,因为它每次都会用不同的参数调用。

    【讨论】:

      猜你喜欢
      • 2013-12-06
      • 2011-07-15
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多