2012-03-27 15 views
0

私はURLの書き換えを防ぐ良い解決策を見つけようとしています。これまでのところ私は持っていますPHPはURL改ざんを防止します

session_start(); 
$userEmail = $_SESSION["email"]; 
$user = $_GET["user"]; 

if(!isset($_SESSION["email"])){ 
header("Location:login.php"); 
} 

if($user !== $_SESSION["email"]){ 
header("Location:notes.php?user=$userEmail"); 
} 

コードの最後のビットがリダイレクトエラーを生成します。

+0

このファイルはnotes.phpですか? – BoltClock

+0

はいnotes.phpはファイルです – Unsuspected

+1

notes.phpの内容を表示します。 – davidethell

答えて

1

このページのURL改ざんを防止しようとしていますか?notes.php

notes.phpまたは他のページが表示されていない場合は、言うことは難しいです。しかし、URLが改ざんを防止するために、それが何かやっにより敏感ページ$_SERVER['HTTP_REFERER']をチェックすることは常に良いことだ:

if ($_SERVER['HTTP_REFERER'] !== "previous_page.php") { 
header("Location: error_page.php"); 
session_destroy(); 
exit; 
} 

をしかし、攻撃者がprevious_page.php上にある場合、彼は単にページを閲覧することができますので、それは、完全な証拠ではありません我々は保護しようとしているので、さらなる保護が必要です。

トークンシステムを実装できます(また実装する必要があります)。これは、そのように行われます。

$_SESSION['token'] = md5(uniqid(rand(), TRUE)); 

これは、そのページを閲覧した人に固有の素敵な長い文字列を生成します。これを行うポイントは、このセッション変数を$_GET変数として次のページに渡し、次に2つの変数を比較して、それらが互いに等しいかどうかを確認することです。これは次のように行われます:

$token = $_SESSION['token']; 
header("Location:notes.php?user=$userEmail&token=$token"); 

//...then, on notes.php: 
if ($_GET['token'] !== $_SESSION['token']) { 
header("Location: error_page.php"); 
session_destroy(); 
exit; 
} 

しかし、非常に巧妙な人がこれを回避する可能性があります。私は "CSRF偽造"に関するより多くの研究をすることを提案したいと思います。これはあなたが正しい方向にあなたを得ることを望みます。

+0

HTTP_REFERERヘッダーはブラウザによって提供されるため、信頼できません。 'カール'や 'wget'を持つ人は誰でも簡単に偽造することができます。 – ghoti

+0

ほとんどすべての種類のセキュリティには穴があります。 'HTTP_REFERER'はバイパス可能ですが、少なくともいくつかの人を悩ますので、全体の保護が向上します。 – Norse

+0

私は同意しません。安全なソリューションを実装することが唯一の保護です。それが簡単に偽造されていることが分かっている場合は、なぜそれを実装するのですか?半分のソリューションは、本当の仕事からあなたをそらすことによって、時間を無駄にするだけです。 HTTP_REFERERは信頼できません。そうしないで、あなたが信じることのできるものに移動してください。 – ghoti

0

あなたが避けようとしている「URL改ざん」は、ログインしたユーザーだけがページにアクセスできるようになっているようです。その場合は、署名されたCookieまたはCookieに保存されているセッションIDのいずれかを与えます。

それはあなたが意味するものではない場合は、質問を言い換えてください - あなたは何をやっていないのですか?

関連する問題