【解決方法】暗証番号を使用してパスワードをリセットするには?


特定のユーザーを認証するためのシークレット コードを挿入して、パスワードをリセットしたいと考えています。 しかし、適用していたコーディングは、ユーザーの新しいパスワードを変更または更新しませんでした。 ユーザーが自分の秘密コードを正しく挿入しているか間違っているかを識別しますが、新しいパスワードを更新していません。 ユーザーパスワードをリセットする正しい方法を見つけるのを手伝ってください。

私が試したこと:

Private Sub btnSubmit_Click(sender As Object, e As EventArgs) Handles btnSubmit.Click 'FUNCTION IS EXECUTED WHEN BUTTON SUBMIT IS CLICKED

      cs.Open()
      Dim sql As String = "SELECT * FROM userlogistic WHERE user_id = '" & Request.Form("user") & "' AND user_securitycode = '" & Request.Form("user_securitycode") & "'"
      cmd.CommandText = sql
      cmd.Connection = cs
      reader = cmd.ExecuteReader

      If reader.HasRows Then 'CHECK IF USER ID AND PASSWORD EXIST IN DATABASE
          While reader.Read
              Session("user_no") = reader.Item("user_no")
              Session("user_id") = reader.Item("user_id")
              Session("user_name") = reader.Item("user_name")
              Session("user_password") = reader.Item("user_password")
              Session("user_rank") = reader.Item("user_rank")
              Session("user_section") = reader.Item("user_section")
              Session("user_securitycode") = reader.Item("user_securitycode")

          End While

      End If

      cs.Close()

      If Request.Form("user_securitycode") = Session("user_securitycode") Then
          If Request.Form("pass1") = Request.Form("pass2") Then 'CHECK IF FIRST PASSWORD IS = SECOND PASSWORD
              cs.Open()
              cmd.CommandText = "UPDATE userlogistic SET user_password = '" & Request.Form("pass1") & _
                  "' WHERE user_no = '" & Request.Form("userid") & "'" 'UPDATE TBL_USER WHERE USER_NO IS = TO SELECTED USERID
              cmd.Connection = cs
              cmd.ExecuteNonQuery()
              cs.Close()

              Dim message As String = "Successfully Updated User Password" 'NOTIFY USER THAT RECORD HAS BEEN SUCESFULLY UPDATED
              Dim sb As New System.Text.StringBuilder()
              sb.Append("<script type = 'text/javascript'>")
              sb.Append("window.onload=function(){")
              sb.Append("alert('")
              sb.Append(message)
              sb.Append("')};")
              sb.Append("</script>")
              ClientScript.RegisterClientScriptBlock(Me.GetType(), "alert", sb.ToString())

          Else

              Dim message2 As String = "Password Is Not The Same" 'NOTIFY USER THAT PASSWORD ONE AND TWO ARE NOT THE SAME
              Dim sb2 As New System.Text.StringBuilder()
              sb2.Append("<script type = 'text/javascript'>")
              sb2.Append("window.onload=function(){")
              sb2.Append("alert('")
              sb2.Append(message2)
              sb2.Append("')};")
              sb2.Append("</script>")
              ClientScript.RegisterClientScriptBlock(Me.GetType(), "alert", sb2.ToString())

          End If



      Else

          Dim message As String = "Security Password is incorrect" 'NOTIFY USER THAT RECORD HAS BEEN SUCESFULLY UPDATED
          Dim sb As New System.Text.StringBuilder()
          sb.Append("<script type = 'text/javascript'>")
          sb.Append("window.onload=function(){")
          sb.Append("alert('")
          sb.Append(message)
          sb.Append("')};")
          sb.Append("</script>")
          ClientScript.RegisterClientScriptBlock(Me.GetType(), "alert", sb.ToString())

      End If

      reader.Close()
      cs.Close()
  End Sub

解決策 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 をバックアップから頻繁に復元する準備をしてください。 バックアップは定期的に取っていますよね?
ユーザーがログインしていないときにそれを行うのですか? それは本当にトラブルを求めているだけです!

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

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

第三に、コンパイルはコードが正しいことを意味するわけではありません! :笑う:
開発プロセスは電子メールを書くことと考えてください。コンパイルが成功したということは、電子メールを適切な言語 (たとえば、ドイツ語ではなく英語) で作成したことを意味します。電子メールに送信したいメッセージが含まれていたわけではありません。

これで、開発の第 2 段階に入ります (実際には第 4 段階または第 5 段階ですが、後で前の段階に進みます): テストとデバッグです。

それが何をするのか、そしてそれがあなたが望んでいたものとどのように違うのかを見ることから始めてください。 これは、なぜそれを行っているのかについての情報を提供するため、重要です。 たとえば、プログラムがユーザーに数字を入力させることを目的としており、それを2倍にして答えを出力する場合、入力/出力が次のようになると:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16

次に、問題がそれを2倍にするビットにあることは明らかです-それ自体を加算したり、2倍したりするのではなく、それ自体を乗算して入力の2乗を返します。
それで、コードを見ることができ、それがここのどこかにあることは明らかです:

VB
Private Function Double(ByVal value As Integer) As Integer
    Return value * value
End Function

何がうまくいかないのかがわかったら、デバッガーを使用して原因を突き止めます。 メソッドの最初の行にブレークポイントを置き、アプリを実行します。 ブレークポイントに到達すると、デバッガーが停止し、制御がユーザーに渡されます。 コードを行ごとに実行し (「シングル ステップ」と呼ばれます)、必要に応じて変数の内容を確認 (または変更) できるようになりました (コードを変更して、必要に応じて再試行することもできます)。
コードを実行する前に、コードの各行が何をすべきかを考え、「ステップ オーバー」ボタンを使用して各行を順番に実行したときに実際に何をしたかを比較します。 それはあなたが期待したことをしましたか? その場合は、次の行に進みます。
そうでない場合、なぜですか? どう違うの?
うまくいけば、そのコードのどの部分に問題があり、何が問題なのかを突き止めるのに役立つはずです。
これはスキルであり、開発だけでなく現実の世界でも役立つため、開発する価値のあるスキルです。 そして、すべてのスキルと同様に、それは使用することによってのみ向上します!

コメント

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