在我的网站上我有
<script src="js.php"></script>
问题很简单,但我不知道答案:
在js.php中,如何通过脚本src =“...”检查文件是否已被调用?
目的是根据调用此php脚本文件的方式更改返回的js.php HTML代码(直接访问或脚本src =“...”)。
答案 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阅读进行测试。