2012-03-17 11 views
1

外部サイトからWebページをダウンロードして表示するスクリプトがあります。サイトはワンタイムトークンを生成し、それを隠しフォームフィールドに格納し、同じトークンをユーザーに送信するクッキーに入れます。私の最初のcURLのリクエストで、私はクッキーを保存する:これは正常に動作し、それが正しくクッキーファイルを作成し、私はそれを開いたとき、それはそれでワンタイムトークンを持っており、それが一致するcURL:2つの別々のリクエスト、同じセッション

$url = 'http://www.example.com/form.php'; 
$host = parse_url($url, PHP_URL_HOST); 
$referer = 'http://' . $host; 
$ip_address = $_SERVER['REMOTE_ADDR']; 

// Give the user a unique cookie file for each request 
$cookie_file = 'cookies/' . sha1($ip_address . $agent . $url) . '.txt'; 

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_HTTPGET, 1); 
curl_setopt($ch, CURLOPT_AUTOREFERER, 1); 
curl_setopt($ch, CURLOPT_REFERER, $referer); 
curl_setopt($ch, CURLOPT_USERAGENT, $agent); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); 
curl_setopt($ch, CURLOPT_COOKIESESSION, false); 

$file = curl_exec($ch); 

隠しフォームフィールドのトークン。

私がフォームを送信すると、私は同じクッキーを使用して、別のcURLのリクエストを行います。

$ch = curl_init($url); 

$postdata = http_build_query($postdata); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); 
$ip_address = $_SERVER['REMOTE_ADDR']; 
$cookie_file = 'cookies/' . sha1($ip_address . $agent . $url) . '.txt'; 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); 
curl_setopt($ch, CURLOPT_AUTOREFERER, 1); 
curl_setopt($ch, CURLOPT_REFERER, $referer); 
curl_setopt($ch, CURLOPT_USERAGENT, $agent); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$response = curl_exec($ch); 

クッキーファイル名は、ユーザーのIP、エージェント、およびターゲット以来、周りの二回目と同じでなければなりません元のURLは変更されていません。私はそれが要求のための第2のクッキーを作成せず、最初のクッキーを上書きしないことを確認しました。

フォームを送信すると、隠しフォームフィールドを変更しなくても、CSRFの検証が失敗し、Cookieのワンタイムトークンと一致し、HTTPリフェラーをターゲットURLに設定しました。 CSRFのチェックが失敗する理由がいくつかありますか?何らかの理由で2番目のリクエストでCookieを使用していませんか?どんな助けもありがとう、ありがとう:)

答えて

0

変数を再定義する必要があるかもしれません。あなたの$agent$urlは、数秒でcURLリクエストがありません。

+0

私はそれらをそこに通すので、彼らはそこにいます。そうでない場合は、名前が異なるため新しいCookieが生成されます。 – Joey

関連する問題