私のウェブサイトに"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]
それを行う方法はありますか?
あなたは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' ) );
}
?>
このコードをcheck.phpの先頭に配置します。
if(!isset($_SERVER['HTTP_REFERER'])){
// redirect them to your desired location
header('location:../index.php');
exit;
}
ユーザーがURLを直接入力してcheck.phpにアクセスする場合、目的の場所にリダイレクトされます。
Root/.htaccessでこれを試してください:
RewriteEngine on
RewriteCond %{REQUEST_METHOD} !^POST$
RewriteRule ^php/check.php$ - [NC,R=404,L]
Check.phpがフォーム投稿メソッドによってアクセスされない場合、これは404 not foundを返します。
これは、Googleがphpの例で使用するものです
if (php_sapi_name() != 'cli') {
throw new \Exception('This application must be run on the command line.');
}
私は選択した答えを試しましたが、特に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の前でも)そのコードを追加するだけで、準備完了です。
if (basename($_SERVER['SCRIPT_FILENAME']) === 'common.php')
{
exit('This page may not be called directly!');
}
これも試してみてください。 check.phpの上部に過去
<?php debug_backtrace() || die ("<h2>Access Denied!</h2> This file is protected and not available to public."); ?>
ファイルがURLで直接アクセスされると、アクセス拒否が表示されます