|
![]() |
名片设计 CorelDRAW Illustrator AuotoCAD Painter 其他软件 Photoshop Fireworks Flash |
|
在ASP程序中,假如我们的程序设计不当,就有可能面临数据库被别人控制的危险 以下是一个简朴的用户更改密码的代码 --------------------- username=request("user_name") pwd=request("pwd") username=replace(username,"\\\'","\\\'\\\'") pwd=replace(pwd,"\\\'","\\\'\\\'") sql="update tbl_test set pwd=\\\'" & pwd & "\\\' where uid=\\\'" & username & "\\\'" set rs=conn.execute (sql) -------------- 现在,如果我注册一个用户,用户名为 aa\\\'; exec sp_addlogin \\\'haha 当该用户更改密码时(假设改为pp),会出现什么后果呢?? sql变为 update tbl_test set pwd=\\\'pp\\\' where uid=\\\'aa\\\' ; exec sp_addlogin \\\'haha\\\' 结果是用户密码没有被修改,因为没有 aa这个用户, 但在你的数据库中创建了一个登陆,新登陆名为 haha 将用户名稍加修改,实际上可以运行任何sql语句,任何sql系统过程 而这一切都在你不知情的情况下发生的,实际上,上面的只是一个 示范,轻微修改一下用户名,我们可以做添加一个DBA账号,删除所 有纪录,读取用户密码等越权操作。 解决的办法: 在你使用参数前,对参数进行严格检验,尤其是用户输入的参数 不但要对其数据类型,长度进行检查,还要对其内容进行检查。 我们再看一段代码。(用户登陆) username=request("user_name") pwd=request("pwd") username=replace(username,"\\\'","\\\'\\\'") pwd=replace(pwd,"\\\'","\\\'\\\'") sql="select uid,pwd from account where uid=\\\'" & username & "\\\' and pwd=\\\'" & pwd "\\\'" rs.open sql,conn,1,1 if not rs.eof then response.write rs(0) & "欢迎您,您已登陆成功" else response.write "登陆失败,错误的用户名或密码" end if ............ 以上程序的漏洞是显而易见的 我们可以以 用户名: admin 密码: a\\\' or \\\'1\\\'=\\\'1 容易以admin的账号登陆系统 因为我们的sql 变为了 select uid,pwd from account where uid=\\\'admin\\\' and pwd=\\\'a\\\' or \\\'1\\\'=\\\'1\\\' 显然 uid=\\\'admin\\\' and pwd=\\\'a\\\' or \\\'1\\\'=\\\'1\\\'是恒为成立的所以 rs.eof 为false 准确的写法应为 sql="select uid,pwd from account where uid=\\\'" & username & "\\\' and pwd=\\\'" & pwd "\\\'" rs.open sql,conn,1,1 if rs(0)=username and rs(1)=pwd then response.write rs(0) & "欢迎您,您已登陆成功" else response.write "登陆失败,错误的用户名或密码" end if 返回类别: 教程 上一教程: 检测含有中文字符串的实际长度 下一教程: ASP 3.0高级编程(十一) 您可以阅读与"在ASP程序中执行SQL语句的安全性问题"相关的教程: · ASP.NET应用程序的安全方案(三)?安全通信 · ASP文件中的安全问题 · 关于如何保障Winnt +asp +sql web站点的安全经验(1) · ASP主件中的安全问题 · ASP系列讲座(二十)维护 ASP 应用程序的安全 |
![]() ![]() |
快精灵印艺坊 版权所有 |
首页![]() ![]() ![]() ![]() ![]() ![]() ![]() |