Javascript 如何知道是否正在src=";内调用php文件&引用;?

Javascript 如何知道是否正在src=";内调用php文件&引用;?,javascript,php,src,Javascript,Php,Src,在我的网站上我有 <script src="js.php"></script> 问题很简单,但我不知道答案: 在js.php中,如何检查文件是否已通过脚本src=“…”调用 其目的是根据调用此php脚本文件的方式(直接访问或脚本src=“…”)更改返回的js.php HTML代码。方法是在调用js.php文件之前将会话变量赋值为true session_start(); $_SESSION['src'] = true; <script src="js.php"

在我的网站上我有

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

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

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


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

方法是在调用js.php文件之前将会话变量赋值为true

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

很酷的问题。让我来帮你

我将在这里提供一些非100%可靠的方法,这些方法将在标准的非用户恶意案例中工作

弗斯特 对于此解决方案,您需要从下载mimeparser。您可以选择要使用哪种MIME解析器,我发现这只是为了回答这个问题

理论 理论上,浏览器正在发送头,响应期间脚本应该匹配头,以便进行适当的浏览器端解析。特别是在这里,我想到了
HTTP\u ACCEPT
header

代码示例 下载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();
<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'); ?>
包含-功能决战 为了了解脚本在某些特殊情况下的情况,您可以创建一个示例
index.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();
<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来说却非常好(;) 希望rest在PHP代码中被注释掉


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

不应习惯使用
=
比较。它在这里不起作用,因为
true
将是一个字符串。使用
“true”
。对,@mario my bad。这不符合要求:任何人都可以直接访问http://.../js.php?src=true 在浏览器导航栏中,愚弄系统,使其相信我们是通过脚本src=“…”inclusion调用的。@user2824618我想到了另一种方法,让我编辑我的答案。检查
获取包含的文件()
怎么样?这应该是假装的安全功能吗?因为那是行不通的。您可以区分HTTP(“direct”)请求和来自不同调用脚本的PHP包含。但是没有可靠的方法来确定HTML链接的来源,或者区分include/require/_once等。是的,这与安全性有关。这必须对用户黑客具有弹性,例如,这不是任何人都可以直接访问的解决方案http://.../js.php?callMethod=src 在浏览器导航栏中,愚弄系统,使其相信我们正在通过脚本src=“…”包含进行调用。任何想从浏览器缓存中读取脚本的人都可以。