ASP 開発では vbs と js の 2 つの言語を使用できることを考慮して、両方の言語のプログラム コードをここで提供します (バイリンガル バージョン? YY 中...) 最後に長文ですが、この記事を入力するために使用したマシンには、 ASP環境のため、提供されたコードはテストされていません。申し訳ありません。コードに問題がある場合は、お気軽にコメントしてください〜皮が厚いです〜
1. 攻撃原理
Cookie スプーフィングは主に、現在のネットワーク上の一部のユーザー管理システムがユーザーのログイン情報を Cookie に保存するという危険な行為を悪用します。その攻撃方法は、SQL インジェクションの脆弱性などの脆弱性に比べれば比較的困難ですが、それでも非常に愚かです。
Cookie に基づく一般的なユーザー システムは、少なくとも 2 つの変数、username と userlevel を Cookie に保存することがわかっています。ここで、username はユーザー名、userlevel はユーザーのレベルです。ブラウザが ASP ページにアクセスすると、次のようなメッセージが送信されます。
GET /.../file.asp HTTP 1.0
...
Cookie: ユーザー名=ユーザー&ユーザーレベル=1
...
パケットの場合、管理者のユーザー名とユーザーレベルの値 (それぞれ admin と 5 であると仮定) がわかっている限り、送信できます。
GET /.../file.asp HTTP 1.0
...
Cookie: ユーザー名=管理者&ユーザーレベル=5
...
管理者権限を取得します。とてもシンプルですね。ただし、この脆弱性が発見される前は、ほぼすべてのユーザー管理システムが Cookie に依存していました。
2. ユーザー情報を安全に保管する
Cookie は安全ではないため、ユーザーのログイン情報を保存する必要がありますが、どこに保存すればよいでしょうか?
ASP には Cookie に加えて、情報を保存できるセッションもあることに気づきました。セッションはサーバー上に保存され、クライアントが勝手に変更できないため、セキュリティが非常に高いです。このようにして、すべての Cookie コードをセッションに置き換えることができます。
3. ユーザー情報の長期保存
セッションを使用してユーザーのログイン情報を保存すると、Cookie による欺瞞の問題は解決されますが、セッションを長期間保存することはできません (IIS のデフォルトのセッションは、ユーザーが応答を停止してから 20 分で期限切れになります)。そのため、Cookie + セッションのハイブリッド保存方法について説明します。このセクションでは が生成されます。
この方法には 2 つの方法があります。1 つは、ユーザーがページにアクセスしたときにセッションが読み取られる方法で、それ以外の場合は Cookie が優先されます。 Cookie に含まれる情報が読み取られ、Cookie 内のコンテンツが合法であるかどうかを判断するために、ユーザー名とパスワードを使用して不透明にログインし、合法である場合はセッションに保存されます。このメソッドを実装するコードは次のとおりです。
ビデオ:
次のようにコードをコピーします。
<%
薄暗いユーザー名、パスワード
ユーザー名 = セッション(ユーザー名)
if ユーザー名 = then
' セッションにユーザーのログイン情報がありません
ユーザー名 = Request.Cookies(ユーザー名)
パスワード = Request.Cookies(パスワード)
' 上記 2 つの文で取得したユーザー名とパスワードは SQL インジェクションの脆弱性から防ぐ必要がある (つまり、一重引用符がフィルターで除外される) 必要があることに注意してください。ここでは省略しています。
ユーザー名 = またはパスワード = の場合、
'ユーザーはログインしていません
...
それ以外
' これは conn オブジェクトと rs オブジェクトが作成されていることを前提としています
rs.Open SELECT TOP 1 * FROM [ユーザー] WHERE ユーザー名=' & ユーザー名 & ' AND パスワード=' & パスワード & ', conn, 1, 3
もし rs.eof なら
「Cookie内の情報は違法です」
...
それ以外
「Cookie 内の情報は合法です。自動的にログインします」
セッション(ユーザー名) = ユーザー名
...
終了する場合
終了する場合
それ以外
'ユーザー情報はすでにセッションに存在します。直接読み取ります
...
終了する場合
%>
js:
次のようにコードをコピーします。
<%
var ユーザー名、パスワード。
ユーザー名 = セッション(ユーザー名) + ;
if (ユーザー名 == || ユーザー名 == 未定義) {
// セッションにユーザー情報がありません
ユーザー名 = Request.Cookies(ユーザー名) + ;
パスワード = Request.Cookies(パスワード) + ;
// 上の 2 つの文で取得したユーザー名とパスワードは、SQL インジェクションの脆弱性を防ぐ必要がある (つまり、一重引用符 ' をフィルターで除外する) 必要があることに注意してください。ここでは省略しています。
if (ユーザー名 == || ユーザー名 == 未定義 || パスワード == || パスワード == 未定義) {
//ユーザーはログインしていません
...
}
それ以外 {
// これは conn オブジェクトと rs オブジェクトが作成されていることを前提としています
rs.Open(SELECT TOP 1 * FROM [ユーザー] WHERE ユーザー名=' + ユーザー名 + ' AND パスワード=' + パスワード + ', conn, 1, 3);
if (rs.eof) {
//Cookie内の情報は不正です
...
}
それ以外 {
//Cookie 内の情報は合法です。自動的にログインします
セッション(ユーザー名) = ユーザー名 + ;
...
}
}
}
それ以外 {
// ユーザー情報は既にセッションに存在するため、直接読み取ります
...
}
%>
しかし、この方法は、ユーザーがページにアクセスするたびにブラウザから Cookie が送信され、パスワードを含む Cookie が他人に取得されると、ユーザーのアカウントが盗まれてしまうため、ユーザーにとってはあまり安全ではありません。この状況に対しては、ユーザー情報データベースにフィールド verifycode を追加する方法があります。ユーザーがログインすると、長整数の検証値がランダムに生成され、ユーザー名とこの verifycode フィールドに格納されます。値が追加され、パスワードの代わりに Cookie が保存されます。 Cookie 内のユーザー情報を検証する場合、ユーザー名と verifycode のみが検証されます。この方法の利点は、ユーザーの Cookie がハッカーによって取得された場合でも、一時的に生成された検証コードを使用してログインできるだけで、ユーザーのパスワードを取得できないことです。このユーザーがユーザー名とパスワードを再度使用してログインする限り、verifycode 値は変更され、ハッカーは元の verifycode を介してログインできなくなります。
このメソッドを実装するには、上記のメソッド 1 のコードをわずかに変更するだけで済みます。まず、ログイン プログラムに、検証後にユーザー情報を保存する段落を追加する必要があります。
ビデオ:
次のようにコードをコピーします。
<%
Response.Cookies(検証コード) = int(rnd * 2100000000)
%>
js:
次のようにコードをコピーします。
<%
Response.Cookies(verifycode) = Math.floor(Math.random() * 2100000000);
%>
次に、上記の確認コードの Cookie の検証 (パスワード) を Cookie の検証 (verifycode) に変更します。
4. 結論
当社の分析と処理により、Cookie のなりすましの脆弱性は完全に解決され、それ以来、当社の ASP プログラムはより安全になりました。