zoukankan      html  css  js  c++  java
  • 防范sql注入值得注意地方

    sql注入是大家基本都清楚,一般来说用参数化就能解决注入的问题,也是最好的解决方式。
    有次技术群里问到一个问题,如下图
    问题描述
    很显然tableName是外部传递过来的,暂时不考虑具体的业务环境,但如果以select * from @table 把表名称当参数肯定是不能执行的,如果是拼接sql会有注入的危险。那么此情况怎么才能避免sql注入?
    后来想到一个方式,如下图
    exec执行sql
    看起来用到了参数化,应该没有注入的危险吧?那就写例子试试看
    测试exec方式
    结果很不好,测试表tb还是被注入了数据。为什么会这样?其实仔细分析下,这种写法是数据库端进行sql拼串,基本上越过了参数化。

    要不进行字符串过滤吧,那好我写个replace方法,比说过滤一些sql关键词:select ,insert, .....等等。把这些关键词替换成""(空字符串),但这方式还有个漏洞 :举个例子,sSELECTelect 被替换后,就变成了select,还是有关键词。为了避免这种情况的发生,建议把关键词替换成空格而不是空字符串,这样sSELECTtelect 替换关键词为空格,就变成了 s elect,基本上算是安全一些了。推荐防范sql注入,最好还是参数化。

    再回过头怎么解决刚才那个问题,怎么查传递过来的表名称,可以使用系统表查表
    根据系统表查询表名称是否合法,合法再执行sql

    上图代码有再优化的可能,不在本文讨论范围内

    总结:

    1 推荐使用参数化的方式解决sql注入问题。如果用到了参数化,避免数据库内部再拼串执行sql的可能。
    2 过滤数据库关键词,最好替换成空格!

  • 相关阅读:
    C++对象模型与内存位对齐的简单分析(GNU GCC&VS2015编译器)
    [GeekBand] C++学习笔记(2)——BigThree、OOP
    [GeekBand] C++ 高级编程技术 (1)
    [GeekBand]C++高级编程技术(2)
    C++中引用的本质分析
    函数的重载(1)
    C++的特点
    布尔类型和三目运算符
    Linux客户端下的latex相关操作
    无光驱上网本上安装win7
  • 原文地址:https://www.cnblogs.com/sundayisblue/p/11769677.html
Copyright © 2011-2022 走看看