如果用戶從它登錄的資料庫中輸入任何用戶名或密碼。它們的索引之間不會交叉匹配。我正在作為初學者學習這個。
if(txtusername.Text != null && txtpassword.Text != string.Empty)
{
sql = string.Format(@" select * from idpass where username ='{0}' ", txtusername.Text );
DataTable dtForNameAndRole = LoadDataByQuery(sql);
if(dtForNameAndRole.Rows.Count > 0)
{
sql = string.Format(@" select * from idpass where password ='{0}' ", txtpassword.Text);
DataTable dtForNameAndRole2 = LoadDataByQuery(sql);
if (dtForNameAndRole2.Rows.Count > 0)
{
sql = string.Format(@" select * from idpass where username = '{0}' and password ='{0}' ", txtusername.Text, txtpassword.Text);
DataTable dtForNameAndRole3 = LoadDataByQuery(sql);
Response.Redirect("Dashboard.aspx");
}
else
{
lblMessage.Text = "No Such Password";
}
}//end of if
else
{
lblMessage.Text = "no such user";
}
}
else
{
msgtr.Visible = true;
lblMessage.Text = "Sorry! Invalid user name or password.";
lblMessage.ForeColor = Color.Red;
return;
}
uj5u.com熱心網友回復:
您現有的代碼中有很多問題。
- 您不應將普通密碼存盤在資料庫中。
- 不需要呼叫 3 次查詢。一次就夠了。
- 您不應只查詢密碼,因為許多用戶的密碼可能相同。
- 不要
*在選擇查詢中使用。您應該將列用作別名。 - 放置斷點并除錯您的代碼以查看您正在呼叫的查詢是什么。通過這種方式,您將了解您的查詢是否正確。您也可以在資料庫中運行此查詢以檢查它是否按預期作業。
uj5u.com熱心網友回復:
如前所述,這是為了學習。但是,意識到您想使用“內置系統”進行登錄非常重要。這篇文章的原因太長了。但是通過使用定義的內置登錄系統?
然后您可以使用預制模板進行登錄。
您可以使用 IIS(互聯網服務)設定安全性,而不必撰寫基于 Web 的整個安全系統的代碼。這將節省我可以算出的整整一個月的扎實作業。如果您使用內置的登錄系統?
然后,您甚至可以將 asp.net 登錄控制元件放入一個頁面 - 它會為您完成所有的魔法和編碼 - 換句話說,有一個巨大的系統在幕后為您管理安全和登錄。簡而言之?
不要嘗試推出自己的安全系統和登錄系統 - 這作業量太大了。
好的,既然我已經概述了上述內容,我們當然仍然在這里學習。因此,讓我們修復您擁有的代碼。
所以,首先,我假設你去了專案->(你的專案屬性),并在設定下設定了一個連接字串(不要手動輸入 - 在設定中設定,這樣你就不必編碼了代碼中的連接字串。您需要一個通用的連接設定,從那時起,當您開始發布到實際網站時,您可以在一個地方更改此設定。
該設定是您將在此處找到的設定:
![嘗試創建登錄頁面,但用戶名與密碼不匹配 [學習目的]](https://img.uj5u.com/2022/01/03/da5e70cde1f34239af5f0e3cb6463f97.png)
好的,現在我們的代碼。像每個人一樣,每當我們需要提取一些資料時,磨損幾個鍵盤都會有點累。最終,您需要考慮使用像 EF(物體框架)這樣的資料框架來分類和“抽象”您的資料庫操作。
但是,在開始時 - 我認為嘗試 測驗并嘗試一些基本和簡單的資料庫操作是個好主意 - 例如您的示例 sql 查詢。
所以,首先,讓我們建立拯救世界貧困和鍵盤的東西(這樣我們就不必一遍又一遍地重新編碼一些簡單的 SQL 查詢)
所以,讓我們放下這段代碼:
DataTable LoadDataByQuery(SqlCommand cmdSQL)
{
DataTable rstData = new DataTable();
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
{
cmdSQL.Connection = conn;
conn.Open();
rstData.Load(cmdSQL.ExecuteReader());
}
return rstData;
}
所以,現在你的代碼可以變成這樣:
正如所指出的,我們不能也永遠不會單獨檢查密碼,因為許多人可能擁有相同的密碼。
所以我們可以檢查用戶 - 或者給訊息
或者 THEN 檢查用戶 密碼 - 并給出錯誤的密碼訊息。
此外,嘗試在沒有這么多嵌套的情況下進行編碼 - 難以除錯且難以遵循。我傾向于顛倒條件,并在出現問題時退出代碼,然后在代碼正常時繼續運行。這樣你就可以洗掉一大堆嵌套的 if /else。
試試這個代碼:
if (txtusername.Text == string.Empty)
{
msgtr.Visible = true;
lblMessage.Text = "Please enter a user name";
return;
}
// check/get user
SqlCommand sql = new SqlCommand();
sql.CommandText = @" select * from idpass where username = @user";
sql.Parameters.Add("@user", SqlDbType.NVarChar).Value = txtusername.Text;
DataTable dtForNameAndRole = LoadDataByQuery(sql);
if (dtForNameAndRole.Rows.Count == 0)
{
msgtr.Visible = true;
lblMessage.Text = "no such user";
return;
}
// if we get this far, then user name = ok
// user ok, try for pass word
sql.CommandText = " AND password = @Pass";
sql.Parameters.Add("@Pass", SqlDbType.NVarChar).Value = txtpassword.Text;
DataTable dtForNameAndRole2 = LoadDataByQuery(sql);
if (dtForNameAndRole2.Rows.Count == 0)
{
msgtr.Visible = true;
lblMessage.Text = "Sorry! Invalid user password";
lblMessage.ForeColor = Color.Red;
return;
}
//get this far, user password = ok
Response.Redirect("Dashboard.aspx");
}
還要注意我們人類的思想是如何運作的。例如,我們在 SO? 你從上到下閱讀——因此你的大腦以這種方式作業。
因此,請注意上面的代碼不僅易于閱讀,而且易于遵循。
嗯,檢查用戶名?不好,設定訊息 - 退出 - 我們完成了!!
如果用戶沒問題,嘿,讓我們繼續解決這個問題 - 讓我們試試用戶 密碼?不好,設定訊息 - 退出 - 我們完成了!
嘿,如果我們走到這一步?那么我們就完成了!!!
嘗試上述方法 - 我認為您喜歡這種想法和風格。
還要注意,雖然我們確實多加了 2 行代碼來設定引數?
這些引數是 sql 注入安全的。我們能夠“添加”到 sql 和引數(從而節省更多代碼)。
我們不必擔心單引號 - 再次字串連接容易出錯。
所以我的教訓和要點?我們使用引數不僅是為了防止 sql 注入,而且實際上我們又得到了更具可讀性和可維護性的代碼,并且不必將字串連接到 sql 中(好吧,好吧,我們做了一些連接 - 但不是用單引號和雙引號的混亂組合)。我指出這一點,因為我們不僅獲得了 sql 注入代碼,而且撰寫代碼的努力也更少了。我從不喜歡人們只是敲鼓不使用基于用戶輸入的 sql 連接字串 - 但另外一個人應該至少提供一種編碼方法,以減少建議代碼以防止 sql 注入的痛苦和痛苦。
我經常使用上面的 EVEN WHEN 沒有機會進行 sql 注入,因為您甚至可以即時添加到 sql,如上所示,即時構建和添加更多引數,就像我們上面所做的那樣。
祝你好運 - 在新的一年里一切順利。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/401339.html
標籤:C# 网站 sql-server
下一篇:如何避免錯誤--System.InvalidCastException:無法將物件強制轉換為型別“System.Collections.Generic.ICollection”
