知识内容:
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 ...
-
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 ...
-
SQL注入攻击
SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...
随机推荐
-
YII2之 Scenario
使用方法 // scenario is set as a property $model = new User; $model->scenario = User::SCENARIO_SHOW; ...
-
使用ContentProvider进行应用程序间的数据交互
什么是ContentProvider: ContentProvider用来管理数据的访问规则.它允许你的应用程序向外界暴露需要被访问的数据. 是Android的四大组件之一. ContentProvi ...
-
SSH basics
SSH, Secure SHell, was designed and created to provide the best security when accessing another comp ...
-
如果一个游戏上面加一个透明层,js能不能实现 点击透明层的任意点 而正常玩游戏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
-
jsp:useBean标准动作
1.bean法则 JavaBean和企业JavaBean是完全不相干的两个东西.普通的非企业JavaBean需要满足一定的规范才能被JSP和servlet使用: 1)必须有一个无参数的公共构造函数: ...
-
js正则判断电话/手机/邮箱/
用途:校验ip地址的格式 输入:strIP:ip地址返回:如果通过验证返回true,否则返回false:*/ function isIP(strIP) { if (isNull(strIP)) ret ...
-
【Python】 用户图形界面GUI wxpython IV 菜单&;对话框
更多组件 ■ 菜单栏 Menu 菜单是很多GUI必不可少的一部分.要建立菜单,必须先创建菜单栏: menuBar = MenuBar() menu = Menu() item1 = menu.Appe ...
-
CSS重要知识概述——Java Web从入门到精通第2章
一.CSS简单规则 CSS样式表包含3部分内容:选择符.属性和属性值 其中选择符包括基本的3种选择器: 1.标记选择器,如<a></a>标签等: 2.类别选择器,用class属 ...
-
Elasticsearch系列(4):基本搜索
空搜索 搜索API的最基础的形式是没有指定任何查询的空搜索 ,它简单地返回集群中所有索引下的所有文档,如下命令: GET /_search 返回如下结果: 查询结果解释: 1,hits 返回结果中最重 ...
-
Jquery对当前日期的操作(格式化当前日期)
// 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...