首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 这样操作是否可以杜绝SQL注入? [已结贴,结贴人:lubing7683]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-07 21:03:09 楼主
      首先,SQL注入无非包含以下字符
    ¦and ¦exec ¦insert ¦select ¦delete ¦update ¦count ¦* ¦% ¦chr ¦mid ¦master ¦truncate ¦char ¦declare
      我在网上或者书籍找到的防注入函数无非是屏蔽和替换以上字符,但SQL语句不区分大小写,如果替换下,如:SElect,或者随意替换大小写,函数就失去防注入的作用。
      我在想是不是可以直接在提交表单和传递参数的时候对字符串的某些字母进行HTML编码,如:
      str = Replace(str, Chr(69), "E")                    '~~~~~~~~~~~~~~~~~~E
      str = Replace(str, Chr(101), "e")                    '~~~~~~~~~~~~~~~~~~e
      str = Replace(str, Chr(68), "D")                    '~~~~~~~~~~~~~~~~~~D
      str = Replace(str, Chr(100), "d")                    '~~~~~~~~~~~~~~~~~~d
      str = Replace(str, Chr(67), "C")                    '~~~~~~~~~~~~~~~~~~C
      str = Replace(str, Chr(99), "c")                    '~~~~~~~~~~~~~~~~~~c
      str = Replace(str, Chr(39), "'")                    '~~~~~~~~~~~~~~~~~~c

      缺点就是字符串长度增加
      各位大虾觉得这样处理行么?
      顺便问一下是不是可以只替换“'”单引号就可以防注入?
    120  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-07 21:12:241楼 得分:0
    如果用java,则preparedstatement就能避免注入
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-07 23:51:592楼 得分:0
    呵呵,这个防注不是很好
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-08 02:00:123楼 得分:0
    这个确实不是很好。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-08 17:02:194楼 得分:0
    为什么不好呢?呵呵,我水平差
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-08 18:20:215楼 得分:0
    比如在流言本中,你就会把正常的字母也给屏蔽掉!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-08 18:51:356楼 得分:0
    我的经验是,传递的数字类型,例如id全部加int(xx),这样根本就不会有机会给人注入其它sql语句。其它文本等字段,只要把相应的HTMLEncode替换成Chr(xxx)编码,想象到一个sql语句一对单引号完整无缺,也不会给人注入吧。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-08 20:16:597楼 得分:0
    我替换的是以HTMLEncode编码,体现在网页上还是原形啊,字母不会屏蔽,只是替换编码。如:编码后的edc,在网页中就显示为edc.
      在表单提交数据edc时,经过函数替换为edc存入数据库。传递参数edc时经函数替换为ed&#99在数据库中查询。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-08 20:42:118楼 得分:0
    我觉得最好是不改变任何输入内容,真正原形地写入数据库,输出页面时再进行过滤,例如有很多人都喜欢用replace把单引号替换为空,我不喜欢这种处理方法。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zktz1
    • 等级:
    发表于:2008-02-09 10:50:149楼 得分:20
    我的经验是,传递的数字类型,例如id全部加int(xx),这样根本就不会有机会给人注入其它sql语句。其它文本等字段,只要把相应的HTMLEncode替换成Chr(xxx)编码,想象到一个sql语句一对单引号完整无缺,也不会给人注入吧。
    我也是这样,但是需要用like的地方呢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-10 14:16:2010楼 得分:100
    不需要这么防
    两个函数可以搞定一切
    Function CheckNumeric(Number)
    If Not IsNumeric(Number)
    CheckNumeric = 0
    Else
    CheckNumeric = Number
    End If
    End Function

    Function Checkstr(Str)
    If Isnull(Str) Then
    CheckStr = ""
    Exit Function
    End If
    Str = Replace(Str,Chr(0),"")
    CheckStr = Replace(Str,"'","''")
    End Function

    然后对所有要获得的变量过滤就可以
    Sql = "Update [YourTable] Set Number="& CheckNumeric(Request("ThisIsANumber")) &",String='"& CheckStr(Request("ThisIsAString")) &"'"

    这要还能被注入我吃了天安门
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-11 00:27:3111楼 得分:0
    以10楼的回复看来,对于非数字的变量只需要替换“'”就可以防注入了,呵呵,看来我想得太多了,谢谢了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-02-11 00:33:5612楼 得分:0
    结账给分。
    结果误操作加分为120了。。。。。。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved