SQL,Microsoft SQl

时间:2010-12-15 00:58:29

标签: sql sql-server sql-injection

我试图强调测试我的系统的登录单元。我的系统设计如下 -

如果用户输入userid - abcd和密码传递,那么服务器将获取这些参数并准备一个sql命令并将其激活到microsoft数据库 -

select password from UserInformationTable where userid = 'abcd';

将返回的值与给定的密码传递进行比较,然后将结果发送到客户端。

我使用以下方法成功进入系统 -

用户输入用户ID - <abcd1 or drop table UserInformationTable&gt;。这有效,我的完整UserInformationTable被删除了。

是否有任何优雅的方式来处理这样的黑客问题。一种方法是检测用户标识中的'或'子字符串,但我没有发现它非常优雅。有什么方法可以限制不。在microsoft sql中的语句中的查询?

谢谢和问候, Radz

3 个答案:

答案 0 :(得分:0)

这是famous "Bobby Tables" cartoon所示的SQL注入问题。

Here是关于如何为MS SQL修复它的一些信息。特别阅读@ Rook的回答。

答案 1 :(得分:0)

在SQL查询中使用参数。他们会自动阻止这一点在C#中有类似的东西:

SqlCommand comm = new SqlCommand(conn);
comm.CommandText = "SELECT * FROM foo WHERE bar = @id";
comm.CommandType = CommandType.Text;

SqlParameter param = new SqlParameter("@id", DbType.Int64);
param.Value = 3; // The actual value that replaces @id

comm.Parameters.Add(param);

// ...

这不仅适用于C#,但基本上所有现代数据库系统和语言都支持参数化查询&lt; - google it。

其次,您的第一个查询可以更改为:

SELECT userid FROM users WHERE username = 'foo' AND password = 'bar'

然后只计算你返回的行数,如果它是0,那么用户输入了错误的密码。

答案 2 :(得分:0)

你有两个问题。

  1. 您受到其他用户描述的SQL注入攻击。通过清理输入和/或使用参数化查询来解决该问题。

  2. 您既不应存储也不应传输纯文本密码。为什么?在Slashdot上查看此故事。此问题的解决方案是使用单向加密来创建密码哈希以存储在数据库中。当用户尝试登录时,对他或她提供的密码使用相同的加密,然后搜索数据库以查看是否存在具有相同用户ID和密码哈希的行。