我试图对我的系统的登录单元进行压力测试。我的系统是这样设计的-
如果用户输入userid - abcd和password pass,则服务器采用这些参数,准备sql命令并将其发送到microsoft数据库-
select password from UserInformationTable where userid = 'abcd';
将返回值与给定的密码传递进行比较,然后将结果发送到客户端。
我用下面的方法成功地进入了系统-
用户输入userid - <abcd1 or drop table UserInformationTable
>。这起作用了,我的完整UserInformationTable被丢弃了。
有没有任何优雅的方式来处理这样的黑客问题。一种方法是检测userid中的'or‘子串,但我觉得这不是很好。有没有什么办法我可以限制。在microsoft sql中的语句中包含多少个查询?
谢谢和问候,拉兹
发布于 2010-12-15 09:03:26
这就是famous "Bobby Tables" cartoon所说明的SQL注入问题。
Here是一些关于如何为MS SQL修复它的信息。请特别阅读@Rook的答案。
发布于 2010-12-15 09:05:43
在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#,而且基本上所有现代数据库系统和语言都支持参数化查询<- google it。
其次,您的第一个查询可以更改为:
SELECT userid FROM users WHERE username = 'foo' AND password = 'bar'
然后计算返回了多少行,如果是0,则用户输入了错误的密码。
发布于 2010-12-15 09:29:09
你有两个问题。
正如其他用户所描述的那样,
https://stackoverflow.com/questions/4445812
复制相似问题