Python sqlite3操作数据库的时候cur.execute(‘insert into t values (%d)’% num) 会被sql注入,但把占位符该成"?“就不会了。
那问题来了,”?"到底做了什么才防止了sql注入呢?

"?"会把参数当做值来处理,不管参数是什么,都把它插入表就完事。
而直接的字符串拼接是把参数当做SQL语句的一部分,参数中有SQL语句的话,是有可能被执行的。

  1. python - 为什么sqlite3里用"?"作占位符就能防止sql注入?
从HTML注入安全 使用标记的模板文字进行查询,例如 db . query ( sql `SELECT * FROM users WHERE id= ${ userID } ` ) ; 使得SQL Injection攻击几乎不可能被忽视。 所有@databases库都强制使用sql标记的模板文字,因此您不会意外遗漏它们。 然后将查询 为单独的字符串和值传递到 数据库 引擎: { text : 'SELECT * FROM users WHERE id=?' , values : [ userID ] } 所有@databases API的设计都一开始就牢记了承诺。 用TypeScript编写,因此每个模块都有内置的类型安全性和类型定义。 每个 数据库 驱动程序都 为单独的模块发布到npm,因此您不需要安装不需要的驱动程序。 @ databases /连接池 @ 数据库 /展览 @ 数据库 / mysql @ databases / mysql-test @ 数据库 / pg @ databases / pg-migrations @ data SQL注入 原理 SQL注入 漏洞存在的原因,就是拼接SQL参数,所谓 SQL注入 ,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。 例:参数为id $sql = 'select * from test where id='.$_GET['id']; 正常输入2 则sql为:select * from test where id 在 Python 说明文档中推荐使用? 占位符 (placeholder)来代替字符串操 ,原文如下: 通常你的 SQL 操 需要使用一些 Python 变量的值。你不应该使用 Python 的字符串操 来创建你的查询语句,因为那样做不安全;它会使你的程序容易受到 SQL 注入攻击。 推荐另外一种方法:使用 DB-API 的参数替换。在你的 SQL 语句中,使用 ? 占位符 来代替值,然后把对应的值组成... 在 python 的文档中有大概这样一段描述:在使用sql语句操纵 数据库 的时候,不应该直接将字符串连接起来 为sql语句进行查询,因为直接将外部传入的字符串代入到sql语句中就会产生 sql注入 的问题。比如下面是一个错误的用法symbol = 'IBM'c.execute("... where symbol = '%s'" % symbol)#错误的用法,会带来 sql注入 在实际使用的时候,应该使用 数据库 ... sql_add = 'insert into images(id, gray1, contrast1, gray2, contrast2, level) values(%s, %s, %s, %s, %s, %s)' # 执行语句 #execute(self, query, args) cur.execute(sql_add, (str_id, str_gray1, str_contrast1, str_gray2, str_contr -(void) insertRecord:(NSString *)table                   withValue1:(NSString*) value1                   withValue2:(NSString*) value2                   withValue3:(NSString*) value3 LinkedHashMap是HashMap的一个子类,它保留插入的顺序,如果需要输出的顺序和输入时的相同,那么就选用LinkedHashMap。    LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操 ,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。    LinkedHashMap实现与 一般攻击者会假设网站有 sql注入 的漏洞,比如这个查询语句: 攻击者假设这个10是文章的id, 攻击者就会猜测可能是上面的sql语句 页面上输入的参数是10,这时候,就可以拼凑测试,比如在url上拼接 1 ) 判断是否可以注入, 一般而言,如果可以的话页面正常,不报错,但是也有其他情况,如下 这两个都没什么反应,不报错,页面正常,说明后面的and没有起 用 攻击者会猜测可能是字符串存在引号的问题, 继续尝试 这样如果页面出错,那么继续修改 这时候页面不报错 这种情况(恒等正常,恒不等报错)就说明,一 import sqlite 3class Demo01: def __init__(self): self.conn= sqlite 3.connect("sql_demo_001.db") self.cursor1=self.conn.cursor() self.cursor1.execute("select * from table_001 where...