private void Save_rec_Click(object sender, EventArgs e)
{
string pattern = ("[\\s]+");
string input = firstname.Text;
string replacement = "_";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(input, replacement);
msg.Text = result;
cmd = new SqlCeCommand("create table " + result + "(id int, first_name nVarChar(100))", con);
cmd.ExecuteNonQuery();
cmd = new SqlCeCommand("insert into '"+ result +"' values(1,'" + firstname.Text + "')", con);
cmd.ExecuteNonQuery();
}
问问题
779 次
2 回答
0
不能经常说出这一点,尤其是因为它在 .NET 中相当容易。通过使用 SqlCommand 参数来简单地防止 SQL 注入发生,如下所示:
string strUserInput = TextBox1.Text;
SqlCommand sqlComm = new SqlCommand();
sqlComm.CommandText = "SELECT SomeColumn FROM Table WHERE Name = @ParamName";
SqlParameter param = cmd.Parameters.Add("@ParamName", strUserInput);
于 2013-03-10T19:16:46.593 回答
0
这更像是一个评论,但是在允许评论的空间中有太多要解决的问题。首先,此代码的最终用户是谁?它是纯内部的并且受到严格限制吗?因为您将自己暴露在SQL 注入攻击之下。
也就是说,它看起来可以执行您想要的操作(创建一个表,然后在该表中插入一行),您必须像上面那样使用动态 SQL 来执行此操作,但需要注意的是您必须firstname.Text
在将其包含在 SQL 字符串中之前,请先彻底清除它。此外,对于insert
字符串,您应该用 and 将表名括起来,[
而]
不是'
and '
。
注意:要考虑的一件重要事情是您要完成的工作。无论您追求什么,我都无法想象这样一个场景,其中 N 个表的单行用于 N 个名字输入是一个好的设计。
于 2013-03-10T18:31:18.067 回答