知识内容:

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注入的更多相关文章

  1. 数据库防火墙如何防范SQL注入行为

    SQL注入是当前针对数据库安全进行外部攻击的一种常见手段.现有主流应用大多基于B/S架构开发,SQL注入的攻击方式正是利用web层和通讯层的缺陷对数据库进行外部恶意攻击.将SQL命令巧妙的插入通讯的交 ...

  2. 【数据库】软件安全测试之SQL注入

    这些年我们发现越来越多的公司开始注重安全测试了,为什么?因为安全测试可以在某种程度上可以排查掉你项目的一些安全漏洞,这样你的系统上线后才会相对安全,才有可能尽量避免来自外部的攻击.每一年互联网都会发生 ...

  3. MySQL数据库(六)-- SQL注入攻击、视图、事物、存储过程、流程控制

    一.SQL注入攻击 1.什么是SQL注入攻击 一些了解sql语法的用户,可以输入一些关键字 或合法sql,来导致原始的sql逻辑发生变化,从而跳过登录验证 或者 删除数据库 import pymysq ...

  4. MySQL数据库(六) —— SQL注入攻击、视图、事物、存储过程、流程控制

    SQL注入攻击.视图.事物.存储过程.流程控制 一.SQL注入攻击 1.什么是SQL注入攻击 import pymysql conn = pymysql.Connect( user="roo ...

  5. SQL注入常用命令

    1. 数据库查询版本 Mssql select @@version Mysql select vresion()/select @@version oracle select banner from ...

  6. 06 数据库入门学习-视图、sql注入、事务、存储过程

    一.视图 1.什么是视图 视图本质是一张虚拟的表 2.为什么要用 为了原表的安全 只要有两大功能 1.隐藏部分数据,开放指定数据 2.视图可以将查询结果保存,减少sql语句的次数 特点: 1.视图使用 ...

  7. 【数据库】SQL注入攻击

    背景: 机房收费系统验收的时候,师父提到SQL注入攻击.自己以前看过类似的博客大概知道一些这方面的事情,于是自己动手查了查. 定义: 所谓SQL注入,通过SQL命令插入到Web表单提交或者输入域名或页 ...

  8. 程序员常用的3大Web安全漏洞防御解决方案:XSS、CSRF及SQL注入(图文详解)

    https://blog.csdn.net/ChenRui_yz/article/details/86489067 随着互联网的普及,网络安全变得越来越重要,程序员需要掌握最基本的web安全防范,下面 ...

  9. 十大关系数据库SQL注入工具一览

    摘要:众所周知,SQL注入攻击是最为常见的Web应用程序攻击技术.同时SQL注入攻击所带来的安全破坏也是不可弥补的.以下罗列的10款SQL工具可帮助管理员及时检测存在的漏洞. BSQL Hacker ...

随机推荐

  1. 当ORACLE归档日志满后如何正确删除归档日志

    当ORACLE 归档日志满了后,将无法正常登入ORACLE,需要删除一部分归档日志才能正常登入ORACLE. 一.首先删除归档日志物理文件,归档日志一般都是位于archive目录下,AIX系统下文件格 ...

  2. Codeforces 208A:Dubstep(字符串)

    题目链接:http://codeforces.com/problemset/problem/208/A 题意 给出一个字符串,将字符串中的WUB给删去,如果两个字母间有WUB,则这两个字母用空格隔开 ...

  3. 杭电oj2001-C语言

    题目 题目 Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离. Input 输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x ...

  4. POJ3669解题报告(bfs)

    POJ3669http://poj.org/problem?id=3669 很明显是一道bfs的题目 由于陨石的降临具有时刻性,所以地图是随时间变化的, 所以可以使用结构体来存储陨石下落的时刻以及位置 ...

  5. jsp内置对象request 和response

    1.request对象主要用于处理客户端的请求 request对象常用方法 一.String  request.getParameter(String name)             根据页面表单 ...

  6. Java JDK 版本的区别

    jdk6和jdk5相比的新特性有: 1.instrumentation 在 Java SE 6 里面,instrumentation 包被赋予了更强大的功能:启动后的 instrument.本地代码 ...

  7. stenciljs 学习十二 官方doc 路由使用的例子

    路由在单页面应用开发中是一个相对比较重要的位置 以下为官方网站的路由配置 <stencil-router scrollTopOffset={0}> <stencil-route-sw ...

  8. streamsets k8s 部署试用

    使用k8s 进行 streamsets的部署(没有使用持久化存储) k8s deploy yaml 文件 deploy.yaml apiVersion: extensions/v1beta1 kind ...

  9. MySQL Group Replication

    group replication是一种全新的高可用,高扩张的MySQL集群服务.高一致性,基于原生复制及paxos协议的组复制技术,以插件方式提供一致数据安全保证:高容错性,大多数服务正常就可继续工 ...

  10. 解决webpack不是内部命令

    在指定路径下安装webpack npm install webpack --save-dev 但是报”不是内部命令错误" 解决方法:安装全局webpack   npm install web ...