Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
ログイン成功後、IDとユーザー名を各フォームで使用したい
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=17599#CommentId48199
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
2014/6/5 19:20:46
> Textbox1(ユーザーID)に「AND 1 = 1 --」と「OR 1 = 1 --」を両方入力後に
るきおさんが示されたのは
' OR 1 = 1 --
であって、
OR 1 = 1 --
ではありませんよ。
つまり、
『WHERE ユーザーID='★' AND パスワード='☆'』
の★側に、るきおさんの示された文字列を渡すと、
『WHERE ユーザーID='' OR 1 = 1 --'AND パスワード='☆'』
という文字列が生成されることになります。
SQL Server では、「--」以降の部分をコメントと看做しますので、これは実質、
『WHERE ユーザーID='' OR 1 = 1』
という問い合わせを意味します。(1 = 1) は常に TRUE ですから、
ユーザーID が何であれ、問い合わせが成功してしまうことになります。
> Me.Hide()
> Dim Main As New fmmain
> Main.Label1.Text = FmLogin.UserName
> Main.ShowDialog(Me)
> Me.Show()
> Me.Close()
ShowDialog で表示したフォームは、本来は Dispose が必要です。
それはさておき、こういった仕組みの場合は、ログインフォームをスタートアップフォームに
するのではなく、Sub Main() をスタートアップにして、そこからログインフォームを
稼動させた方が扱いやすいかもしれません。
> ▼実行後に「入力文字列の形式が正しくありません」と表示された後に
このメッセージを出力しているのは、恐らくは下記の部分でしょう。[CODE] Try
conn.Open()
RESULT = Convert.ToInt32(CMD.ExecuteScalar())
Catch ex As Exception
MsgBox(ex.Message)
End Try[CODE]
ExecuteScalar メソッドは、実行結果の先頭行の先頭列の情報を返します。
この場合の SQL の問い合わせは、「SELECT ユーザー名 FROM …」というものですよね。
ということは、たとえば、抽出されたユーザー名が 『123』 だった場合、
RESULT = Convert.ToInt32("123") として処理され、RESULT には 123 が格納されます。
しかし、抽出されたユーザー名が "ポチ" だった場合、
RESULT = Convert.ToInt32("ポチ") という数値変換は不可能なため、
FormatException の例外すなわち「入力文字列の形式が正しくありません。」を
発生させることになります。
問い合わせた「ユーザー名」から、どのような文字列が返されるのか、そして、
何のためにそのユーザー名を数値に変換しようとしたのかを意識しながら、
あらためてプログラムを書き直してみて下さい。
> ▼実行前に※印の箇所で青い波線の「エラー 'IsNot' には参照型を持つオペランドが必要ですが、このオペランドの値型は 'Integer' です。」が発生▼
提示の箇所には、不自然な点が 2 つあります。
一つはエラーメッセージにあるように、Integer 型変数に対して
IsNot 演算子で If 問い合わせを行おうとしている点です。
るきおさんが紹介されたコードでは、変数 RESULT は自作クラス UserInfo を
示していたので、Nothing 判定を行うための IsNot 演算子を使う意味もありますが、
社会人さんが書かれたコードでは、変数 RESULT は Integer を示しているため、
そもそも Nothing という状態にはなりえません。
もう一つは、そのIf 文を一体何のために記載しているのかです。
そもそも、最初に「Dim RESULT As String = 0」で 0 がセットされてから、
その If 文の行の到達するまでの間、変数 RESULT の内容を書き換えるような
処理はどこにも無いように見受けられます。だとすれば、この If 比較は、
何を目的として設置されたのでしょうか。
こうした点を再考してみれば、どのように修正するべきかも見えてくるかと思います。
(1) 変数 RESULT は、どのような状態を管理するために宣言しましたか?
るきおさんが提案されたコードでは、現在入力されたユーザー情報を
文字列として格納するためのクラスとして用意されていましたが、社会人さんが
書かれたコードはそうではなく、ユーザー情報の認証状況を数値化して管理するための
変数であるかのように見えます。
(2) その変数に、どういった値をセットしようとしていますか?
そもそも、RESULT は Integer 型で本当に良いのでしょうか?
もしも Integer 型で管理したいのだとしたら、その値が 0 だった場合には、
どういう状態を表しているものとして扱いたいのでしょうか?
(3) その変数に値をセットするのはどの時点ですか?
ユーザーがパスワード情報等を入力した時点でセットすべきでしょうか。それとも
SQL Server に認証問い合わせを行った後の結果をセットすべきでしょうか?
何が正しいのかは、変数 RESULT をどのような意図で用意しているのかによって異なってきます。