INSERT上的SQL注入

时间:2009-03-25 13:25:42

标签: c# sql sql-injection

我在公司内联网上创建了一个小型调查网页。无法从外部访问此网页。

表格只是几个单选按钮和一个评论框。

我想保持良好的编码实践,并希望防范SQL注入。

SQL插入是否可以在带有文本框注释的insert语句中发生? 如果是这样,我怎样才能使用.NET 2.0防范它?

8 个答案:

答案 0 :(得分:56)

注入可能发生在任何未正常运行的SQL语句上。

例如,让我们假装你的评论表有两个字段,一个整数ID和一个评论字符串。所以你INSERT如下:

 INSERT INTO COMMENTS VALUES(122,'I like this website');

考虑有人输入以下评论:

'); DELETE FROM users; --

如果您只是将注释字符串放入SQL而不进行任何处理,这可能会将您的单个INSERT转换为以下两个语句,然后是注释:

INSERT INTO COMMENTS VALUES(123,''); DELETE FROM users; -- ');

这将删除users表中的所有内容。而且有些人愿意花一整天的时间找到正确的表格,以便使用反复试验和各种技巧来清空。 Here's a description of how you could perform an SQL Injection attack.

您需要使用parameterized SQL statements来阻止此操作。

这不仅仅是出于安全原因。例如,如果您正在天真地创建SQL语句,请注意以下注释:

I'm just loving this website

会导致SQL语法错误,因为撇号被SQL解释为结束语。

答案 1 :(得分:27)

使用参数化查询,以便自动为您引用文本。

SqlCommand command = connection.CreateCommand();
command.CommandText = "insert into dbo.Table (val1,val2,txt) values (@val1,@val2,@txt)";
command.AddParameterWithValue( "val1", value1 );
command.AddParameterWithValue( "val2", value2 );
command.AddParameterWithValue( "txt", text );

...

答案 2 :(得分:3)

每次将查询传递回数据库时都会发生SQL注入。这是一个简单的演示:

SQL Injection Explained

.NET中的关键是Dave Webb给出的关键。它将通过将整个字符串包含为要提交的一个参数来防止注入尝试,处理SQL Server可能解释的所有字符以更改查询或附加其他命令。

应该指出的是,SQL注入可以在任何应用程序上发生,而不仅仅是Web应用程序。内部攻击通常是组织成本最高的。人们不能安全地认为攻击不会来自内部。

答案 3 :(得分:0)

是的,它可以。假设客户端发送此信息:

OR 1 = 1

这对你的

非常痛苦
  SELECT * FROM admin WHERE name = @name AND password = @password

您可以使用

阻止此操作

答案 4 :(得分:0)

是的,他们可以发生。防范这种情况的最简单方法是使用预准备语句而不是手动构建SQL。

所以,而不是这个:

String sql = 
 String.Format("INSERT INTO mytable (text_column) VALUES ( '{0}' )",
   myTextBox.Text); // Unsafe!

你会做这样的事情:

String sql = "INSERT INTO mytable (text_column) VALUES ( ? )"; // Much safer

然后将文本框的文本作为参数添加到DbCommand中,这将导致它自动转义并替换“?”在SQL中。

答案 5 :(得分:0)

除了使用预准备语句和参数而不是将字符串连接到SQL之外,还应该执行以下操作:

  1. 验证并格式化服务器端的用户输入。客户端验证和限制可以通过WebScarab等工具轻松绕过,或通过欺骗您的表单。

  2. 为数据库用户帐户配置适当的权限。 Web应用程序应在数据库中使用单独的帐户或角色,其权限仅限于运行应用程序所需的表,视图和过程。确保用户没有系统表的选择权

  3. 隐藏用户的详细错误消息,并为对象使用较少的常用名称。令我惊讶的是,您经常可以确定服务器类型(oracle,mysql,sqlserver)并在错误消息中查找基本架构信息,然后从名为“user(s)”,“employee(s)”的表中获取信息。如果您没有像(2)中那样设置权限,我可以确定您的服务器类型,那么您可以使用SQL Server这样的语句

    SELECT table_name FROM information_schema.table

    执行sp_help foundTableName

答案 6 :(得分:0)

使用预准备语句阻止SQL注入。使用placehoder(?)完全消除了sql注入漏洞。 例 String sql =从user_table中选择*,其中username ='+ request.getparameter(“username”)+'; Statement.executeQuery的(SQL);

上述语句容易受到sql注入。

使sql注入安全。 使用以下代码段

String sql =从user_table中选择*,其中username =?; statement.setString(1,用户名);

答案 7 :(得分:-4)

防范这种形式的SQL注入的最简单方法是使用参数和存储过程,而不是构建sql语句来运行。 (在C#中或SQL Server内部)。

然而,我并不完全确定你应该花时间在这上面,除非这是你的公司政策,因为它在内部发生的可能性最小,如果确实发生了,我希望你会马上知道它是谁。