【解決方法】大文字と小文字を区別するログイン フォーム VB22

プログラミングQA


Private Sub btnLogin_Click(sender As Object, e As EventArgs) btnLogin.Click を処理します

strQuery = “SELECT A.TxUserName, A.TxFirstName, A.TxLastName, A.CodeRole, B.TxRoleDescription ” &
“FROM TblUsers A” &
“LEFT JOIN LookUp_CodeRole B ” &
“ON B.CodeRole = A.CodeRole” &
“WHERE A.TxUserName=”” & tbUsername.Text & “” AND A.TxPassword = ‘” & tbPassword.Text & “‘ “

試す
SelectDataFromAccessDb(strQuery)

If MsAccessDbReader.Read Then
strAppUser = MsAccessDbReader(0).ToString()
strAppUserFirstname = MsAccessDbReader(1).ToString()
strAppUserLastname = MsAccessDbReader(2).ToString()
strAppUserFullName = strAppUserLastname & “, ” & strAppUserFirstname
strAppUserCodeRole = MsAccessDbReader(3).ToString()
strAppUserRoleDescription = MsAccessDbReader(4).ToString()

Me.Hide()
frmMain.Show()
CloseMsAccessDbConnection()

strQuery = “TblUserHistory (TxUserName, DtLogged, TxStatus) に挿入” &
“VALUES (‘” & strAppUser & “‘, ‘” & Now.ToString(“yyyy-MM-dd hh:mm:ss:fff”) & “‘, ‘LOGIN’) “

OpenMsAccessDbConnection()
InsertDataFromAccessDb(strQuery)

それ以外
MessageBox.Show(“ユーザーが見つからないか、ユーザー名/パスワードが正しくありません。もう一度お試しください。”, “INFORMATION”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
終了条件
CloseMsAccessDbConnection()
ex を例外としてキャッチ
MessageBox.Show(Err.Description, “INFORMATION”, MessageBoxButtons.OK, MessageBoxIcon.Error)
エンドトライ
サブ終了

私が試したこと:

Private Sub btnLogin_Click(sender As Object, e As EventArgs) btnLogin.Click を処理します

strQuery = “SELECT A.TxUserName, A.TxFirstName, A.TxLastName, A.CodeRole, B.TxRoleDescription ” &
“FROM TblUsers A” &
“LEFT JOIN LookUp_CodeRole B ” &
“ON B.CodeRole = A.CodeRole” &
“WHERE A.TxUserName=”” & tbUsername.Text & “” AND A.TxPassword = ‘” & tbPassword.Text & “‘ “

試す
SelectDataFromAccessDb(strQuery)

If MsAccessDbReader.Read Then
strAppUser = MsAccessDbReader(0).ToString()
strAppUserFirstname = MsAccessDbReader(1).ToString()
strAppUserLastname = MsAccessDbReader(2).ToString()
strAppUserFullName = strAppUserLastname & “, ” & strAppUserFirstname
strAppUserCodeRole = MsAccessDbReader(3).ToString()
strAppUserRoleDescription = MsAccessDbReader(4).ToString()

Me.Hide()
frmMain.Show()
CloseMsAccessDbConnection()

strQuery = “TblUserHistory (TxUserName, DtLogged, TxStatus) に挿入” &
“VALUES (‘” & strAppUser & “‘, ‘” & Now.ToString(“yyyy-MM-dd hh:mm:ss:fff”) & “‘, ‘LOGIN’) “

OpenMsAccessDbConnection()
InsertDataFromAccessDb(strQuery)

それ以外
MessageBox.Show(“ユーザーが見つからないか、ユーザー名/パスワードが正しくありません。もう一度お試しください。”, “INFORMATION”, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
終了条件
CloseMsAccessDbConnection()
ex を例外としてキャッチ
MessageBox.Show(Err.Description, “INFORMATION”, MessageBoxButtons.OK, MessageBoxIcon.Error)
エンドトライ
サブ終了

解決策 1

そんなことしないで! とても小さなコードで、大きな問題がたくさんあります…

1) 文字列を連結して SQL コマンドを作成しないでください。 データベース全体を破壊する可能性のある、偶発的または意図的な SQL インジェクション攻撃にさらされる可能性があります。 代わりに、常にパラメーター化されたクエリを使用してください。

文字列を連結すると、SQL が次のようなコマンドを受け取るため、問題が発生します。

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'

ユーザーが追加した引用符は、SQL に関する限り文字列を終了させ、問題が発生します。 しかし、それはもっと悪いかもしれません。 代わりに「x’;DROP TABLE MyTable;–」と入力すると、SQL は非常に異なるコマンドを受け取ります。

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'

どの SQL が 3 つの別個のコマンドとして認識されるか:

SQL
SELECT * FROM MyTable WHERE StreetAddress = 'x';

完全に有効な SELECT

SQL
DROP TABLE MyTable;

完全に有効な「テーブルの削除」コマンド

SQL
--'

そして、それ以外はすべてコメントです。
一致する行を選択し、DB からテーブルを削除し、それ以外は無視します。

したがって、常にパラメーター化されたクエリを使用してください。 または、DB をバックアップから頻繁に復元する準備をしてください。 バックアップは定期的に取っていますよね?

そして、ログイン画面で? DB を破壊するためにユーザー名を持ったり、パスワードを知らずにログインしたりする必要さえないので、それはただの自殺行為です。

2) パスワードをクリア テキストで保存しないでください。これは重大なセキュリティ リスクです。 ここにそれを行う方法に関するいくつかの情報があります: パスワードの保管: 方法。[^] コードは C# ですが、かなり明白です。

覚えておいてください: 欧州連合のユーザーがいる場合、GDPR が適用されます。つまり、パスワードを機密データとして扱い、安全な方法で保管する必要があります。 テキストはそれらのどちらでもなく、罰金は….うーん…傑出している可能性があります。 2018 年 12 月、ドイツの会社は、それだけで 20,000 ユーロという比較的低い罰金を科されました。

コメント

タイトルとURLをコピーしました