CSRFの防御例(PHP)
5532 ワード
原文接続:http://www.pythontab.com/html/2014/php_1121/923.html
CSRFの防御はサービス側とクライアント側の両方から着手することができ、防御効果はサービス側から着手したほうが効果的であり、現在では一般的なCSRF防御もサービス側で行われている.1サービス・エンド
CSRFの防御はサービス側とクライアント側の両方から着手することができ、防御効果はサービス側から着手したほうが効果的であり、現在では一般的なCSRF防御もサービス側で行われている.
1.サービス側がCSRF防御を行う
サービス側のCSRF方式の方法は様々であるが,クライアントページに擬似乱数を増やすことが全体的な考え方で一致している.
(1)-Cookie Hashing(すべてのフォームに同じ擬似ランダム値が含まれています):
これは最も簡単な解決策かもしれませんが、攻撃者はサードパーティのCookie(理論的に)を得ることができないため、フォームのデータの構築に失敗しました:>
フォームにHash値を追加して、これがユーザーから送信されたリクエストであることを確認します.
CSRFの防御はサービス側とクライアント側の両方から着手することができ、防御効果はサービス側から着手したほうが効果的であり、現在では一般的なCSRF防御もサービス側で行われている.1サービス・エンド
CSRFの防御はサービス側とクライアント側の両方から着手することができ、防御効果はサービス側から着手したほうが効果的であり、現在では一般的なCSRF防御もサービス側で行われている.
1.サービス側がCSRF防御を行う
サービス側のCSRF方式の方法は様々であるが,クライアントページに擬似乱数を増やすことが全体的な考え方で一致している.
(1)-Cookie Hashing(すべてのフォームに同じ擬似ランダム値が含まれています):
これは最も簡単な解決策かもしれませんが、攻撃者はサードパーティのCookie(理論的に)を得ることができないため、フォームのデータの構築に失敗しました:>
// Cookie
$value
= “DefenseSCRF”;
setcookie(”cookie”,
$value
, time()+3600);
?>
フォームにHash値を追加して、これがユーザーから送信されたリクエストであることを確認します.
$hash
= md5(
$_COOKIE
[
'cookie'
]);
?>
$hash
;?>”>
そしてサーバ でHash を う
if
(isset(
$_POST
[
'check'
])) {
$hash
= md5(
$_COOKIE
[
'cookie'
]);
if
(
$_POST
[
'check'
] ==
$hash
) {
doJob();
}
else
{
//...
}
}
else
{
//...
}
?>
この は には99%のCSRF を ぐことができると いますが、まだ1%あります.ユーザーのCookieはサイトのXSSの で まれやすいので、 の1%です. な はHash を する があるのを て、 に します.いくつかは されます.だから、100%の が なら、これは の ではありません.
(2). コード
この の は: のユーザーの はすべてユーザーがフォームの で1つのピクチャーの のランダムな を する があって、 ....この は にCSRFを することができて、しかし は いやすい の であまりよくないようで、また コードのピクチャーの は1つのMHTMLと ばれるBugに していると いて、いくつかのバージョンのマイクロソフトのIEの で を けるかもしれません.
(3).One-Time Tokens( なるフォームには なる ランダム が まれています)
One-Time Tokensを する は、「パラレルセッションの 」に してください.ユーザーが1つのサイトで に2つの なるフォームを いた 、CSRF は、どのフォームへの にも を えるべきではありません.フォームがロードされるたびにサイトが の ランダム を きする ランダム を すると、 のすべてのフォームに な ランダム が まれているため、ユーザーは に いたフォームを にコミットするしかありません.CSRF がオプションカードのブラウズに しないか、 のブラウザウィンドウを して1つのサイトをブラウズしないように してください.
の の :
1).まずトークン (gen_token()
function
gen_token() {
// , Rand() , 。
// Findbugs 《Random object created and used only once》
$token
= md5(uniqid(rand(), true));
return
$token
;
}
2). はSessionトークン (gen_stoken()です.
function
gen_stoken() {
$pToken
=
""
;
if
(
$_SESSION
[STOKEN_NAME] ==
$pToken
){
// ,
$_SESSION
[STOKEN_NAME] = gen_token();
}
else
{
//
}
}
?>
3).WEBフォームは ドメインの を する:
function
gen_input() {
gen_stoken();
echo
“
value=\”" .
$_SESSION
[STOKEN_NAME] . “\”> “;
}
?>
4).WEBフォーム :
session_start();
include
(”functions.php”);
?>
gen_input(); ?>
5).サービス トークン:
これは です.ここではもうくどくどしません.