phpの中で偽造防止のためにお願いします。
駅を偽造して、駅間の偽造を紹介してほしいと要請しました。また、被害が大きいので、攻撃者はこのようにいたずらをしたり、spam情報を送ったり、データを削除したりすることができます。このような攻撃の一般的な表現は、リンクを偽造し、ユーザーを誘惑してクリックしたり、知らないうちに偽造フォームにアクセスさせたりして、ユーザーを誘って提出します。フォームは非表示であり、画像またはリンクの形で偽装することができます。一般的で安価な予防手段としては、ユーザの書き込み操作に関わる可能性のあるすべてのフォームにランダムで頻繁な文字列を追加し、フォームを処理する際にこの文字列をチェックします。このランダム文字列は、現在のユーザのアイデンティティに関連すると、攻撃者が偽造要求をするのが面倒です。Yahoo!偽スパン要求に対しては、フォームに「crumb」という乱数列を追加する方法があります。フェイスブックにも似たような解決方法があります。フォームにはしばしばpost_があります。form_idとfb_dtsgランダムシリアルコードは私達がこの構想によって実現します。コードは次の通りです。
<?php
class Crumb {
CONST SALT = "your-secret-salt";
static $ttl = 7200;
static public function challenge($data) {
return hash_hmac('md5', $data, self::SALT);
}
static public function issueCrumb($uid, $action = -1) {
$i = ceil(time() / self::$ttl);
return substr(self::challenge($i . $action . $uid), -12, 10);
}
static public function verifyCrumb($uid, $crumb, $action = -1) {
$i = ceil(time() / self::$ttl);
if(substr(self::challenge($i . $action . $uid), -12, 10) == $crumb ||
substr(self::challenge(($i - 1) . $action . $uid), -12, 10) == $crumb)
return true;
return false;
}
}
コードの中のUSuidはユーザーの唯一の標識を表します。アプリケーションの一例として、フォームに隠しランダムなシリアルcrumb
<form method="post" action="demo.php">
<input type="hidden" name="crumb" value="<?php echo Crumb::issueCrumb($uid)?>">
<input type="text" name="content">
<input type="submit">
</form>
を挿入し、フォームdemo.phpを処理して、crumbをチェックします。