PHPでは意味URLによってウェブサイトが攻撃されるのを防ぐ方法を共有します。
意味URL攻撃とは?好奇心は多くの攻撃者の主要な動機であり、意味URL攻撃は良い例である。このような攻撃は主にURLを編集して面白いことを発見することを含みます。例えば、ユーザーchrisがあなたのソフトウェアの中のリンクをクリックして、ページに着きました。http://example.org/private.php?user=chris彼は自然にアメリカの値を変えて、何が起こるかを見てみます。例えば、彼はアクセス可能です。http://example.org/private.php?user=rasmus 彼が他の人の情報を見られますか?GETデータの操作はPOSTデータより少し便利ですが、露出性はより頻繁に攻撃されることを決めました。特に攻撃の初心者にとっては。多くの抜け穴は特に複雑な原因ではなく、漏れによるものです。多くの経験を持つプログラマーは、上述のURLへの信頼がもたらす危険を容易に意識することができますが、しばしば他の人に指摘されて、はっとします。意味URLの攻撃と脆弱性をより良く示すために、Webmailシステムを例にとって、ユーザ登録は自分のメールをチェックすることができる。ユーザー登録に基づく任意のシステムにはパスワード取得の仕組みが必要です。通常の方法は、攻撃者が知ることができない問題(例えば、あなたのコンピュータのブランドなどが、ユーザー自身に問題と答えを指定させることができれば、より良い)を問い合わせることで、質問が正しければ、登録時に指定されたメールアドレスに新しいパスワードを送信します。Webmailシステムについては、登録時にメールアドレスが指定されない場合がありますので、質問に正解したユーザは、メールアドレスを提示するように求められます。次のフォームは、新しいメールアドレスを問い合わせるために使用されます。一方、彼のアカウント名はフォームの隠しフィールドに存在します。
<input type="hidden" name="user" value="chris" />
<p>Please specify the email address where you want your new password sent:
<input type="text" name="email" />
<input type="submit" value="Send Password" />
</form>
は、スクリプトのレス.phpを受信すると、どのアカウントのパスワードをリセットするかを含むすべての情報が得られ、どのメールアドレスに新しいパスワードを送信するかを示します。ユーザーが上記のフォーム(正しい質問に答えた後)を見ることができれば、彼はchrisアカウントの合法的な所有者だと思う理由があります。もし彼が提供したら[email protected]予備メールアドレスとして、提出後に下記のURLに入ります。http://example.org/reset.php?user=chris&email=chris%40example.org このURLはブラウザバーに表示されているので、どのユーザも簡単にその中のuserとmail変数の役割を見ることができます。この点を意味すると、このユーザーは思い付きます。[email protected]非常にクールなアドレスですので、彼は下記のリンクを訪問して試してみます。http://example.org/reset.php?user=php&email=chris%40example.org これらの情報がユーザによって提供されることを信頼しているなら、それはつまり意味URL攻撃ホールである。この場合、システムはphpアカウントに新しいパスワードを作成して送信します。[email protected]このようにchrisはphpアカウントを盗むことに成功しました。session追跡を使用すると、上記のような状況の発生を容易に回避することができる:
<?php
session_start();
$clean = array();
$email_pattern = '/^[^@\s<&>]+@([-a-z0-9]+\.)+[a-z]{2,}$/i';
if (preg_match($email_pattern, $_POST['email']))
{
$clean['email'] = $_POST['email'];
$user = $_SESSION['user'];
$new_password = md5(uniqid(rand(), TRUE));
if ($_SESSION['verified'])
{
/* Update Password */
mail($clean['email'], 'Your New Password', $new_password);
}
}
?>
上記の例では、より詳細なemail情報または合理的なパスワードのようないくつかの詳細が省略されていますが、ユーザーに提供されたアカウントに対する信頼がないことを示す一方、より重要なのは、ユーザーが正しく質問に答えたためのsession変数を使用することです。SESSION['verifed'])と、質問に正確に答えるユーザー($uSESSION['user]]このような不信感こそ、あなたの応用に穴があくのを防ぐ鍵です。実は、以下の原則を覚えておけばいいです。いかなるユーザーの入力を信じないでください(つまり、ユーザーの入力を検査します。書くのは面倒くさいですが、問題が解決されるより早く来てください。)