初学者在这里:
在回答有关如何将数据插入SQL Server的问题时,他提到了传递参数而不是像我目前所使用的字符串连接那样。
这对安全性真的必要吗?如果是这样,传递参数到底是什么?当我用谷歌搜索时,我得到了很多有关存储过程的信息。这就是我想要的,我还不了解存储过程。。。
如果您能指出正确的方向,我将不胜感激。
谢谢。
编辑:
好的,这就是我得到的。看来正确地更新了数据库,最终我将硬编码的int更改为来自标签的输入。请确认我如何做到这一点不容易受到任何SQL注入或黑客攻击。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.Security; using System.Data; using System.Data.Sql; using System.Data.SqlClient; public partial class Stats : System.Web.UI.Page { public SqlDataReader DataReader; public SqlCommand Command; string queryString = ("INSERT INTO UserData (UserProfileID, ConfidenceLevel, LoveLevel, HappinessLevel) VALUES (@UID, @CL, @LL, @HL);"); //string queryString = ("INSERT INTO UserData (UserProfileID, ConfidenceLevel, LoveLevel, HappinessLevel) VALUES ('a051fc1b-4f51-485b-a07d-0f378528974e', 2, 2, 2);"); protected void Page_Load(object sender, EventArgs e) { LabelUserID.Text = Membership.GetUser().ProviderUserKey.ToString(); } protected void Button1_Click(object sender, EventArgs e) { //connect to database MySqlConnection database = new MySqlConnection(); database.CreateConn(); //create command object Command = new SqlCommand(queryString, database.Connection); //add parameters. used to prevent sql injection Command.Parameters.Add("@UID", SqlDbType.UniqueIdentifier); Command.Parameters["@UID"].Value = Membership.GetUser().ProviderUserKey; Command.Parameters.Add("@CL", SqlDbType.Int); Command.Parameters["@CL"].Value = 9; Command.Parameters.Add("@LL", SqlDbType.Int); Command.Parameters["@LL"].Value = 9; Command.Parameters.Add("@HL", SqlDbType.Int); Command.Parameters["@HL"].Value = 9; Command.ExecuteNonQuery(); } }
将参数传递给SQL,使您不必构建动态SQL字符串。
构建动态SQL语句具有巨大的安全风险,因为人们可以将自己的SQL代码注入到您的应用程序中,从而有可能对您的数据执行不需要的命令。
在以下位置有一些不错的可能的SQL Injection攻击示例:
SQL注入攻击示例
有两种向SQL语句传递参数的方法。一种是使用您提到的存储过程。另一种是使用参数化查询(实际上是我更喜欢的)。
在.NET中,参数化查询实际上非常容易:
using(SqlConnection conn = new SqlConnection(connString)) { SqlCommand command = new SqlCommand("SELECT * FROM Users WHERE Username = @Username", conn); command.Parameters.Add(new SqlParameter("@Username", "Justin Niessner")); SqlDataAdapter adapter = new SqlDataAdapter(command); DataTable dt = new DataTable(); adapter.Fill(dt); }
在该示例中,参数为@Username,我们使用Parameters了SqlCommand对象的集合来传递值。
@Username
Parameters
SqlCommand