web-dev-qa-db-ja.com

phpファイルへの直接URLアクセスを防止する

私のウェブサイトに"check.php"というphpファイルがあり、フォームが送信されると実行されます。

私のウェブサイトは"myweb.com"で、phpファイルはディレクトリ "PHP"にあるとします

「check.php」ファイルへの直接URLアクセスを禁止したい。つまり、誰かがURLを入力した場合、「myweb.com/PHP/check.php "の場合、phpファイルは実行されず、代わりにエラーメッセージが返されます。

.htaccessにルールを設定してアクセスを防止しようとしましたが、フォームを送信しようとしてもphpをブロックします。

.htaccessルール:

RewriteEngine on 
RewriteCond %{THE_REQUEST} \.php[\ /?].*HTTP/ 
(.*)\.php$ /index.html [L] 

それを行う方法はありますか?

11
It Assistors

あなたは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' ) );

    }
?>
20
RamRaider

このコードをcheck.phpの先頭に配置します。

if(!isset($_SERVER['HTTP_REFERER'])){
    // redirect them to your desired location
    header('location:../index.php');
    exit;
}

ユーザーがURLを直接入力してcheck.phpにアクセスする場合、目的の場所にリダイレクトされます。

7
Westly Tanbri

Root/.htaccessでこれを試してください:

RewriteEngine on


RewriteCond %{REQUEST_METHOD} !^POST$
RewriteRule ^php/check.php$ - [NC,R=404,L]

Check.phpがフォーム投稿メソッドによってアクセスされない場合、これは404 not foundを返します。

4
starkeen

これは、Googleがphpの例で使用するものです

if (php_sapi_name() != 'cli') {
  throw new \Exception('This application must be run on the command line.');
}
1
Toskan

私は選択した答えを試しましたが、特にAjaxでGETを使用してPHPファイル内の関数から値を返したい場合、それを実装するいくつかの問題に遭遇しました。

他のソリューションについてかなり広範な研究を行った後(および独自のテストを少し行った後)、次のコードを思い付きました。

<?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. */
}
?>

上記のコードは私が望んでいたように機能し、他の答えが指摘されているように複数のブラウザで問題が発生することはないと思います。また、セキュリティ上の問題があるとは思いませんが、間違っている可能性があります(私が(とその理由)かどうか教えてください)、私は比較的Webプログラミングに慣れていません。

直接URLアクセスをブロックするすべてのファイルの上に(すべて、さらにはrequire、includes、session_startsの前でも)そのコードを追加するだけで、準備完了です。

1
Martin Koch
if (basename($_SERVER['SCRIPT_FILENAME']) === 'common.php')
{
    exit('This page may not be called directly!');
}
0
Erik Thiart

これも試してみてください。 check.phpの上部に過去

<?php debug_backtrace() || die ("<h2>Access Denied!</h2> This file is protected and not available to public."); ?>

ファイルがURLで直接アクセスされると、アクセス拒否が表示されます

0
icynets