【发布时间】:2011-03-14 01:46:36
【问题描述】:
这里是初学者:
在这个answer 关于如何将数据插入SQL Server 的问题中,他提到了传递参数而不是像我目前使用的字符串连接。
这对于安全来说真的有必要吗?如果是这样,传递参数究竟是什么?当我用谷歌搜索时,我得到了很多关于存储过程的信息。那是我想要的吗,我不知道存储过程....但是。
如果您能指出正确的方向,我将不胜感激。
谢谢。
编辑:
好的,这就是我得到的。似乎可以正确更新数据库,最终我会将硬编码的整数更改为标签的输入。请确认我如何做到这一点是否不易受到任何 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();
}
}
【问题讨论】:
-
@Will - 我喜欢小鲍比桌。排名靠前的是他们关于 Gotos 的脱衣舞。
-
除了学习编写参数化查询之外,我还建议阅读 Justin Clarke 的一本书,名为“SQL 注入攻击与防御”,他在其中深入讨论了 SQL 注入是如何发生的,如何防范它包括 .NET 在内的各种语言,如何测试它等等。不错的读物。
-
@Thomas:听起来不错。我将不得不以某种方式抽出时间....我是我这个项目的一个人!
标签: c# asp.net sql sql-server stored-procedures