• 防范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 过滤数据库关键词,最好替换成空格!

  • 相关阅读:
    顺序容器
    forward_list
    array
    第十一章 关联容器
    C++数组
    C++标准库算法
    第十章 泛型算法
    第九章 顺序容器
    操作系统概述
    文件输入输出
  • 原文地址:https://www.cnblogs.com/sundayisblue/p/11769677.html
Copyright © 2020-2023  润新知