0

いくつかのレガシー コードをデバッグしようとしています。すべてのユーザーのパスワード「password」を使用してシステムにログインできることがわかりました。ユーザー名「username」とパスワード「password」を使用してログインすることも、ユーザー名「username」とシステム内のいずれかのユーザーのパスワードを使用してログインすることもできます。

これは、列「username」または文字列「username」をログイン フォームのユーザー名フィールドと照合する SQL クエリに問題がある可能性があると考えさせます。(パスワードと同じ)。

ただし、残念ながら私たちは VB.net のユーザーではありません。この動作は、私たちが何をしても同じようです。元のコードは次のとおりです。

SQLcommand.CommandText = "SELECT level FROM tblUsers WHERE username = """ & username & """ AND password = """ & password & """"
SQLreader = SQLcommand.ExecuteReader()

"""(すべてのsが何であるかはわかりません)

そこで、プログラミングと SQL に関する知識を使用して、次のようにしました。

SQLcommand.CommandText = "SELECT level FROM tblUsers WHERE `username` = """ & username & """ AND `password` = """ & password & """"
SQLreader = SQLcommand.ExecuteReader()

同様に、これは効果がありませんでした:

SQLcommand.CommandText = "SELECT level FROM tblUsers WHERE tblUsers.username = """ & username & """ AND tblUsers.password = """ & password & """"
SQLreader = SQLcommand.ExecuteReader()

それも効果がありませんでした。

問題は、これは SQL コードの問題ですか? それとも、間違った場所を探していますか? 私たちが間違った場所を探しているとは思いません。私たちは VB.net の専門家ではありませんが、それでもプログラミングはかなり上手です。また、ユーザー名とパスワードとして「ユーザー名」と「パスワード」を使用したクエリの出力 (トレース)SQLreader(0)が返されます。これは、何かに一致していることを意味します。1

どんな助けでも素晴らしいでしょう。私たちが見落としているものはありますか?

ありがとう

(免責事項: このコードは本番環境では使用されません。今はリラックスしてください!)

4

1 に答える 1

2

私がこれを正しく読んでいるなら、ここにいくつかの問題があります。

ここで Microsoft SQL Server に接続していると仮定すると (SQLCommand を使用しているため)、username 変数と password 変数を二重引用符で囲み、列 username を列と比較していることを示しています (変数で)。ユーザー名に「john」があり、パスワードに「1234」が含まれているとします。SQL ステートメントは次のようになります。

SELECT level FROM tblUsers WHERE username = "john" and password = "1234"

二重引用符は、そこにあるテキストが列の名前であることを意味するため、SQL は john と 1234 という名前の列を探します。単一引用符/アポストロフィを使用する必要があります。

SELECT level FROM tblUsers WHERE username = 'john' and password = '1234'

ユーザー名「username」とパスワード「password」を使用している場合、実際には、ユーザー名列 = ユーザー名列、パスワード列 = パスワード列であるユーザー テーブルからレベルを選択しているだけです。(:

とにかく、変数を SQL クエリに直接貼り付けると、SQL インジェクションに対してクエリが開かれたままになるため、パラメータを使用することをお勧めします。

SQLcommand.CommandText = "SELECT level FROM tblUsers WHERE username = @username AND password = @password"
SQLcommand.Parameters.AddWithValue("@username",username)
SQLcommand.Parameters.AddWithValue("@password",password)
SQLreader = SQLcommand.ExecuteReader()

それを試してみてください。

于 2012-04-20T16:50:08.150 に答える