Предотвратить прямой доступ к URL-адресу в php файл
У меня есть php файл, который говорит на "check.php" на моем веб-сайте и выполняется при отправке формы.
скажите, что мой сайт "myweb.com" , а файл php находится в каталоге "PHP"
Я хочу запретить прямой доступ к URL-адресу файла "check.php", т.е. если кто-то набирает url " myweb.com/PHP/check.php", тогда файл php не должен быть и он должен вернуть сообщение об ошибке.
Я пытался предотвратить доступ, установив правило в .htaccess, но он блокирует php, даже когда я пытаюсь отправить форму.
.htaccess правило:
RewriteEngine on
RewriteCond %{THE_REQUEST} \.php[\ /?].*HTTP/
(.*)\.php$ /index.html [L]
Есть ли способ сделать это?
Ответы
Ответ 1
Вы можете сделать это с помощью PHP
<?php
/* at the top of 'check.php' */
if ( $_SERVER['REQUEST_METHOD']=='GET' && realpath(__FILE__) == realpath( $_SERVER['SCRIPT_FILENAME'] ) ) {
/*
Up to you which header to send, some prefer 404 even if
the files does exist for security
*/
header( 'HTTP/1.0 403 Forbidden', TRUE, 403 );
/* choose the appropriate page to redirect users */
die( header( 'location: /error.php' ) );
}
?>
Ответ 2
Поместите этот код в начало check.php:
if(!isset($_SERVER['HTTP_REFERER'])){
// redirect them to your desired location
header('location:../index.php');
exit;
}
Если пользователь имеет доступ к check.php по типу URL напрямую, он перенаправит их в нужное место.
Ответ 3
Попробуйте это в Root/.htaccess:
RewriteEngine on
RewriteCond %{REQUEST_METHOD} !^POST$
RewriteRule ^php/check.php$ - [NC,R=404,L]
Это вернет 404 не найден, если check.php не получает доступ по методу формы.
Ответ 4
Я попробовал выбранный ответ, но столкнулся с некоторыми проблемами при его реализации, особенно если я хотел вернуть значения из функций в файле PHP, используя GET с Ajax.
После довольно обширных исследований других решений (и небольшого собственного тестирования) я разработал следующий код:
<?php
$currentPage = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
if ($_SERVER['REQUEST_METHOD'] == "GET" && strcmp(basename($currentPage), basename(__FILE__)) == 0)
{
http_response_code(404);
include('myCustom404.php'); // provide your own 404 error page
die(); /* remove this if you want to execute the rest of
the code inside the file before redirecting. */
}
?>
Я обнаружил, что приведенный выше код работает так, как я хотел, и я не думаю, что у него будут проблемы с несколькими браузерами, как указано в другом ответе. Я также не думаю, что это будет иметь какие-либо проблемы безопасности, но я могу ошибаться (пожалуйста, скажите мне, если я (и почему)), я относительно новичок в веб-программировании.
Просто добавьте этот код поверх каждого файла, который вы хотели бы заблокировать прямым доступом к URL (прежде чем все, даже требует, включает и session_starts), и все готово.
Ответ 5
это то, что Google использует в своих примерах php
if (php_sapi_name() != 'cli') {
throw new \Exception('This application must be run on the command line.');
}
Ответ 6
Попробуйте это тоже. Прошлое в верхней части check.php
<?php debug_backtrace() || die ("<h2>Access Denied!</h2> This file is protected and not available to public."); ?>
Отказ от доступа будет представлен, когда файл имеет доступ непосредственно в URL-адресе
Ответ 7
? php debug_backtrace() || умереть ("
Доступ закрыт!
Этот файл защищен и не доступен для общественности. ");?> Это работает, когда я использовал, чтобы открыть прямой доступ к URL, но это также предотвращает, когда я использовал, чтобы войти на сайт, его ошибка СЭМ место
Ответ 8
if (basename($_SERVER['SCRIPT_FILENAME']) === 'common.php')
{
exit('This page may not be called directly!');
}