V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
xieqiqiang00
V2EX  ›  MySQL

如果对于用户输入的内容做白名单过滤,不允许符号,是不是就没有 SQL 注入的可能性了?

  •  1
     
  •   xieqiqiang00 · 2021-03-21 10:57:51 +08:00 · 4118 次点击
    这是一个创建于 1103 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如只允许英文中文数字和少量符号,其他所有符号都替换成[code_xxx]。这种不管怎么拼接 SQL 语句都没法注入了吧。

    21 条回复    2021-03-23 08:45:37 +08:00
    oott123
        1
    oott123  
       2021-03-21 11:19:14 +08:00 via Android   ❤️ 2
    注入往往发生在你意料不到的地方,所以正确的做法永远是 prepare 再传参数

    举个例子:宽字节注入
    singerll
        2
    singerll  
       2021-03-21 11:36:42 +08:00 via Android
    sql 注入不一定发生在用户输入,任何会连接数据库查数的地方,都可能发生注入。
    zhuawadao
        3
    zhuawadao  
       2021-03-21 12:07:34 +08:00
    曾记得有个网址,输入账户密码,密码输入 1=1 就能验证通过
    340244120w
        4
    340244120w  
       2021-03-21 13:31:06 +08:00 via iPhone
    直接说结论,当然可以。
    而且 order by 也都是用白名单,想用 prepare 也用不了啊
    FucUrFrd
        5
    FucUrFrd  
       2021-03-21 15:49:33 +08:00 via Android
    Prepare, 什么鬼问题,SQL 注入在 Facebook Google Amazon 早就被解决了
    weirdo
        6
    weirdo  
       2021-03-21 16:00:51 +08:00
    用 prepare 不就好了么,只要用字符串拼接 sql,那就有被注入的风险
    des
        7
    des  
       2021-03-21 16:03:47 +08:00
    尽量不要弄这种,老老实实用 prepare 。
    另外讲个笑话,icloud 不允许有人叫“true”
    zhuweiyou
        8
    zhuweiyou  
       2021-03-21 18:09:01 +08:00
    你这做法不对, 直接 prepare 就行了, 不需要去手动过滤
    FucUrFrd
        9
    FucUrFrd  
       2021-03-21 18:13:24 +08:00 via Android
    @des 90 年代的代码,没人记得去改
    des
        10
    des  
       2021-03-21 18:32:04 +08:00
    @FucUrFrd 那祝你好运
    abcbuzhiming
        11
    abcbuzhiming  
       2021-03-21 19:09:42 +08:00
    你要是能保证过滤百分之百那当然没有注入,问题就在于你保证不了的,楼上已经有人说了,注入都来自意外的地方
    clf
        12
    clf  
       2021-03-21 19:24:48 +08:00
    不用 SQL 就没有 SQL 注入了 /doge

    prepare 是最好的做法,绑定变量使用预编译语句是预防 SQL 注入的最佳方式。
    BeautifulSoap
        13
    BeautifulSoap  
       2021-03-21 19:32:28 +08:00
    https://www.v2ex.com/t/761752

    我前几天的帖子正好应景

    不用 prepare statement 的话,在你想象不到的地方永远都会存在 sql 注入
    cest
        14
    cest  
       2021-03-21 19:39:28 +08:00
    prepare 防 SQL 注入
    非常严的白名单防 unicode 控制字符对你的肉眼注入
    CRVV
        15
    CRVV  
       2021-03-21 22:41:52 +08:00   ❤️ 2
    如果你用的是符合 SQL 标准的数据库,比如 PostgreSQL,只要字符串里没有单引号,就不会有 SQL 注入。

    如果你要用 MySQL,那请认真阅读 https://dev.mysql.com/doc/refman/8.0/en/string-literals.html
    注意 MySQL 的文档里面还有一句是
    In certain client environments, it may also be necessary to escape NUL or Control+Z.
    escape 的结果还取决于 client environment 的。

    如果有自信把这些奇怪的 escape 规则都搞对,那当然就可以 “不管怎么拼接 SQL 语句都没法注入了”
    如果没有这个自信,就别这么玩了。
    xieqiqiang00
        16
    xieqiqiang00  
    OP
       2021-03-22 09:03:30 +08:00 via Android
    @oott123 搞白名单的话,这类字符直接会被抛弃吧
    DanielYao
        17
    DanielYao  
       2021-03-22 10:42:17 +08:00
    参数化 sql,一般都能防住
    Chenamy2017
        18
    Chenamy2017  
       2021-03-22 13:04:23 +08:00
    @zhuawadao 赶紧去检查了我们的产品,果然通过登陆界面可以注入 SQL !
    ERRASYNCTYPE
        19
    ERRASYNCTYPE  
       2021-03-22 17:46:47 +08:00
    你这人肉穷举
    zhuawadao
        20
    zhuawadao  
       2021-03-22 18:42:21 +08:00
    @Chenamy2017 上报公司拿奖金
    meepo3927
        21
    meepo3927  
       2021-03-23 08:45:37 +08:00
    可以防注入了, 但是这样更麻烦了吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3123 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:42 · PVG 20:42 · LAX 05:42 · JFK 08:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.