如何知道是否在src中调用了php文件=" ..."?

时间:2015-03-14 12:09:50

标签: javascript php src

在我的网站上我有

<script src="js.php"></script>

问题很简单,但我不知道答案:

在js.php中,如何通过脚本src =“...”检查文件是否已被调用?

目的是根据调用此php脚本文件的方式更改返回的js.php HTML代码(直接访问或脚本src =“...”)。

2 个答案:

答案 0 :(得分:2)

执行此操作的方法是在调用js.php文件之前将会话变量指定为true

session_start();
$_SESSION['src'] = true;
<script src="js.php"></script>

然后在php文件中

session_start();
if(isset($_SESSION['src']) && $_SESSION['src'] == true) {
    // file was called from a src
    $_SESSION['src'] = false; // this is important so that it can't be called from direct access
}

答案 1 :(得分:1)

很酷的问题。让我帮忙。

我在这里提供一些不是100%可靠的方法,这些方法适用于标准的,非用户恶意的情况。

第一

对于此解决方案,您需要从here下载mimeparser。您可以选择使用哪种mimeparser,我发现这只是为了这个答案的临时性。

理论

理论上,浏览器正在发送标头,您的脚本在响应期间应匹配正确的浏览器端解析。特别是我在这里HTTP_ACCEPT标题。

代码示例

下载了mimeparser之后,让我们开始创建文件test.php

<?php // test.php

//https://code.google.com/p/mimeparse/
include_once('mimeparse.php');

$mimeMatch = Mimeparse::best_match(array('text/javascript', 'text/css', 'text/html', 'application/xhtml+xml', 'application/xml', 'image/*'), $_SERVER['HTTP_ACCEPT']);

switch($mimeMatch) {
    case 'text/javascript': // via <script src>
        echo('alert("this is loaded as script");');
        break;
    case 'image/*': // via <image src>
        header('Location: http://i.stack.imgur.com/sOq8x.jpg?s=128&g=1');
        break;
    case 'text/css': // via <link href>
        echo('body::before{content: "this is written via CSS"}');
        break;

    default:

        var_dump('detected standard file request by matching to ' . $mimeMatch);

        // if __FILE__ is first on a list, its not included
        if(__FILE__ !== array_shift(get_included_files())) {
            var_dump('file was included or required');
        } else {
            var_dump('file runs on its own');
        }

        // additional detect for ajax request.
        if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
            var_dump('loaded via AJAX request');
        } else {
            var_dump('loaded via not-AJAX request');
        }

        break;
}
die();

您现在可以访问它,以查看该脚本是否检测到,直接加载:

string 'detected standard file request by matching to text/html' (length=55)
string 'file runs on its own' (length=20)
string 'loaded via not-AJAX request' (length=27)

包含 - 功能摊牌

要查看在某些特殊情况下脚本发生了什么,您可以创建示例index.php

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

<script src="test.php"></script>
<img src="test.php"></img>

<?php require('test.php'); ?>

描述

通过解析从浏览器发送的一些标准行为标题,我们可以松散地预测页面加载的上下文。它不是100%可靠而且不是一个很好的练习,但无论如何都非常适合编写rootkit ;)

希望休息在PHP代码中被注释掉。

使用Apache服务和Chrome阅读进行测试。