INSERT上的SQL注入

我在公司内部网上创build了一个小型的调查网页。 这个网页不能从外面访问。

表单只是一些单选button和一个评论框。

我想保持良好的编码习惯,并希望防止SQL注入。

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

任何SQL语句运行不正常都可能发生注入。

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

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

考虑有人input以下评论:

 '); DELETE FROM users; -- 

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

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

这会从users表中删除所有内容。 而且有人愿意花一整天的时间,用试错法和各种技巧find合适的表名来清空。 以下是如何执行SQL注入攻击的说明。

您需要使用参数化的SQL语句来防止这种情况。

这不仅仅是出于安全原因。 例如,如果你是天真地创build你的SQL语句,请看下面的注释:

 I'm just loving this website 

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

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

 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 ); ... 

任何时候将查询传递回数据库都可能发生SQL注入。 这是一个简单的演示:

SQL注入说明

.NET中的关键是按照Dave Webb的说法。 它将通过将整个string作为一个参数提交来防止注入尝试,处理所有可能被SQL Server解释的字符以改变查询或附加其他命令。

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

是的,它可以。 比方说,客户端发送这个:

 OR 1 = 1 

这对你来说可能是非常痛苦的

  SELECT * FROM admin WHERE name = @name AND password = @password 

你可以防止这个

  • 使用ADO.NET中的Parameter类
  • 使用正则expression式
  • 读,读: http:

是的,他们可以发生。 防止这种情况最简单的方法是使用预处理语句,而不是手动构buildSQL。

所以,而不是这个:

 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中,这将导致它自动转义并replace“?” 在SQL中。

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

  1. 在服务器端validation并格式化用户input。 客户端validation和限制可以很容易地绕过像WebScarab这样的工具,或通过欺骗你的表单。

  2. 为数据库用户帐户configuration适当的权限。 Web应用程序应该在数据库中使用单独的帐户或angular色,并将权限限制为仅运行应用程序所需的表,视图和过程。 确保用户在系统表上没有select权限

  3. 隐藏来自用户的详细错误消息,并为对象使用较不常见的名称。 令我惊讶的是,您可以多久确定一次服务器types(oracle,mysql,sqlserver),并在错误消息中find基本的模式信息,然后从名为“user(s)','employee(s)'的表中获取信息。 如果你没有像(2)那样设置你的权限,并且我可以确定你的服务器types,那么你可以使用SQL Server这样的语句

    SELECT table_name FROM information_schema.table

    EXECUTE sp_help foundTableName

通过使用预准备语句防止SQL注入。 使用placehoder(?)完全消除了SQL注入漏洞。 示例String sql = Select * from user_table where username ='+ request.getparameter(“username”)+'; Statement.executeQuery的(SQL);

上面的语句很容易被sql注入。

为了防止sql注入。 使用下面的代码段

String sql = Select * from user_table where username =? statement.setString(1,用户名);

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

然而,我不完全确定你应该花时间在这个上,除非当然这是你的公司政策,因为它在内部发生的机会是最less的,如果真的发生,我希望你马上知道谁它是。