プロが教える店舗&オフィスのセキュリティ対策術

asp.netでmssql server を利用してログイン機能を実装しました。
以下のようなコードでmssqlに保存してあるIDとパスが一致すれば
以降の画面ではセッションにID、パスが保存され
page loadでセッションにID、パスがなかればページがすすんでいけないような設定にしています。
機能は問題なく動作しているのですがこのような仕様はセキュリティ上問題はないのでしょうか。
商用サイトではないのですが、ある程度広域に向けたサイトを構築しようと考えておりまして、セキュリティ向上のため、工夫できるようなことがあればご意見いただきたいです。
よろしくお願いいたします。

**************************************************************
ログインページ
**************************************************************
Dim staffid As Integer
Dim staffname As String
Dim adminflag As Boolean

Protected Sub btnLogon_Click(ByVal sender As Object, ByVal e As System.EventArgs)
'ユーザーIDの入力チェック
If txtUserID.Text = "" Then
lblErr.Text = "ユーザーIDを入力してください。"
Return
End If
'パスワードの入力チェック
If txtpassword.Text = "" Then
lblErr.Text = "パスワードを入力してください。"
Return
End If

'ユーザーとパスワードの検証
If Not CheckUserPassword(txtUserID.Text, txtpassword.Text) Then
lblErr.Text = "ユーザーIDまたはパスワードが違います。"
Return
End If
'セッション変数へ値をセットする
Session("StaffID") = staffid
Session("StaffName") = staffname
Session("AdminFlag") = adminflag

End Sub

Private Function CheckUserPassword(ByVal userid As String, ByVal password As String) As Boolean
Dim ret As Boolean
Dim strSQL As String
strSQL = "SELECT staffID, staff_name, admin_flag , permission FROM tbl_staff " & _
"WHERE userID = '" & userid.Replace("'", "''") & _
"' AND password = '" & password.Replace("'", "''") & "'"

'接続文字列を取得する
Dim cnStr As String = System.Configuration.ConfigurationManager.ConnectionStrings("hogehogeConnectionString").ConnectionString()

'コネクションを定義する
Using connection As New SqlConnection(cnStr)
'コマンドを定義する
Dim command As New SqlCommand(strSQL, connection)
'コネクションを開く
connection.Open()

Try
'コマンドからデータリーダーを定義する
Dim dr As SqlDataReader = command.ExecuteReader
'データリーダーから結果を読み込む
If dr.Read Then
'対象データが存在する場合
'正しいユーザーIDとパスワードが指定されたので、
'データリーダーから読み出したデータをメンバ変数にセットする
staffid = dr("staffID")
staffname = dr("staff_name")
adminflag = dr("admin_flag")
permission = dr("permission")
ret = True
Else
'対象データが存在しない場合
'不正なユーザーIDまたはパスワードが指定された
ret = False
End If
Catch ex As Exception
'例外処理(SQLエラーなど)
ret = False
End Try

'コネクションを閉じる
connection.Close()
End Using

'結果を返して終了する
Return ret
End Function


**************************************************************
ログイン後に行くページでの設定
**************************************************************

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)

'[ユーザーID]ボックスにフォーカスをセットする

If Session("StaffID") Is Nothing Then
Response.Redirect("~/top.aspx")
ElseIf Not Session("AdminFlag") = True Then
Response.Redirect("~/top_normal.aspx")

End If

End Sub

A 回答 (2件)

(1) セッションハイジャック対策 



→ フォーム認証(FormsAuthentication)を使う

http://d.hatena.ne.jp/atsukanrock/20100728/12803 …
http://d.hatena.ne.jp/teracc/20100424

(2) SQL インジェクション対策

シングルクォートのエスケープだけでは弱いかも

→SqlParameterCollection を使う

http://msdn.microsoft.com/ja-jp/library/ms998271 …


(3)パスワード漏洩対策

パスワードはDB上にハッシュ化(不可逆暗号化)して持つ。

仮に生データが漏れても使用できない。
    • good
    • 0
この回答へのお礼

セッションハイジャックというのがあるんですね。なんとくなりすましできるような気がしていたんですが、実際できるんですね。専用のフォーム認証というものがあればそれを実装する方向で考えてみたいと思います。ありがとうございました。

お礼日時:2013/06/18 21:44

独自実装では詳細が分からないのでコメントしようがないです。

SQL Server が利用できるのであれば、ASP.NET 標準のフォーム認証を利用するべきと思います。
    • good
    • 0
この回答へのお礼

ASP.NET 標準のフォーム認証というのがあるんですね。検討してみます。ありがとうございました。

お礼日時:2013/06/18 21:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!