快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

在ASP程序中执行SQL语句的安全性问题

在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 应用程序的安全
    微笑服务 优质保证 索取样品