常用数据库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 ...
随机推荐
- MQTT连接服务器返回2
/********************************************************************************* * MQTT连接服务器返回2 * ...
- TJU Problem 1065 Factorial
注意数据范围,十位数以上就可以考虑long long 了,断点调试也十分重要. 原题: 1065. Factorial Time Limit: 1.0 Seconds Memory Limit ...
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.4 LHS简介&Pattern
LHS简介 在规则文件组成章节,我们已经了解了LHS的基本使用说明.LHS是规则条件部分的统称,由0个或多个条件元素组成.前面我们已经提到,如果没有条件元素那么默认就是true. 没有条件元素,官方示 ...
- web页面的数据从excel中读取
# -*- coding: utf-8 -*- import xdrlib ,sysimport xlrdimport datetimeimport jsonimport conf,reimport ...
- Linux内核电源管理综述
资料:http://blog.csdn.net/bingqingsuimeng/article/category/1228414http://os.chinaunix.net/a2006/0519/1 ...
- linux 标准I/O (二)
<Uinx 环境高级编程笔记> 以前经常遇到两种I/O操作 一类是f打头的fopen, fread, fwrite 一类是没有f打头的open, read, fwrite 原来一个是U ...
- unbuntu 安装及服务器配置
关于分区: 挂载点 装置 说明 / /dev/hda1 15G /home /dev/hda2 最大的剩余空间 /boot /dev/hda3 200MB左右 swap /dev/hda5 大约内存大 ...
- ASP.NET Web API 全局权限和异常处理
转自:http://yangpei.appsp0t.com/post/aglzfnlhbmdwZWlyDAsSBUVudHJ5GLkXDA 正文之前先解决一个问题 Web Api XML序列化的问题 ...
- 蓝桥杯 算法训练 ALGO-116 最大的算式
算法训练 最大的算式 时间限制:1.0s 内存限制:256.0MB 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量 ...
- iview-admin打包笔记
在程序根目录右键打开cmd,输入 npm run build 这时就会进入打包的步骤,打包好之后就会在程序根目录出现一个dist的文件夹,里面有一个index.html文件和另一个dist的文件夹. ...