2013-03-10 48 views
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(); 
} 
+0

你在插入语句中有问题吗? – Sachin 2013-03-10 18:12:07

+1

这不是一个问题。 – AndrewR 2013-03-10 18:31:07

回答

0

这是更多的评论,但有太多要解决的空间只允许评论。首先,谁是这个代码的最终用户?它纯粹是内部的,严格限制?因为你正在接触SQL Injection攻击。

也就是说,它看起来执行你想要的操作(创建一个表,然后在表中插入一行),你必须使用动态SQL,因为你正在做上面的事情,要注意的是在将其包含在SQL字符串中之前,您必须清理掉firstname.Text。另外,对于insert字符串,您应该使用[]而不是''括起表名。

注意:要考虑的一件重要事情就是你要完成的事情。对于之后的任何事情,我都无法想象一个场景,其中N个用于N个名字输入的单行表是一个好设计。

+0

我认为他不能工作的代码是因为他创建了一个有2列的表格,但只能插入1列数据。也许他打算让id成为IDENTITY专栏?我同意你的评估。这个架构不好。 – AndrewR 2013-03-10 18:33:58

+0

@AndrewR他为他的'id'列插入静态1,为他的'first_name'列插入SQL注入易受攻击的'firstname.Text',所以他的语法没问题。但是,语法之外还有很多问题。 – 2013-03-10 18:37:00

+0

正则表达式实际上是用一个下划线替换多个连续的空格(空格,制表符,换行符)。使用'Replace('','_')'只会替换空格,如果一行中有多个空格,你会得到多个下划线而不是一个下划线。 – juharr 2013-03-10 18:48:22

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); 
相关问题