2

ユーザーが Web サイトの Cookie を操作し、それを使用してセキュリティの抜け穴を悪用できるという記事を読みました。私は検索を行い、オンラインで投稿されたアイデアに出くわしました。以下のコードは、ユーザーのユーザー名とパスワードが認証された後のコードです。

$Separator = '--';
$uniqueID = 'jhlhgjh12u0@345';
$Data = $userID.' '.md5('65748');

$expire=time()+60*24;
setcookie('verify-user', $Data.$Separator.md5($Data.$uniqueID), $expire);

上記のコードは、uniqueID、userID、MD5 ハッシュ番号、およびセパレーターを使用して Cookie を設定します。uniqueID、md5 ハッシュ番号、およびセパレーターは、開発者によって設定されます。UniqueID と md5 ハッシュ番号がわからないため、ユーザーは Cookie を操作できないという考えです。以下のコードは、各 Cookie が操作されているかどうかをテストするために使用されます。

if ($_COOKIE) {

$Separator="--";
$uniqueID = 'jhlhgjh12u0@345';

$Cut = explode($Separator, $_COOKIE['verify-user']);
if (md5($Cut[0].$uniqueID) === $Cut[1]) {
   $_COOKIE['verify-user'] = $Cut[0];

 } else {

   echo "fake cookie";

}
}
else {
   echo "fake cookie";
}

この方法はセキュリティが厳しいのか、それとも抜け穴があるのか​​ 疑問に思っています。批判と訂正を歓迎します

4

1 に答える 1

2

これはメッセージ署名と呼ばれます。メッセージをシークレットと一緒にハッシュし、その「署名」をメッセージ自体に添付します。これにより、受信者は、シークレット自体を明らかにすることなく、メッセージの作成者/署名者がシークレットを所有していることを確認できます。

特定の実装の問題は、

  • 秘密が小さすぎる
  • ハッシュアルゴリズムはタスクには適していません
  • Cookie は変更されず、期限切れになることもありません。クッキーが盗まれた場合、頼りになるものはありません

より長いシークレットを使用する必要があります。また、タスクに適したハッシュ アルゴリズム、つまり HMAC ( hash-based message authentication ) などを使用する必要があります。例えば:

hash_hmac('sha512', $data, $secret)

ここで、値の有効期限を含む同様の実装を見ることができます。


ただし、最も重要なことは、署名付きのプレーン テキスト メッセージが最初からここに行くのに最適な方法であるかどうかを 3 度考えることです。おそらく、まったく意味のないランダムな文字列がサーバーに保存されるデータの ID として使用される、セッションのようなシステムが必要になるでしょう。これにより、ユーザーが Cookie を操作する問題が完全に解消されます。

于 2013-08-23T08:28:08.340 に答える