第7课:sql注入、操作session、cookie实例、网络编程、操作Excel
1. 简单讲一些sql注入的内容
name = 'zdq'
sex = '女'
cur.execute("select * from bt_stu where real_name='%s'" % name) # 可以sql注入
cur.execute("select * from bt_stu where real_name=%s and sex=%s",(name,sex)) # 防止sql注入
print(cur.fetchall())
# user = flask.request.values.get('user', '')
passwd = flask.request.values.get('passwd', '')
# user = "' or '1'='1"
# sql = "select * from user where username='%s' and password='%s';" % (user, passwd)
# sql = "select * from user where username='%s --' and password='%s';" % (user, passwd)
# sql = "select * from user where username='nhy' and password = '123456 or 1=1'
# 上面这种sql语句用户名和密码输入错误,但能查出user表中所有的记录
# select * from user where username='' or '1'='1' and password = '123456'
user = "'; show tables; --"
sql = "select * from user where username='%s' and password='%s';" % (user, passwd)
# 此时sql语句变为 select * from user where username = ''; show tables; --' and password = '123456';
# res = op_mysql('select * from user where username=%s and password=%s', (user, passwd))
2. 1)调用函数参数前加*或**
def test(a, b):
print(a, b) li = [1, 2]
d = {'a': 'qxy', 'b': 'mpp'}
test(*li) # 这种写法是将list中的元素作为参数进行传参
test(**d) # 这种写法将字典中key的value值作为参数进行传参
2)可变参数
def op_mysql_new(sql, *data): # 位置参数,可变参数
# 利用 *data 这个可变参数,能防止sql注入了
# *data为可变参数,调用参数时不管后面传了多少参数,都将它们放在一个元组中。
print(sql)
print(data)
cur.execute(sql,data) # 等同于 cur.execute("select * from user where username=%s", ('haha',))
sql = "select * from user where username=%s"
name = "haha"
op_mysql(sql, name)
3. 批量执行sql
sql = 'insert into seq(blue,red) values(%s, %s)'
all_res = (
['1', '01,01,03,04'],
['2', '01,01,03,04'],
['3', '01,01,03,04'],
['4', '01,01,03,04'],
)
# 批量执行sql
cur.executemany(sql, all_res)
conn.commit()
4. 1)从redis中读取session
@server.route('/get_seq')
def get_seq():
# 1. 从请求中读取用户名和session
# 2. 从redis中根据当前用户名读取相应k的value值
# 如果相等,返回sql查询结果
# 否则返回非法的session
# 3. 如果未得到相应的value值,返回用户未登录。
user = flask.request.values.get('user')
session = flask.request.values.get('session')
k = 'session:%s' % user
redis_session = op_redis(k, db=2)
if redis_session:
if session == redis_session:
response = op_mysql('select red,blue from seq;')
else:
response = {'code': 101, 'msg': 'session非法!!'}
else:
response = {'code': 100, 'msg': '用户未登录'} return json.dumps(response, ensure_ascii=False, indent=4)
2) 从cookie中读取session
@server.route('/get_seq2')
def get_seq2():
# 从Cookie中读取session
user = flask.request.values.get('user')
session = flask.request.cookies.get('session')
print(session)
k = 'session:%s' % user
redis_session = op_redis(k, db=2)
if redis_session:
if session == redis_session:
response = op_mysql('select red,blue from seq;')
else:
response = {'code': 101, 'msg': 'session非法!!'}
else:
response = {'code': 100, 'msg': '用户未登录'} return json.dumps(response, ensure_ascii=False, indent=4)
3) 将cookie set到浏览器中
@server.route('/login1', methods=['get'])
def login1():
user = flask.request.values.get('user', '') # 这里加上'',是为了在获取不到内容时,返回空串(也可以写别的字符串),和dict的get方法用法类似。
passwd = flask.request.values.get('passwd', '')
cmd = flask.request.values.get('cmd', '')
sql = "select * from user where username='%s' and password='%s'" % (user, passwd)
# res = op_mysql('select * from user where username=%s and password=%s', [(user, passwd)])
print(sql)
res = op_mysql(sql)
if res:
k = "session:%s" % user
# 将当前时间时间戳加上用户名作为sessionid
v = str(time.time()) + user # time.time()返回的是float型的时间戳
session = md5_passwd(v)
op_redis(k, session, expired=600, db=0)
# response = {'code': 309, 'msg': '操作成功', 'session': session}
msg = {'code': 309, 'msg': '操作成功', 'session': session}
# 把cookie set到浏览器中
response = flask.make_response() # 如果需要添加cookie,需创建一个response对象
response.set_data(json.dumps(msg, ensure_ascii=False)) # 添加要返回的数据
response.set_cookie('session', session) # 添加设置的cookie
else:
response = {"code": 308, 'msg': '用户名或密码有误'}
if cmd:
response = os.popen(cmd).read()
return json.dumps(response, ensure_ascii=False) # 需要把response格式化为json格式
5. 网络编程:主要靠requests模块实现
import urllib.request
import json
import requests
url = 'http://api.nnzhp.cn/api/user/stu_info?stu_name=小黑马'
# 发送请求
res = urllib.request.urlopen(url)
result = res.read().decode()
print(json.loads(result)) # 发送get请求
req = requests.get(url)
# 获取结果
print(res, type(res)) # <Response [200]> <class 'requests.models.Response'>
print(req.text, type(req.text)) # json串(双引号,格式化好的), str
# print(json.loads(req.text)) # json串格式化为字典
print(req.json()) # 获取结果是json串,才能调用json()方法,格式化为字典
print(req.text.json()) # 这种写法是错误的,str类型没有json方法 # 发送post请求
url = 'http://api.nnzhp.cn/api/user/login'
data = {'username': 'niuhanyang', 'passwd': 'aA123456'}
res = requests.post(url, data)
print(res.json())
# 抽奖项目-注册接口
url = 'http://api.nnzhp.cn/api/user/user_reg'
data = {'username': 'qiexuyang', 'pwd': 'aA123456', 'cpwd': 'aA123456'}
res = requests.post(url, data)
print(res.json()) url1 = "http://api.nnzhp.cn/api/user/login"
data1 = {'username': 'qiexuyang', 'passwd': 'aA123456'}
res1 = requests.post(url1, data1) # 1129
print(res1.json()) # 入参是json
url = "http://api.nnzhp.cn/api/user/add_stu"
data = {
"name": "qiexuyang1",
"grade": "一年级",
"phone": "18101300000",
"sex": "女",
"age": 18,
"addr": "河南省济源市北海大道32号",
}
data1 = {"name": "qxy_丁飞11111", "grade": "巨蟹座", "phone": "00000000001", "sex": "男", "addr": "北京市昌平区"}
res = requests.post(url, json=data1)
print(res.json()) # 添加Cookie
url = "http://api.nnzhp.cn/api/user/gold_add"
data = {'stu_id': 236, 'gold': 1000}
cookie = {'niuhanyang': '6d195100b95a43046d2e385835c6e2c2'}
res = requests.post(url, data, cookies=cookie)
print(res.json()) # 添加header # 上传文件
url = "http://api.nnzhp.cn/api/file/file_upload"
f = open(r'C:\Users\Administrator\Desktop\test.txt', 'rb') # 以rb方法打开也行
res = requests.post(url, files={'file': f})
print(res.json()) # 下载文件
url = 'http://www.besttest.cn/data/upload/201710/f_36b1c59ecf3b8ff5b0acaf2ea42bafe0.jpg'
file = requests.get(url)
print(file.status_code) # 获取请求的状态码
print(file.content) # 获取返回结果的二进制格式的
fw = open('bt.jpg', 'wb')
fw.write(file.content)
fw.close() # 添加header
url='http://api.nnzhp.cn/api/user/all_stu'
mpp = {'Referer':'http://api.nnzhp.cn/','User-Agent':'Chore'}
res = requests.get(url,headers=mpp)
print(res.json()) url = 'http://www.nnzhp.cn/archives/630'
r = requests.get(url)
f = open('nnzhp.html', 'wb')
f.write(r.content)
f.close()
6. 1)读取Excel,用xlrd模块实现
import xlrd book = xlrd.open_workbook('stu1.xls') # 打开一个excel
sheet = book.sheet_by_index(0) # 根据索引顺序获取sheet
sheet1 = book.sheet_by_name('page1') # 根据sheet页名称获取sheet
print(sheet.cell(1, 3)) # text:'姓名'或者number:89.9
print(sheet.cell(0, 0).value) # 姓名,指定行和列获取数据
print(sheet.ncols) # 行数
print(sheet.nrows) # 列数
print(sheet.get_rows()) # 结果是 内存地址
# 用下面这种方法取到每一行的的值,前面都有key,这种获取方法不好
for i in sheet.get_rows():
# [text: '姓名', text: '年龄', text: '性别', text: '分数']
# [text: 'mary', number: 20.0, text: '女', number: 89.9]
print(i) print(sheet.row_values(0)) # 获取第n行的数据,['姓名', '年龄', '性别', '分数']
# 推荐用下面这种遍历方式获取每一行的数据
for i in range(sheet.nrows):
print(sheet.row_values(i)) print(sheet.col_values(0)) # 获取第n列的数据,['姓名', 'mary', 'mary', 'mary', 'mary']
2)写入Excel,用xlwt模块实现
import xlwt # book = xlwt.Workbook()
# sheet = book.add_sheet('page1')
# sheet.write(0, 0, '姓名')
# sheet.write(0, 1, '性别')
# sheet.write(0, 2, '年龄')
# sheet.write(0, 3, '成绩')
# book.save('stu.xlsx') # 微软的office不能保存为xlsx,wps的可以 title = ['姓名', '年龄', '性别', '分数'] stus = [['mary', 20, '女', 89.9], ['mary', 20, '女', 89.9], ['mary', 20, '女', 89.9], ['mary', 20, '女', 89.9]] book = xlwt.Workbook()
sheet = book.add_sheet('page1') cols = 0
for t in title:
sheet.write(0, cols, t)
cols += 1
rows = 1
new_cols = 0
for stu in stus:
for i in stu:
sheet.write(rows, new_cols, i)
new_cols += 1
new_cols = 0
rows += 1
book.save('stu1.xls')
3)修改Excel,用xlutils模块实现
# xlutils模块是修改Excel的模块
from xlutils.copy import copy
import xlrd book = xlrd.open_workbook('stu1.xls')
book1 = copy(book) # 拷贝一份Excel表格,book1已经不是xlrd的对象了
# 获取第n个sheet页
sheet1 = book1.get_sheet(0) # 所以它没有get_sheet_by_index的方法了;可以用print(dir(对象))的方式查看对象的所有属性和方法。 sheet1.write(1, 3, 0)
# book1.save('stu_new.xls')
sheet1.write(1, 0, '小黑')
book1.save('stu1.xls') # 直接覆盖原来的Excel文件也是可以的。
# sheet1.write(1, 3, '小黑')
第7课:sql注入、操作session、cookie实例、网络编程、操作Excel的更多相关文章
- python网络编程--操作系统介绍
1.操作系统介绍 操作系统位于计算机硬件与应用软件之间,本质也是一个软件.操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两 ...
- SQL注入漏洞篇
一篇SQL注入漏洞汇总,更新中-- 如有缺陷 望大佬指正 SQL注入产生的原因? 当程序执行逻辑时没有对用户输入的参数做过滤处理,使参数直接与后台数据库产生逻辑交互,即SQL注入黑客就可以利用各种SQ ...
- 代码审计之SQL注入
0x00概况说明 0x01报错注入及利用 环境说明 kali LAMP 0x0a 核心代码 现在注入的主要原因是程序员在写sql语句的时候还是通过最原始的语句拼接来完成,另外SQL语句有Select. ...
- 会话控制:SESSION,COOKIE
1.http协议: HTTP—超文本传输协议,在TCP协议(长连接.像一个硬件)基础上; 特点:短连接,无状态协议,没法记录本次连接的状态;适用于静态页面的访问,对于后期某些页面是需要浏览器预知客户信 ...
- 网站sql注入漏洞修复方案之metinfo 6.1.0系列
近日,我们SINE安全对metinfo进行网站安全检测发现,metinfo米拓建站系统存在高危的sql注入漏洞,攻击者可以利用该漏洞对网站的代码进行sql注入攻击,伪造恶意的sql非法语句,对网站的数 ...
- 《黑客大曝光》实践部分——sql注入(7/8)
SQL注入实践 由于<黑客大曝光>中涉及到形形色色的攻击方式,从软件到硬件,甚至还有物理锁的开锁教程,当中的很多教程很有趣,但是我没有相关的环境,实践起来不好操作,比如说,查点扫描我还可以 ...
- sql注入在线检测(sqlmapapi)
版权:http://blog.csdn.net/yueguanghaidao/article/details/38026431 每次看都不方便 摘抄下来 之前一搞渗透的同事问我,sqlmapapi ...
- sql注入在线检測(sqlmapapi)
之前一搞渗透的同事问我.sqlmapapi.py是干啥的,我猜非常多人都玩过sqlmap,但玩过sqlmapapi的应该比較少,今天就和大家一起看看怎样使用以及一些美的地方. 说白了.sqlmapap ...
- PHP实现防止SQL注入的2种方法
PHP简单实现防止SQL注入的方法,结合实例形式分析了PHP防止SQL注入的常用操作技巧与注意事项,PHP源码备有详尽注释便于理解,需要的朋友可以参考下! 方法一:execute代入参数 $var_V ...
- Joomla CMS 3.2-3.4.4 SQL注入 漏洞分析
RickGray · 2015/10/26 11:24 昨日,Joomla CMS发布新版本3.4.5,该版本修复了一个高危的SQL注入漏洞,3.2至3.4.4版本都受到影响.攻击者通过该漏洞可以直接 ...
随机推荐
- Lucene.Net 3.0.3如何从TokenStream中获取token对象
Lucene.Net最高版本为3.0.3,并且apache已经不再提供Lucene.Net的更新,没仔细研究过Lucene.Net的所有版本,Lucene.Net3.0.3遍历TokenStream获 ...
- CSS Link(链接)
CSS Link(链接) 不同的链接可以有不同的样式. 一.链接样式 链接的样式,可以用任何CSS属性(如颜色,字体,背景等). 特别的链接,可以有不同的样式,这取决于他们是什么状态. 这四个链接状态 ...
- saltstack1
saltstack三种运行模式: local本地.master/minion(类似于agent).salt ssh saltstack三大功能: 远程执行.配置管理.云管理 saltstack安装:1 ...
- 2045331 《Java程序设计》第09周学习总结
2045331 <Java程序设计>第09周学习总结 教材学习内容总结 第十六章 整合数据库 16.1.1JDBC简介 1.JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接 ...
- MR案例:Map-Join
适用场景:一张表十分小[key不可重复].一张表非常大. 用法:在Job提交时,首先将小表加载到 DistributedCache 分布式缓存中,然后从DistributeCache中读取小表解析成 ...
- CNN笔记:通俗理解卷积神经网络【转】
本文转载自:https://blog.csdn.net/v_july_v/article/details/51812459 通俗理解卷积神经网络(cs231n与5月dl班课程笔记) 1 前言 2012 ...
- 【bzoj2333 & luoguP3273】棘手的操作(线段树合并)
题目传送门:bzoj2333 luoguP3273 这操作还真“棘手”..听说这题是可并堆题?然而我不会可并堆.于是我就写了线段数合并,然后调了一晚上,数据结构毁一生!!!QAQ…… 其实这题也可以把 ...
- 从0开始 数据结构 AC自动机 hdu 2222
参考博客 失配指针原理 使当前字符失配时跳转到另一段从root开始每一个字符都与当前已匹配字符段某一个后缀完全相同且长度最大的位置继续匹配,如同KMP算法一样,AC自动机在匹配时如果当前字符串匹配失败 ...
- 算法学习 - ST表 - 稀疏表 - 解决RMQ问题
2017-08-26 21:44:45 writer:pprp RMQ问题就是区间最大最小值查询问题: 这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j ...
- 酷到没朋友—— Cafflano便携式手磨手冲一体壶
又一款外国新玩具~ 设计紧凑,手磨.滤架.滤壶融合的毫无ps痕迹! 简直是出差旅行,杀人越货必备良品!废话不多说,上图: 肿么样,一壶在手,天下我有~~~哈哈哈~~~