zoukankan      html  css  js  c++  java
  • Python防止sql注入

    看了网上文章,说的都挺好的,给cursor.execute传递格式串和参数,就能防止注入,但是我写了代码,却死活跑不通,怀疑自己用了一个假的python

    最后,发现原因可能是不同的数据库,对于字符串的占位定义不同,这段话:

    Note that the placeholder syntax depends on the database you are using
    
    'qmark' Question mark style, e.g. '...WHERE name=?' 
    'numeric' Numeric, positional style, e.g. '...WHERE name=:1' 
    'named' Named style, e.g. '...WHERE name=:name' 
    'format' ANSI C printf format codes, e.g. '...WHERE name=%s' 
    'pyformat' Python extended format codes, e.g. '...WHERE name=%(name)s'

    我理解,就是有多种占位方式,而我一棵树上吊死,光试验%s了,所以每次都报这个错:

    rs=c.execute("select * from log where f_UserName=%s","jetz")

    OperationalError: near "%": syntax error

    换一个试试,

    rs=c.execute("select * from log where f_UserName=:usr",{"usr":"jetz"})

    可以

    再试:

    rs=c.execute("select * from log where f_UserName=:1 ",["jetz"])

    也可以

    看了sqlite对%比较过敏

    对于sql注入的测试效果。

    1)用构造串的方式,传递用户名

    getData("select * from log where f_UserName='%s'"%("jetz"))

    如果传递的是测试表名存在的串,可以执行

    getData("select * from log where f_UserName='%s'"%("jetz' And (Select count(*) from user)<>0 and '1'='1"))

    但是,如果改用参数方式,则不能执行

    getData("select * from log where f_UserName=:1","jetz' And (Select count(*) from user)<>0 and '1'='1")

    这种近乎“原生”的防止注入手段,比对传入参数进行检测来说,实在好太多了。

  • 相关阅读:
    论知识共享平台
    网虫推荐firefox 4.0插件
    solaris下常见文件压缩/解压方式简单小结—待续中
    Nginx的启动,关闭,重启脚本
    怎样将oracle数据库用户锁住和解锁
    【APACHE】如何重启Apache?
    【MYSQL】解决Mysql直接登录问题(删除匿名用户)
    【PHP】关于set和get函数
    【JMAIL】jmail无法收邮件问题
    【PHP】Class ‘mysqli’ not found 问题
  • 原文地址:https://www.cnblogs.com/jetz/p/7069425.html
Copyright © 2011-2022 走看看