Предотвратить прямой доступ к 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!');
}