首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL,Microsoft SQl

SQL,Microsoft SQl
EN

Stack Overflow用户
提问于 2010-12-15 08:58:29
回答 3查看 84关注 0票数 0

我试图对我的系统的登录单元进行压力测试。我的系统是这样设计的-

如果用户输入userid - abcd和password pass,则服务器采用这些参数,准备sql命令并将其发送到microsoft数据库-

代码语言:javascript
运行
复制
select password from UserInformationTable where userid = 'abcd';

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

我用下面的方法成功地进入了系统-

用户输入userid - <abcd1 or drop table UserInformationTable >。这起作用了,我的完整UserInformationTable被丢弃了。

有没有任何优雅的方式来处理这样的黑客问题。一种方法是检测userid中的'or‘子串,但我觉得这不是很好。有没有什么办法我可以限制。在microsoft sql中的语句中包含多少个查询?

谢谢和问候,拉兹

EN

回答 3

Stack Overflow用户

发布于 2010-12-15 09:03:26

这就是famous "Bobby Tables" cartoon所说明的SQL注入问题。

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

票数 0
EN

Stack Overflow用户

发布于 2010-12-15 09:05:43

在SQL查询中使用参数。他们会自动阻止这种情况。在C#中类似于以下内容:

代码语言:javascript
运行
复制
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。

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

代码语言:javascript
运行
复制
SELECT userid FROM users WHERE username = 'foo' AND password = 'bar'

然后计算返回了多少行,如果是0,则用户输入了错误的密码。

票数 0
EN

Stack Overflow用户

发布于 2010-12-15 09:29:09

你有两个问题。

正如其他用户所描述的那样,

  1. 您会受到SQL注入攻击。通过清理输入和/或使用参数化查询来解决这个问题。
  2. 您不应该存储或传输纯文本密码。为什么?请看Slashdot上的这篇文章。此问题的解决方案是使用单向加密来创建密码散列以存储在数据库中。当用户尝试使用与其提供的密码相同的加密进行登录时,请搜索您的数据库以查看是否存在具有相同用户in和密码散列的行。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4445812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档