セシオン認証コードを安全に検証し、認証コードを迂回する攻撃を避ける

1557 ワード

どのサイトで見たかは覚えていませんが、一般的に検証コードの検証については、以下のように書きやすいです.
 
  
If Request.Form("SecurityCode") = Session("SecurityCode") Then
' TODO : Database operations
Else
Response.Write "Security code incorrect!"
End If
%>

認証コードピクチャは、Session(「SecurityCode」)を生成し、正しい認証コード値を保存した後、ユーザから送信された認証コード値を取得し、2つのペアが同じであれば、認証コードが正しいことを示し、そうでなければ認証コードエラーを示す.表面的にはこのようなアルゴリズムには問題はないが,特殊な場合には検証符号形を虚構にする.
まず、上記のアルゴリズムに核心があるのは、検証コードピクチャを生成するファイルにアクセスしてこそ、検証コード値を保存するSessionがあり、ユーザーの入力を正確に比較することができることを知っています.もし誰かが検証コードピクチャファイルを迂回したFormを構築して提出すれば、何が得られますか.Session(「SecurityCode」)が存在しないのは空であり,このときユーザ検証コードが何も入力されなければ,検証コード検証は虚構となる.はい、ここで脆弱性攻撃を利用する鍵は検証コードのSessionです.サーバがこのSessionを生成しないようにして、このような攻撃を可能にすることができます.
解決方法も簡単で、検証コードのSessionが空であるかどうか、またはユーザーが入力した検証コードが合法であるかどうかを検証するには、セキュリティフォームを構築する鍵は、ユーザーの入力を永遠に信じないことです.このセキュリティ問題は、検証コードSessionとユーザーが入力した二重保険法を用いて解決します.
 
  
' str ,len
Function IsSecurityCodeValid(str, len)
IsSecurityCodeValid = Not CBool( _
IsEmpty(str) Or CStr(str)="" Or Len(str)End Function
If IsSecurityCodeValid(Request.Form("SecurityCode"), 4) AND _
IsSecurityCodeValid(Session("SecurityCode"), 4) AND _
Request.Form("SecurityCode") = Session("SecurityCode") Then
' TODO : Database operations
Else
Response.Write "Security code incorrect!"
End If