У меня на сайте есть
<script src="js.php"></script>
Вопрос очень простой, но я понятия не имею об ответе:
В js.php как я могу проверить, был ли файл вызван скриптом src = «…»?
Цель состоит в том, чтобы изменить возвращенный HTML-код js.php в зависимости от того, как называется этот файл сценария php (прямой доступ или script src = «…»).
Способ сделать это — присвоить переменной сеанса значение true прямо перед вызовом файла js.php.
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
}
Классный вопрос. Позволь мне помочь тебе.
Я приведу здесь некоторые не 100% надежные методы, которые будут работать в стандартных, не злонамеренных для пользователя случаях.
Для этого решения вам потребуется скачать 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% надежно и не очень хорошая практика, но отлично подходит для написания руткитов 😉 тем не мение.
Надеемся, что остальные закомментированы в коде PHP.
Протестировано с использованием Apache и чтением Chrome.