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中之外,还应该执行以下操作:
-
在服务器端validation并格式化用户input。 客户端validation和限制可以很容易地绕过像WebScarab这样的工具,或通过欺骗你的表单。
-
为数据库用户帐户configuration适当的权限。 Web应用程序应该在数据库中使用单独的帐户或angular色,并将权限限制为仅运行应用程序所需的表,视图和过程。 确保用户在系统表上没有select权限
-
隐藏来自用户的详细错误消息,并为对象使用较不常见的名称。 令我惊讶的是,您可以多久确定一次服务器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的,如果真的发生,我希望你马上知道谁它是。