热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python/SQLite3在WHEREClause中转义

我应该如何在Python中为SQLite3进行真正的转义?如果我谷歌(或搜索stackoverflow)有很多问题,每次响应是这样的:dbcursor.execute(SELEC

我应该如何在Python中为SQLite3进行真正的转义?

如果我谷歌(或搜索stackoverflow)有很多问题,每次响应是这样的:

dbcursor.execute("SELECT * FROM `foo` WHERE `bar` like ?", ["foobar"])

这有助于防止SQL注入,并且如果我只是与“=”进行竞争就足够了,但它当然不会对通配符进行条带化处理.

所以,如果我这样做

cursor.execute(u"UPDATE `COOKIEs` set `count`=? WHERE `nickname` ilike ?", (COOKIEs, name))

某些用户可以为昵称提供“%”,并用一行替换所有COOKIE条目.
我可以自己过滤它(呃…我可能会忘记其中一个鲜为人知的通配符),我可以在昵称和昵称上使用小写,并用“=”替换“ilike”,但我真正想做的是类似的东西:

foo = sqlescape(nick)+"%"
cursor.execute(u"UPDATE `COOKIEs` set `count`=? WHERE `nickname` ilike ?", (COOKIEs, foo))

解决方法:

您通过使用参数化查询避免了直接代码注入.现在,您似乎正在尝试与用户提供的数据进行模式匹配,但您希望将用户提供的数据部分视为文字数据(因此没有通配符).你有几个选择:

>只需过滤输入. SQLite的LIKE只有understands%和_作为通配符,因此很难弄错.只需确保始终过滤输入. (我的首选方法:在构造查询之前过滤,而不是在读取用户输入时过滤).
>一般而言,“白名单”方法被认为比删除特定危险字符更安全,更容易.也就是说,不要删除字符串中的%和_(以及任何“鲜为人知的通配符”,如你所说),扫描你的字符串并只保留你想要的字符.例如,如果你的“昵称”可以包含ASCII字母,数字,“ – ”和“.”,它可以像这样清理:

name = re.sub(r"[^A-Za-z\d.-]", "", name)

此解决方案特定于您要匹配的特定字段,并且适用于关键字段和其他标识符.如果我必须使用RLIKE进行搜索,我肯定会这样做,它接受完整的正则表达式,因此需要注意更多的字符.
>如果您不希望用户能够提供通配符,为什么还要在查询中使用LIKE?如果您的查询的输入来自代码中的许多位置(或者您甚至可能正在编写库),那么如果您完全避免使用LIKE,则会使查询更安全:

>这是case insensitive matching:

SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE

>在您的示例中,您使用前缀匹配(“sqlescape(nick)”%“”).以下是使用精确搜索的方法:

size = len(nick)
cursor.execute(u"UPDATE `COOKIEs` set `count`=? WHERE substr(`nickname`, 1, ?) = ?",
(COOKIEs, size, nick))


推荐阅读
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文目录一览:1、java中判断字符串是否为纯数字 ... [详细]
  • 开发笔记:js正则表达式属性及方法的使用
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了js正则表达式属性及方法的使用相关的知识,希望对你有一定的参考价值。正则表达式直接量 ... [详细]
  • 记录工作和学习中遇到和使用过的Python库。Target四个Level整理Collect学习Learn练习Practice掌握Master1.Python原生和功能增强1.1py ... [详细]
  • 1)2003CPTCode:90801-PsychiatricDiagnos2)y1983ClinicHospital,firsthospitaliz ... [详细]
  • re正则表达式1.什么是正则?正则就是用一系列具有特殊含义的字符组成的规则,该规则用来描述具有某一特征的字符串。正则就是用来在一个大的字符串匹配出符合规则的子字符串2.为什么用正则 ... [详细]
  • 安全等于运算符()这个操作符和操作符执行相同的比较操作,不过可以用来判断NULL值。在两个操作数均为NULL时,其返回值为1而不为NULL;而当一个操作数为NULL时,其返回 ... [详细]
  • 为什么python是动态类型语言_Python 3.7.0 面向对象的动态类型语言
    代表Python开发社区和Python3.7发布团队,我们很高兴地宣布https:www.python.orgdownloadsreleasepython-370 ... [详细]
  • python-去除字符串中特定字符一、去掉字符串两端字符:strip(,rstrip(,lstrip(s.strip(#删除两边(头尾空字符,默认是空字符s. ... [详细]
  • win10下载速度慢
    运维|windows运维win10,下载,速度慢运维-windows运维秒赞源码详细说明,vscode怎么跑项目,台电安装ubuntu,tomcat记录请求报文,sqlite的数据 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 1关于字符串相邻的两个或多个字符串字面值(引号引起来的字符)将会自动连接到一起:str_catpython!str_cat输出:python!把很长 ... [详细]
  • 详解 Python 的二元算术运算,为什么说减法只是语法糖?[Python常见问题]
    原题|UnravellingbinaryarithmeticoperationsinPython作者|BrettCannon译者|豌豆花下猫(“Python猫 ... [详细]
author-avatar
_戒咗微博地_100
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有