javascript — Как узнать, вызывается ли php-файл в src = & quot; … & quot ;?

У меня на сайте есть

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

Вопрос очень простой, но я понятия не имею об ответе:

В js.php как я могу проверить, был ли файл вызван скриптом src = «…»?

Цель состоит в том, чтобы изменить возвращенный HTML-код js.php в зависимости от того, как называется этот файл сценария php (прямой доступ или script src = «…»).

2

Решение

Способ сделать это — присвоить переменной сеанса значение 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
}
2

Другие решения

Классный вопрос. Позволь мне помочь тебе.

Я приведу здесь некоторые не 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.

1

По вопросам рекламы [email protected]