常用数据库2 sqlite及SQL注入
知识内容:
1.sqlite数据库介绍
2.sqlite数据库操作
3.SQL注入
一、sqlite数据库介绍
1.sqlite数据库
sqlite数据库:轻量级的数据库,一般开发中使用sqlite数据库,上线后将sqlite数据库换成其他数据库(比如MySQL、MongoDB)来进行快速开发
sqlite的数据库操作相对来说比较简单,sqlite是python3中自带的数据库,不用安装,python3中的sqlite3是操作sqlite数据库的模块,可以装一个叫sqlitebrowser的软件浏览sqlite数据库中的数据
2.现在的数据库分类
- 数据库现在主要分 关系型数据库(传统比如MySQL oracle等)
- NoSQL(新式比如 mongodb)
- 其他数据库(比如 fb 的图数据库)
二、sqlite数据库操作
1.数据库结构
传统数据库以表的形式存储数据
一张表可以有很多个字段 以用户表为例, 存储 4 个数据的表结构如下
用户 id 用户名 密码 邮箱 范例数据如下
1 wyb 666 wyb@qq.com
2 xxx 333 xxx@qq.com
2.关于SQL语言
sql语句详细:http://www.cnblogs.com/wyb666/p/9017402.html
数据库通过 SQL 来操作数据
SQL (结构化查询语言)-> 操作数据库的接口 也就是操作数据库的方法
增加数据 删除数据 修改数据 查询数据
CRUD
create retrieve update delete
3.sqlite操作数据库
几种关系型数据库的用法和 sql 语法都极度相似,开发中一般会用 sqlite 数据库,部署到服务器上的时候才会使用 mysql 等数据库
直接看下面代码:
# __author__ = "wyb"
# date: 2018/6/27
import sqlite3 # SQL 语句示例:
# INSERT INTO
# `users`(`id`,`username`,`password`,`email`)
# VALUES \
# (2,'','',NULL);
#
# UPDATE `users` SET `username`=? WHERE `_rowid_`='2';
# UPDATE `users` SET `password`=? WHERE `_rowid_`='2';
# UPDATE `users` SET `email`=? WHERE `_rowid_`='2'; """
下面是 python 操作 sqlite 数据库的范例代码
""" # 创建数据库中的表
def create(conn):
# 注意 CREATE TABLE 这种语句不分大小写
sql_create = '''
CREATE TABLE `users` (
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`username` TEXT NOT NULL UNIQUE,
`password` TEXT NOT NULL,
`email` TEXT
)
'''
# 用 execute 执行一条 sql 语句
conn.execute(sql_create)
print('创建成功') # 向数据库中插入数据
def insert(conn, username, password, email):
sql_insert = '''
INSERT INTO
users(username,password,email)
VALUES
(?, ?, ?);
'''
# 下面的写法用 string.format 拼 sql, 是一个严重的安全漏洞 -> SQL注入
# 会被 SQL 注入
# sql = '''
# INSERT INTO
# users(username,password,email)
# VALUES
# ("{}", "{}", "{}")
# '''.format('123', '345', 'a.com')
# conn.execute(sql)
# 参数拼接要用 ?,execute 中的参数传递必须是一个 tuple 类型
conn.execute(sql_insert, (username, password, email))
print('插入数据成功') # 查询数据
def select(conn):
sql = '''
SELECT
*
FROM
users
'''
# 这是读取数据的套路
cursor = conn.execute(sql)
print('所有数据', list(cursor))
# for row in cursor:
# print(row) # 删除数据
def delete(conn, user_id):
sql_delete = '''
DELETE FROM
users
WHERE
id=?
'''
# 注意, execute 的第二个参数是一个 tuple
# tuple 只有一个元素的时候必须是这样的写法
conn.execute(sql_delete, (user_id,)) # 更新数据
def update(conn, user_id, email):
"""
UPDATE
`users`
SET
`email`='gua', `username`='瓜'
WHERE
`id`=6
"""
sql_update = '''
UPDATE
`users`
SET
`email`=?
WHERE
`id`=?
'''
conn.execute(sql_update, (email, user_id)) # 主程序
def main():
# 指定数据库名字并打开 -> 没有会自动创建
db_path = 'web8.sqlite'
conn = sqlite3.connect(db_path)
print("打开数据库") # create
# 打开数据库后 就可以用 create 函数创建表 -> 注意创建表只能创建一次 创建已创建的表会报错
# create(conn) # insert
# 然后可以用 insert 函数插入数据 -> 注意插入一次后下面的数据就不能再插入 因为用户名有限制(unique)
# insert(conn, 'test', '123456', 'a@b.c') # delete
# 可以用 delete 函数删除数据
# delete(conn, 1) # update
# 可以用 update 函数更新数据
# update(conn, 1, 'woz_wyb@qq.com')
# select 函数查询数据
select(conn) # 最后提交:
# 必须用 commit 函数提交你的修改
# 否则你的修改不会被写入数据库
conn.commit()
# 用完数据库要关闭
conn.close() if __name__ == '__main__':
main()
三、SQL注入问题
1.什么是SQL注入
SQL注入:所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入恶意SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句
比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击
注意在拼SQL语句时一定要使用?让数据库自己去拼接字符串,而不是使用某种编程语言自带的语法去拼接字符串,比如在下面使用python中的format拼接字符串就会导致SQL注入的漏洞!
2.SQL注入实例
表结构:

创建数据库及表及插入数据见上面的sqlite操作数据库,SQL注入的实例:
# __author__ = "wyb"
# date: 2018/6/28
import sqlite3 # 查询数据 存在SQL注入隐患
def select(conn):
# 以下是一个隐患! 完全可以构造一个字符串来注入SQL 看下面的sql_inject函数
# 这样的漏洞就是等着被人搞 尤其是PHP 这样的漏洞非常多 字符串拼接在这里是又麻烦又不安全 不要在SQL语句上使用语言自带的字符串拼接
user = ""
pwd = ""
sql = '''
SELECT
id, username, email
FROM
users
WHERE
username="{}" and password="{}"
'''.format(user, pwd)
# 这是读取数据的套路
cursor = conn.execute(sql)
print('所有数据', list(cursor))
# for row in cursor:
# print(row) # SQL注入演示
def sql_inject(conn):
user = '123" or "1"="1' # 一个注入的用户名
pwd = "xxadfaksbglwsyfansdvliaysf" # 随便乱打的密码
sql = '''
SELECT
id, username, email
FROM
users
WHERE
username="{}" and password="{}"
'''.format(user, pwd)
# user = '123" or "1"="1' -> 拼接的结果是: username="123" or "1"="1" and password="随便乱打一个密码" -> 恒成立 # 读取数据
cursor = conn.execute(sql)
print('所有数据', list(cursor)) # SQL拼接正确做法 -> 使用?让数据库自己处理拼接
def sql_select(conn):
user = '123" or "1"="1' # 一个注入的用户名
pwd = "xxadfaksbglwsyfansdvliaysf" # 随便乱打的密码
sql = '''
SELECT
id, username, email
FROM
users
WHERE
username=? and password=?
''' # 读取数据
cursor = conn.execute(sql, (user, pwd))
print('所有数据', list(cursor)) # 主程序
def main():
# 指定数据库名字并打开 -> 没有会自动创建
db_path = 'web8.sqlite'
conn = sqlite3.connect(db_path)
print("打开数据库") # select 查询
# select(conn)
# SQL注入
sql_inject(conn)
# 正确的SQL拼接写法
sql_select(conn) # 最后提交:
# 必须用 commit 函数提交你的修改
# 否则你的修改不会被写入数据库
conn.commit()
# 用完数据库要关闭
conn.close() if __name__ == '__main__':
main()
最后总结:在拼接SQL语句时一定使用?,千万不要使用编程语言自带的拼接语法(比如python中的format),避免SQL注入漏洞的发生!
3.如何防止SQL注入
在拼接SQL语句时一定使用?,千万不要使用编程语言自带的拼接语法(比如python中的format),避免SQL注入漏洞的发生!
常用数据库2 sqlite及SQL注入的更多相关文章
- 数据库防火墙如何防范SQL注入行为
SQL注入是当前针对数据库安全进行外部攻击的一种常见手段.现有主流应用大多基于B/S架构开发,SQL注入的攻击方式正是利用web层和通讯层的缺陷对数据库进行外部恶意攻击.将SQL命令巧妙的插入通讯的交 ...
- 【数据库】软件安全测试之SQL注入
这些年我们发现越来越多的公司开始注重安全测试了,为什么?因为安全测试可以在某种程度上可以排查掉你项目的一些安全漏洞,这样你的系统上线后才会相对安全,才有可能尽量避免来自外部的攻击.每一年互联网都会发生 ...
- MySQL数据库(六)-- SQL注入攻击、视图、事物、存储过程、流程控制
一.SQL注入攻击 1.什么是SQL注入攻击 一些了解sql语法的用户,可以输入一些关键字 或合法sql,来导致原始的sql逻辑发生变化,从而跳过登录验证 或者 删除数据库 import pymysq ...
- MySQL数据库(六) —— SQL注入攻击、视图、事物、存储过程、流程控制
SQL注入攻击.视图.事物.存储过程.流程控制 一.SQL注入攻击 1.什么是SQL注入攻击 import pymysql conn = pymysql.Connect( user="roo ...
- SQL注入常用命令
1. 数据库查询版本 Mssql select @@version Mysql select vresion()/select @@version oracle select banner from ...
- 06 数据库入门学习-视图、sql注入、事务、存储过程
一.视图 1.什么是视图 视图本质是一张虚拟的表 2.为什么要用 为了原表的安全 只要有两大功能 1.隐藏部分数据,开放指定数据 2.视图可以将查询结果保存,减少sql语句的次数 特点: 1.视图使用 ...
- 【数据库】SQL注入攻击
背景: 机房收费系统验收的时候,师父提到SQL注入攻击.自己以前看过类似的博客大概知道一些这方面的事情,于是自己动手查了查. 定义: 所谓SQL注入,通过SQL命令插入到Web表单提交或者输入域名或页 ...
- 程序员常用的3大Web安全漏洞防御解决方案:XSS、CSRF及SQL注入(图文详解)
https://blog.csdn.net/ChenRui_yz/article/details/86489067 随着互联网的普及,网络安全变得越来越重要,程序员需要掌握最基本的web安全防范,下面 ...
- 十大关系数据库SQL注入工具一览
摘要:众所周知,SQL注入攻击是最为常见的Web应用程序攻击技术.同时SQL注入攻击所带来的安全破坏也是不可弥补的.以下罗列的10款SQL工具可帮助管理员及时检测存在的漏洞. BSQL Hacker ...
随机推荐
- AHK教程 - imsoft.cnblogs
转自:小弗兰茨 AHK,就是传说中的 Auto Hot Key .什么?没有听说过?那么很正常……它运行在Windows下.总之,AHK可以赋予你对你的电脑的无与伦比的控制力.一些人想要在MM面前展示 ...
- BZOJ3925: [Zjoi2015]地震后的幻想乡【概率期望+状压DP】
Description 傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们. 这不,幻想乡突然发生了地震,所有的道路都崩塌了.现在的首要任 ...
- Linux内核中的机制学习总结
一.驱动中的poll机制 1.简介:select()和poll()系统调用的本质一样,前者在 BSD UNIX 中引入的,后者在 System V 中引入的. 应用程序使用 select() 或 po ...
- stenciljs 学习一 web 组件开发
stenciljs 介绍参考官方网站,或者 https://www.cnblogs.com/rongfengliang/p/9706542.html 创建项目 使用脚手架工具 npm init ste ...
- x86函数调用约定
以下摘自<IDA Pro>,貌似有一些细节之处没有交代清楚呢,需要进一步思考.实践. 了解栈帧的基本概念后,接下来详细介绍它们的结构.下面的例子涉及x86体系结构和与常见的x86编译器(如 ...
- 读写XML文档时,去掉新增加节点的“空命名空间”(xmlns=””)
在做对ReprotViewer编程时,想做一个用户可以更改显示/打印列的功能,大致看了下,只需要通过对rdlc文件中改变其<Hidden>节点值为false/true,即可实现对应某列的显 ...
- CAM 查看里先选哪些层才能方便查看
CAM 检查 Gerber 时选 Layer 时有先后次序,才以看清楚是否有冲突. 比如检查 TOP 层时顺序应该是 MT ST L1 BOT 层检查顺序 MB SB L2/L4
- RESTful 接口设计规范
get 用来获取,post 用来新建(也可以用于更新),put 用来更新,delete 用来删除.
- 打开Visual Studio 2012的解决方案 连接 Dynamics CRM 2011 的Connect to Dynamics CRM Server 在其工具下没有显示
一.使用TFS 代码管理,发现Visual Studio 2012 菜单栏 工具下的Connect to Dynamics CRM Server 没有显示. 平常打开VS下的工具都会出现Connect ...
- Microsoft Dynamics CRM 4.0 JScript 通用公共方法
1.基本参数 var CRM_FORM_TYPE_CREATE = 1; var CRM_FORM_TYPE_UPDATE = 2; var CRM_FORM_TYPE_READ_ONLY = 3; ...