.Net中的参数化查询在示例中总是如下所示: SqlCommand comm = new SqlCommand(@" SELECT * FROM Products WHERE Category_ID = @categoryid ", conn); comm.Parameters.Add("@categoryid", SqlDbType.Int); comm.Parameters["@categoryid"].Value = CategoryID; 但是我遇到了一堵砖墙,试图做到以下几点: SqlCommand comm = new SqlCommand(@" SELECT * FROM Products WHERE Category_ID IN (@categoryids) OR name LIKE '%@name%' ", conn); comm.Parameters.Add("@categoryids", SqlDbType.Int); comm.Parameters["@categoryids"].Value = CategoryIDs; comm.Parameters.Add("@name", SqlDbType.Int); comm.Parameters["@name"].Value = Name; 哪里 CategoryIDs是逗号分隔的数字列表“123,456,789”(不含引号) 名称是一个string,可能带有单引号和其他不好的字符 什么是正确的语法?
我知道PreparedStatements避免/阻止SQL注入。 它是如何做到的? 使用PreparedStatements构造的最终forms查询将是一个string还是其他?
在这里我们正在讨论在我们的代码中使用参数化的sql查询。 我们有两方面的讨论:我和其他一些人说,我们应该总是使用参数来防止SQL注入和其他人认为这是不必要的。 相反,他们想要用所有string中的两个撇号replace单撇号来避免sql注入。 我们的数据库都运行Sql Server 2005或2008,我们的代码库运行在.NET框架2.0上。 让我给你一个简单的例子在C#中: 我希望我们使用这个: string sql = "SELECT * FROM Users WHERE Name=@name"; SqlCommand getUser = new SqlCommand(sql, connection); getUser.Parameters.AddWithValue("@name", userName); //… blabla – do something here, this is safe 而其他人想要这样做: string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name); SqlCommand getUser = new SqlCommand(sql, connection); //… blabla – […]
在SQL注入方面 ,我完全理解参数化string参数的必要性; 这是这本书中最古老的技巧之一。 但是,什么时候可以certificate不参数化一个SqlCommand呢? 任何数据types被认为是“安全的”,不参数化? 例如:我不认为自己在SQL专家附近的任何地方,但我不能想到任何情况下,它可能容易受到SQL注入接受一个bool或一个int ,只是连接到查询。 我的假设是正确的,还是可能在我的程序中留下一个巨大的安全漏洞? 为了澄清,这个问题被标记为C# ,这是一个强types的语言; 当我说“参数”,想像像 public int Query(int id) 。
我在公司内部网上创build了一个小型的调查网页。 这个网页不能从外面访问。 表单只是一些单选button和一个评论框。 我想保持良好的编码习惯,并希望防止SQL注入。 SQL注入是否发生在带有来自文本框注释的插入语句中? 如果是这样,我怎样才能防止使用.NET 2.0?