ホームページ  >  記事  >  バックエンド開発  >  PHP はリモート フォーム送信を妨げます

PHP はリモート フォーム送信を妨げます

WBOY
WBOYオリジナル
2016-06-13 13:20:13800ブラウズ

PHP はリモート フォームの送信を妨げます

Web の利点は、情報とサービスの共有です。欠点は、何の躊躇もなく物事を行う人もいるので、情報やサービスを共有することです。
フォームを例に挙げます。誰でも Web サイトにアクセスし、ブラウザ上で [ファイル] > [名前を付けて保存] を使用してフォームのローカル コピーを作成できます。次に、完全修飾 URL (formHandler.php ではなく、フォームはこのサイトにあるため http://www.yoursite.com/formHandler.php) を指すようにアクション パラメーターを変更し、必要なことを実行できます。変更を行った場合は、「送信」をクリックすると、サーバーはこのフォーム データを法的な通信フローとして受信します。
まず、$_SERVER['HTTP_REFERER'] をチェックして、リクエストが自分のサーバーからのものであるかどうかを判断することを検討してください。この方法では、ほとんどの悪意のあるユーザーをブロックできますが、最も高度なハッカーをブロックすることはできません。これらの人々は、ヘッダー内の参照元情報を改ざんして、フォームのリモート コピーをサーバーから送信されたように見せかけるほど賢いのです。
リモート フォームの送信を処理するより良い方法は、一意の文字列またはタイムスタンプに基づいてトークンを生成し、このトークンをセッション変数とフォームに配置することです。フォームを送信した後、2 つのトークンが一致するかどうかを確認します。一致しない場合は、誰かがフォームのリモート コピーからデータを送信しようとしていることがわかります。
ランダムなトークンを作成するには、次のように PHP の組み込み md5()、uniqid()、および rand() 関数を使用できます。

<span style="font-size: small;"><?php  
session_start();  
  
if ($_POST['submit'] == "go"){  
    //check token  
    if ($_POST['token'] == $_SESSION['token']){  
        //strip_tags  
        $name = strip_tags($_POST['name']);  
        $name = substr($name,0,40);  
        //clean out any potential hexadecimal characters  
        $name = cleanHex($name);  
        //continue processing....  
    }else{  
        //stop all processing! remote form posting attempt!  
    }  
}  
  
$token = md5(uniqid(rand(), true));  
$_SESSION['token']= $token;  
  
  
function cleanHex($input){  
    $clean = preg_replace("![\][xX]([A-Fa-f0-9]{1,3})!", "",$input);  
    return $clean;  
}  
?>  
  
  
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">  
<p><label for="name">Name</label>  
<input type="text" name="name" id="name" size="20" maxlength="40"/></p>  
<input type="hidden" name="token" value="<?php echo $token;?>"/>  
<p><input type="submit" name="submit" value="go"/></p>  
</form>   </span>

? PHP ではセッション データをサーバー間で移行できないため、この手法は機能します。誰かがあなたの PHP ソース コードを取得し、それを自分のサーバーに移動し、あなたのサーバーに情報を送信したとしても、あなたのサーバーが受け取るのは、空の、または不正な形式のセッション トークンと、最初に提供されたフォーム トークンだけです。これらは一致しないため、リモート フォームの送信は失敗します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。