Python sqlite3操作数据库的时候cur.execute(‘insert into t values (%d)’% num) 会被sql注入,但把占位符该成"?“就不会了。
那问题来了,”?"到底做了什么才防止了sql注入呢?
"?"会把参数当做值来处理,不管参数是什么,都把它插入表就完事。
而直接的字符串拼接是把参数当做SQL语句的一部分,参数中有SQL语句的话,是有可能被执行的。
-
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...