の値であり、あなたのパラメータの周りに目盛り)不足しているとして:
// This would attempt to state username = mustufain instead of
// username = 'mustufain' (and SQL doesn't know what mustufain is)
var query = "select userid from register where username = '" + UserName.Text + "' and " + "password = '" + Password.Text + "'";
をパラメータ化を使用して、より良いアプローチは間違った構文を回避し、あなたにどんな嫌な注射に対する保護を提供しています以下、次のようになります。
// Open your connection
using(var connection = new SqlConnection("{your connection string}"))
{
// Build your query
var query = "SELECT TOP 1 userid FROM register WHERE username = @username AND password = @password";
// Build a command (to execute your query)
using(var command = new SqlCommand(query, connection))
{
// Open your connection
connection.Open();
// Add your parameters
command.Parameters.AddWithValue("@username",UserName.Text);
command.Parameters.AddWithValue("@password",Password.Text);
// Execute your query
var user = Convert.ToString(command.ExecuteScalar());
// If a user was found, then set it
if(!String.IsNullOrEmpty(user))
{
Session["checkuserid"] = user;
}
else
{
// No user was found, consider alerting the user
}
}
}
最後に、クレデンシャルをどのように保存するのかを再検討したい場合があります(クリアテキスト)。 ASP.NETには、このプロセスを処理するのに役立つさまざまなプロバイダが用意されているので、自分で処理する必要はありません。
まず、ASP.NETは、クエリを実行しません:このサイトでパスワードのハッシュを作成して、クリアテキスト例えば
するのではなく、そのハッシュを保存する方法を説明し、多くの質問と回答があります。それはADO.NETです。第2に、連結によってSQL文を構成しないでください。パラメータ化されたクエリを使用します。この場合、ユーザーが入力した内容はわかりません。 '1; drop table users; - '? –
何が起こるかを知るためには "Bobby Tables"のgoogleだけです。 –
SqlConnection、SqlCommand、およびSqlDataReaderは[IDisposable]を実装しています(https://msdn.microsoft.com/en-us/library/system.idisposable(v = vs.110) .aspx)。 'finally'ブロック内でdisposeを呼び出すか、[usingステートメント](https://msdn.microsoft.com/en-us/library/yh598w02.aspx)でラップして確実に処理する必要があります適切にこれを今行わないと、後で問題に遭遇し、問題を追跡するのが難しくなります。 – mason