2

フォーム検証のために ajax で呼び出される php ファイルへの直接の URL アクセスを拒否しようとしています。私が現在持っているコードは、フォームが検証されるまで機能しますが、その後は機能しません。.htaccess を使用したくありません。

現在のコード:

<?php

$url = strtolower(basename($_SERVER['PHP_SELF'])); // Gets url (parent that uses the include)
$fil = strtolower(basename(__FILE__)); // gets filename (the included file)
if ($url == $fil){
    // if they are the same (file is accessed through url
    // redirect to forbidden page
    header("HTTP/1.0 403 Forbidden");
    exit;
}
// require my configuration
require_once("config.php");
// code to be executed for ajax validation
$username = $_POST['username'];
$conn = mysql_connect(DB_HOST,DB_USER,DB_PASS) or die(mysql_error());
mysql_select_db(DB_NAME,$conn) or die(mysql_error());

$query = mysql_query("SELECT * FROM " . TB_USER . " WHERE username = '{$username}'",$conn) or die(mysql_error());
$result = mysql_num_rows($query);

mysql_close($conn);

if ($result == 0){
    echo "true";
}else{
    echo "false";
}
?>

URLから直接ファイルにアクセスすると、計画どおりにリダイレクトされますが、フォームがajaxを介して検証されている場合、ユーザー名が利用できない場合は何もしません。コードの最初の 2 行 ($url、$fil) と if ステートメントを削除すると、ajax 検証が機能しますが、ページは URL アクセスで拒否されません。ここから何をすべきかについて何か提案はありますか?

4

2 に答える 2

6

これを使って:

if(!$_SERVER['HTTP_X_REQUESTED_WITH'])
{
   header("HTTP/1.0 403 Forbidden");
   exit;
}

最新のすべてのブラウザーでは、AJAX を使用してページにアクセスすると、PHP はこのヘッダーを要求に追加します。ページが呼び出されていて、このヘッダーが存在しない場合は、直接呼び出されている可能性があります (または、ハイパーリンクなどを介して別のページにリダイレクトされている可能性があります)。基本的に、このページが AJAX を使用して呼び出されない限り、これは常に禁止されたページを表示します。

于 2013-04-23T18:39:02.810 に答える