價值首先,你不應該使用字符串連接來構建你的查詢,因爲它可以讓你容易的事情,如SQL注入攻擊,它可能會導致你的查詢是不正確的問題(因爲你缺少你周圍參數刻度線):
// 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。其次,你應該*不*通過串聯構造sql語句。使用參數化查詢。在這種情況下,你不知道用戶輸入了什麼。如果它是'1; drop table users; - ? –
只是谷歌的「鮑比表」,看看會發生什麼 –
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