V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
lazysoft
V2EX  ›  Python

pymsql 或者 有推荐其他的数据库框架吗,我想防注入。。

  •  
  •   lazysoft · 2018-05-22 20:29:21 +08:00 · 3546 次点击
    这是一个创建于 2368 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是新人,刚学一段时间的 py 一度放弃,今天又看了看 flask

    蹑手蹑脚开发出来了基本的 web 网页, 操作到了数据库, 目前使用的 pymysql 以及 DBUtils 作为连接池管理。

    但是好像,。 字符串的 format 或者 %s 都不能过滤。。 求指导 求推荐

    23 条回复    2018-05-24 09:19:04 +08:00
    qsnow6
        1
    qsnow6  
       2018-05-22 20:55:31 +08:00 via iPhone
    orm 了解下
    gamexg
        2
    gamexg  
       2018-05-22 21:48:34 +08:00
    关键字:参数化查询
    soho176
        3
    soho176  
       2018-05-22 22:02:49 +08:00
    刚开始学真的不用考虑这么多 先把程序写出来再考虑其他吧
    whx20202
        4
    whx20202  
       2018-05-22 22:14:39 +08:00
    参数化查询或者 ORM
    另外如果是手写的 SQL,参数化查询也不一定是保险的,
    表名,limit order by offset 这些记得用白名单或者强制转整形
    mamian
        5
    mamian  
       2018-05-22 22:32:20 +08:00
    请贴代码,很多人用 pymsql 直接拼接字符串的
    so1n
        6
    so1n  
       2018-05-22 22:46:51 +08:00 via Android
    %s 不行?
    mhycy
        7
    mhycy  
       2018-05-22 22:48:24 +08:00
    印象中。。python 的 mysql 查询没有真正的参数化查询
    参数化效果依赖库的底层字符串拼接实现

    望指正
    yu099
        8
    yu099  
       2018-05-22 22:56:46 +08:00 via Android
    @mhycy 有的,前几天刚写过
    yu099
        9
    yu099  
       2018-05-22 22:58:53 +08:00 via Android
    wobushizhangsan
        10
    wobushizhangsan  
       2018-05-22 23:00:00 +08:00 via Android   ❤️ 1
    预处理不就防注入了
    summerwar
        11
    summerwar  
       2018-05-22 23:05:30 +08:00
    flask-sqlalchemy
    eggshell
        12
    eggshell  
       2018-05-22 23:10:57 +08:00
    mhycy
        13
    mhycy  
       2018-05-22 23:11:19 +08:00
    @yu099
    这个库的底层依旧是拼接,只是过了一层转义
    和真正的参数化查询有区别
    yu099
        14
    yu099  
       2018-05-22 23:36:00 +08:00 via Android
    @mhycy 看了一下代码实现确实如此,这就很尴尬了。各个地方都这么介绍,我还以为是标准的预处理…
    Nick2VIPUser
        15
    Nick2VIPUser  
       2018-05-23 00:22:36 +08:00
    如果是不含 ORM 组件的 web 框架可以使用 sqlalchemy。
    另外问一下各位,使用 pymysql 的的时候,我在执行 sql 前强制检测单引号并转义,是不是能防止注入?
    alvin666
        16
    alvin666  
       2018-05-23 00:23:11 +08:00 via Android
    我是用 re 预处理,如果含有特殊字符就直接返回
    yu099
        17
    yu099  
       2018-05-23 08:38:56 +08:00 via Android
    @Nick2VIPUser 这个拼接的感觉还是有些风险,有些 SQL 注入对检测转义绕过方式就是使用编码,对检测的要求非常高
    carakan
        18
    carakan  
       2018-05-23 08:42:43 +08:00
    @yu099 编码?就是 utf-8 gbk 这样的?我昨天查了下资料..要检测编码也是很难,有些编码,有重合...
    lazysoft
        19
    lazysoft  
    OP
       2018-05-23 10:04:21 +08:00
    贴不了图额。。。

    if request.method == 'POST':
    form = request.form
    username = form.get('username')
    password = form.get('password')

    pool = SingletonDBPool()
    con = pool.connect()
    cur = con.cursor()

    sql = "select * from users where username = '%s' and passwords = '%s'" % (username,password)
    print(sql)
    cur.execute(sql)
    result = cur.fetchone()
    con.commit()
    con.close()
    print(result)
    lazysoft
        20
    lazysoft  
    OP
       2018-05-23 10:04:35 +08:00
    @mamian 已贴代码
    Nick2VIPUser
        21
    Nick2VIPUser  
       2018-05-23 10:38:16 +08:00
    @yu099 有看您发的博客,学习了
    hcymk2
        22
    hcymk2  
       2018-05-23 10:40:09 +08:00   ❤️ 1
    mamian
        23
    mamian  
       2018-05-24 09:19:04 +08:00
    @lazysoft
    sql = "select * from users where username = '%s' and passwords = '%s'"

    cur.execute(sql, (username,password))
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3606 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 74ms · UTC 00:09 · PVG 08:09 · LAX 16:09 · JFK 19:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.