投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 をどのような意図で用意しているのかによって異なってきます。