我在公司内联网上创建了一个小型调查网页。无法从外部访问此网页。
表格只是几个单选按钮和一个评论框。
我想保持良好的编码实践,并希望防范SQL注入。
SQL插入是否可以在带有文本框注释的insert语句中发生? 如果是这样,我怎样才能使用.NET 2.0防范它?
答案 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注入。这是一个简单的演示:
.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之外,还应该执行以下操作:
验证并格式化服务器端的用户输入。客户端验证和限制可以通过WebScarab等工具轻松绕过,或通过欺骗您的表单。
为数据库用户帐户配置适当的权限。 Web应用程序应在数据库中使用单独的帐户或角色,其权限仅限于运行应用程序所需的表,视图和过程。确保用户没有系统表的选择权
隐藏用户的详细错误消息,并为对象使用较少的常用名称。令我惊讶的是,您经常可以确定服务器类型(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内部)。
然而,我并不完全确定你应该花时间在这上面,除非这是你的公司政策,因为它在内部发生的可能性最小,如果确实发生了,我希望你会马上知道它是谁。