0
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();
}
4

2 回答 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 回答