[ad_1]
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 が次のようなコマンドを受け取るため、問題が発生します。
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
ユーザーが追加した引用符は、SQL に関する限り文字列を終了させ、問題が発生します。 しかし、それはもっと悪いかもしれません。 代わりに「x’;DROP TABLE MyTable;–」と入力すると、SQL は非常に異なるコマンドを受け取ります。
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
どの SQL が 3 つの別個のコマンドとして認識されるか:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
完全に有効な SELECT
DROP TABLE MyTable;
完全に有効な「テーブルの削除」コマンド
--'
そして、それ以外はすべてコメントです。
一致する行を選択し、DB からテーブルを削除し、それ以外は無視します。
したがって、常にパラメーター化されたクエリを使用してください。 または、DB をバックアップから頻繁に復元する準備をしてください。 バックアップは定期的に取っていますよね?
そして、ログイン画面で? DB を破壊するためにユーザー名を持ったり、パスワードを知らずにログインしたりする必要さえないので、それはただの自殺行為です。
2) パスワードをクリア テキストで保存しないでください。これは重大なセキュリティ リスクです。 ここにそれを行う方法に関するいくつかの情報があります: パスワードの保管: 方法。[^] コードは C# ですが、かなり明白です。
覚えておいてください: 欧州連合のユーザーがいる場合、GDPR が適用されます。つまり、パスワードを機密データとして扱い、安全な方法で保管する必要があります。 テキストはそれらのどちらでもなく、罰金は….うーん…傑出している可能性があります。 2018 年 12 月、ドイツの会社は、それだけで 20,000 ユーロという比較的低い罰金を科されました。
[ad_2]
コメント