• ベストアンサー
  • 困ってます

asp.netでのセッションを使用したログイン

  • 質問No.8137008
  • 閲覧数612
  • ありがとう数3
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 88% (15/17)

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

質問者が選んだベストアンサー

  • 回答No.2
  • ベストアンサー

ベストアンサー率 58% (728/1234)

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

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

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

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

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

→SqlParameterCollection を使う

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


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

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

仮に生データが漏れても使用できない。
お礼コメント
aukory3m

お礼率 88% (15/17)

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

その他の回答 (全1件)

  • 回答No.1

ベストアンサー率 55% (33/59)

独自実装では詳細が分からないのでコメントしようがないです。SQL Server が利用できるのであれば、ASP.NET 標準のフォーム認証を利用するべきと思います。
お礼コメント
aukory3m

お礼率 88% (15/17)

ASP.NET 標準のフォーム認証というのがあるんですね。検討してみます。ありがとうございました。
投稿日時:2013/06/18 21:45
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ