我已经知道字符串连接很容易出现SQL注入,遗憾的是我已经应用了大部分代码。我正在尝试合并参数化查询,但不知何故,在线示例不能解决我的问题。我看到的大多数例子都是:
string query = "SELECT * FROM Products WHERE ProductID = @Id";
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.AddWithValue("@Id", Request.QueryString["Id"]);
但是如果我有这样的sql语句怎么办:
public static void CreateLingerieBrandsDatabase(string brand)
{
SqlConnection createBrandData = new SqlConnection(@"Data Source=Y560\SQLEXPRESS;Initial Catalog=LingerieItemsDB;Integrated Security=True");
createBrandData.Open();
SqlCommand cmdBrandData = new SqlCommand("CREATE TABLE lingerieItem" + brand + "(id int,type char(50),model char(50),price float,image1 char(255),image2 char(255),description text, [neck type], [color] char(50)); ", createBrandData);
cmdBrandData.ExecuteNonQuery();
createBrandData.Close();
}
另外,我在文本框中获得了string品牌的价值,该文本框将传递给CreateLingerieBrandsDatabase方法。然后它将传递给字符串连接。顺便说一下,我使用字符串连接到表名的原因是因为我为每个品牌创建了3个单独的表,如lingerieItemGlamory,lingerieItemEvgenia和lingerieItemVictoria。管理员在文本框中输入Glamory然后单击“提交”的那一刻,它将知道要访问哪个数据库表。
编辑:对于上面的例子,它将创建一个新的数据库,它具有与我之前提到的3个先前品牌(连接部分除外)相同的表名。因此,当需要访问它时,它将知道要访问哪些品牌。
我知道我的代码很乱,我还是初学者。我希望你们能为我提出更好的解决方案并改进我的代码。提供实际例子也受到高度赞赏。 mwah!
答案 0 :(得分:0)
表名不能由参数替换。您必须通过连接来组成名称。由于品牌名称似乎仅限于某个预定义列表,因此只需针对该列表检查brand
变量值以避免SQL注入,例如:
public static void CreateLingerieBrandsDatabase(string brand)
{
SqlConnection createBrandData = new SqlConnection(@"Data Source=Y560\SQLEXPRESS;Initial Catalog=LingerieItemsDB;Integrated Security=True");
createBrandData.Open();
if (!Regex.Match(brand, @"^(?:Glamory|Evgenia|Victoria)$", RegexOptions.IgnoreCase).Success)
throw new ArgumentException("Invalid brand");
SqlCommand cmdBrandData = new SqlCommand("CREATE TABLE lingerieItem" + brand + "(id int,type char(50),model char(50),price float,image1 char(255),image2 char(255),description text, [neck type], [color] char(50)); ", createBrandData);
cmdBrandData.ExecuteNonQuery();
createBrandData.Close();
}