1. 简单讲一些sql注入的内容

  1. name = 'zdq'
  2. sex = '女'
  3. cur.execute("select * from bt_stu where real_name='%s'" % name) # 可以sql注入
  4. cur.execute("select * from bt_stu where real_name=%s and sex=%s",(name,sex)) # 防止sql注入
  5. print(cur.fetchall())
  1. # user = flask.request.values.get('user', '')
  2. passwd = flask.request.values.get('passwd', '')
  3. # user = "' or '1'='1"
  4. # sql = "select * from user where username='%s' and password='%s';" % (user, passwd)
  5. # sql = "select * from user where username='%s --' and password='%s';" % (user, passwd)
  6. # sql = "select * from user where username='nhy' and password = '123456 or 1=1'
  7. # 上面这种sql语句用户名和密码输入错误,但能查出user表中所有的记录
  8. # select * from user where username='' or '1'='1' and password = '123456'
  9. user = "'; show tables; --"
  10. sql = "select * from user where username='%s' and password='%s';" % (user, passwd)
  11. # 此时sql语句变为 select * from user where username = ''; show tables; --' and password = '123456';
  12. # res = op_mysql('select * from user where username=%s and password=%s', (user, passwd))

2. 1)调用函数参数前加*或**

  1. def test(a, b):
  2. print(a, b)
  3.  
  4. li = [1, 2]
  5. d = {'a': 'qxy', 'b': 'mpp'}
  6. test(*li) # 这种写法是将list中的元素作为参数进行传参
  7. test(**d) # 这种写法将字典中key的value值作为参数进行传参

2)可变参数

  1. def op_mysql_new(sql, *data): # 位置参数,可变参数
  2. # 利用 *data 这个可变参数,能防止sql注入了
  3. # *data为可变参数,调用参数时不管后面传了多少参数,都将它们放在一个元组中。
  4. print(sql)
  5. print(data)
  6. cur.execute(sql,data) # 等同于 cur.execute("select * from user where username=%s", ('haha',))
  7. sql = "select * from user where username=%s"
  8. name = "haha"
  9. op_mysql(sql, name)

3. 批量执行sql

  1. sql = 'insert into seq(blue,red) values(%s, %s)'
  2. all_res = (
  3. ['1', '01,01,03,04'],
  4. ['2', '01,01,03,04'],
  5. ['3', '01,01,03,04'],
  6. ['4', '01,01,03,04'],
  7. )
  8. # 批量执行sql
  9. cur.executemany(sql, all_res)
  10. conn.commit()

4. 1)从redis中读取session

  1. @server.route('/get_seq')
  2. def get_seq():
  3. # 1. 从请求中读取用户名和session
  4. # 2. 从redis中根据当前用户名读取相应k的value值
  5. # 如果相等,返回sql查询结果
  6. # 否则返回非法的session
  7. # 3. 如果未得到相应的value值,返回用户未登录。
  8. user = flask.request.values.get('user')
  9. session = flask.request.values.get('session')
  10. k = 'session:%s' % user
  11. redis_session = op_redis(k, db=2)
  12. if redis_session:
  13. if session == redis_session:
  14. response = op_mysql('select red,blue from seq;')
  15. else:
  16. response = {'code': 101, 'msg': 'session非法!!'}
  17. else:
  18. response = {'code': 100, 'msg': '用户未登录'}
  19.  
  20. return json.dumps(response, ensure_ascii=False, indent=4)

2) 从cookie中读取session

  1. @server.route('/get_seq2')
  2. def get_seq2():
  3. # 从Cookie中读取session
  4. user = flask.request.values.get('user')
  5. session = flask.request.cookies.get('session')
  6. print(session)
  7. k = 'session:%s' % user
  8. redis_session = op_redis(k, db=2)
  9. if redis_session:
  10. if session == redis_session:
  11. response = op_mysql('select red,blue from seq;')
  12. else:
  13. response = {'code': 101, 'msg': 'session非法!!'}
  14. else:
  15. response = {'code': 100, 'msg': '用户未登录'}
  16.  
  17. return json.dumps(response, ensure_ascii=False, indent=4)

3) 将cookie set到浏览器中

  1. @server.route('/login1', methods=['get'])
  2. def login1():
  3. user = flask.request.values.get('user', '') # 这里加上'',是为了在获取不到内容时,返回空串(也可以写别的字符串),和dict的get方法用法类似。
  4. passwd = flask.request.values.get('passwd', '')
  5. cmd = flask.request.values.get('cmd', '')
  6. sql = "select * from user where username='%s' and password='%s'" % (user, passwd)
  7. # res = op_mysql('select * from user where username=%s and password=%s', [(user, passwd)])
  8. print(sql)
  9. res = op_mysql(sql)
  10. if res:
  11. k = "session:%s" % user
  12. # 将当前时间时间戳加上用户名作为sessionid
  13. v = str(time.time()) + user # time.time()返回的是float型的时间戳
  14. session = md5_passwd(v)
  15. op_redis(k, session, expired=600, db=0)
  16. # response = {'code': 309, 'msg': '操作成功', 'session': session}
  17. msg = {'code': 309, 'msg': '操作成功', 'session': session}
  18. # 把cookie set到浏览器中
  19. response = flask.make_response() # 如果需要添加cookie,需创建一个response对象
  20. response.set_data(json.dumps(msg, ensure_ascii=False)) # 添加要返回的数据
  21. response.set_cookie('session', session) # 添加设置的cookie
  22. else:
  23. response = {"code": 308, 'msg': '用户名或密码有误'}
  24. if cmd:
  25. response = os.popen(cmd).read()
  26. return json.dumps(response, ensure_ascii=False) # 需要把response格式化为json格式

5. 网络编程:主要靠requests模块实现

  1. import urllib.request
  2. import json
  3. import requests
  4. url = 'http://api.nnzhp.cn/api/user/stu_info?stu_name=小黑马'
  5. # 发送请求
  6. res = urllib.request.urlopen(url)
  7. result = res.read().decode()
  8. print(json.loads(result))
  9.  
  10. # 发送get请求
  11. req = requests.get(url)
  12. # 获取结果
  13. print(res, type(res)) # <Response [200]> <class 'requests.models.Response'>
  14. print(req.text, type(req.text)) # json串(双引号,格式化好的), str
  15. # print(json.loads(req.text)) # json串格式化为字典
  16. print(req.json()) # 获取结果是json串,才能调用json()方法,格式化为字典
  17. print(req.text.json()) # 这种写法是错误的,str类型没有json方法
  18.  
  19. # 发送post请求
  20. url = 'http://api.nnzhp.cn/api/user/login'
  21. data = {'username': 'niuhanyang', 'passwd': 'aA123456'}
  22. res = requests.post(url, data)
  23. print(res.json())
  24. # 抽奖项目-注册接口
  25. url = 'http://api.nnzhp.cn/api/user/user_reg'
  26. data = {'username': 'qiexuyang', 'pwd': 'aA123456', 'cpwd': 'aA123456'}
  27. res = requests.post(url, data)
  28. print(res.json())
  29.  
  30. url1 = "http://api.nnzhp.cn/api/user/login"
  31. data1 = {'username': 'qiexuyang', 'passwd': 'aA123456'}
  32. res1 = requests.post(url1, data1) # 1129
  33. print(res1.json())
  34.  
  35. # 入参是json
  36. url = "http://api.nnzhp.cn/api/user/add_stu"
  37. data = {
  38. "name": "qiexuyang1",
  39. "grade": "一年级",
  40. "phone": "18101300000",
  41. "sex": "女",
  42. "age": 18,
  43. "addr": "河南省济源市北海大道32号",
  44. }
  45. data1 = {"name": "qxy_丁飞11111", "grade": "巨蟹座", "phone": "00000000001", "sex": "男", "addr": "北京市昌平区"}
  46. res = requests.post(url, json=data1)
  47. print(res.json())
  48.  
  49. # 添加Cookie
  50. url = "http://api.nnzhp.cn/api/user/gold_add"
  51. data = {'stu_id': 236, 'gold': 1000}
  52. cookie = {'niuhanyang': '6d195100b95a43046d2e385835c6e2c2'}
  53. res = requests.post(url, data, cookies=cookie)
  54. print(res.json())
  55.  
  56. # 添加header
  57.  
  58. # 上传文件
  59. url = "http://api.nnzhp.cn/api/file/file_upload"
  60. f = open(r'C:\Users\Administrator\Desktop\test.txt', 'rb') # 以rb方法打开也行
  61. res = requests.post(url, files={'file': f})
  62. print(res.json())
  63.  
  64. # 下载文件
  65. url = 'http://www.besttest.cn/data/upload/201710/f_36b1c59ecf3b8ff5b0acaf2ea42bafe0.jpg'
  66. file = requests.get(url)
  67. print(file.status_code) # 获取请求的状态码
  68. print(file.content) # 获取返回结果的二进制格式的
  69. fw = open('bt.jpg', 'wb')
  70. fw.write(file.content)
  71. fw.close()
  72.  
  73. # 添加header
  74. url='http://api.nnzhp.cn/api/user/all_stu'
  75. mpp = {'Referer':'http://api.nnzhp.cn/','User-Agent':'Chore'}
  76. res = requests.get(url,headers=mpp)
  77. print(res.json())
  78.  
  79. url = 'http://www.nnzhp.cn/archives/630'
  80. r = requests.get(url)
  81. f = open('nnzhp.html', 'wb')
  82. f.write(r.content)
  83. f.close()

6. 1)读取Excel,用xlrd模块实现

  1. import xlrd
  2.  
  3. book = xlrd.open_workbook('stu1.xls') # 打开一个excel
  4. sheet = book.sheet_by_index(0) # 根据索引顺序获取sheet
  5. sheet1 = book.sheet_by_name('page1') # 根据sheet页名称获取sheet
  6. print(sheet.cell(1, 3)) # text:'姓名'或者number:89.9
  7. print(sheet.cell(0, 0).value) # 姓名,指定行和列获取数据
  8. print(sheet.ncols) # 行数
  9. print(sheet.nrows) # 列数
  10. print(sheet.get_rows()) # 结果是 内存地址
  11. # 用下面这种方法取到每一行的的值,前面都有key,这种获取方法不好
  12. for i in sheet.get_rows():
  13. # [text: '姓名', text: '年龄', text: '性别', text: '分数']
  14. # [text: 'mary', number: 20.0, text: '女', number: 89.9]
  15. print(i)
  16.  
  17. print(sheet.row_values(0)) # 获取第n行的数据,['姓名', '年龄', '性别', '分数']
  18. # 推荐用下面这种遍历方式获取每一行的数据
  19. for i in range(sheet.nrows):
  20. print(sheet.row_values(i))
  21.  
  22. print(sheet.col_values(0)) # 获取第n列的数据,['姓名', 'mary', 'mary', 'mary', 'mary']

2)写入Excel,用xlwt模块实现

  1. import xlwt
  2.  
  3. # book = xlwt.Workbook()
  4. # sheet = book.add_sheet('page1')
  5. # sheet.write(0, 0, '姓名')
  6. # sheet.write(0, 1, '性别')
  7. # sheet.write(0, 2, '年龄')
  8. # sheet.write(0, 3, '成绩')
  9. # book.save('stu.xlsx') # 微软的office不能保存为xlsx,wps的可以
  10.  
  11. title = ['姓名', '年龄', '性别', '分数']
  12.  
  13. stus = [['mary', 20, '女', 89.9], ['mary', 20, '女', 89.9], ['mary', 20, '女', 89.9], ['mary', 20, '女', 89.9]]
  14.  
  15. book = xlwt.Workbook()
  16. sheet = book.add_sheet('page1')
  17.  
  18. cols = 0
  19. for t in title:
  20. sheet.write(0, cols, t)
  21. cols += 1
  22. rows = 1
  23. new_cols = 0
  24. for stu in stus:
  25. for i in stu:
  26. sheet.write(rows, new_cols, i)
  27. new_cols += 1
  28. new_cols = 0
  29. rows += 1
  30. book.save('stu1.xls')

3)修改Excel,用xlutils模块实现

  1. # xlutils模块是修改Excel的模块
  2. from xlutils.copy import copy
  3. import xlrd
  4.  
  5. book = xlrd.open_workbook('stu1.xls')
  6. book1 = copy(book) # 拷贝一份Excel表格,book1已经不是xlrd的对象了
  7. # 获取第n个sheet页
  8. sheet1 = book1.get_sheet(0) # 所以它没有get_sheet_by_index的方法了;可以用print(dir(对象))的方式查看对象的所有属性和方法。
  9.  
  10. sheet1.write(1, 3, 0)
  11. # book1.save('stu_new.xls')
  12. sheet1.write(1, 0, '小黑')
  13. book1.save('stu1.xls') # 直接覆盖原来的Excel文件也是可以的。
  14. # sheet1.write(1, 3, '小黑')

第7课:sql注入、操作session、cookie实例、网络编程、操作Excel的更多相关文章

  1. python网络编程--操作系统介绍

    1.操作系统介绍 操作系统位于计算机硬件与应用软件之间,本质也是一个软件.操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两 ...

  2. SQL注入漏洞篇

    一篇SQL注入漏洞汇总,更新中-- 如有缺陷 望大佬指正 SQL注入产生的原因? 当程序执行逻辑时没有对用户输入的参数做过滤处理,使参数直接与后台数据库产生逻辑交互,即SQL注入黑客就可以利用各种SQ ...

  3. 代码审计之SQL注入

    0x00概况说明 0x01报错注入及利用 环境说明 kali LAMP 0x0a 核心代码 现在注入的主要原因是程序员在写sql语句的时候还是通过最原始的语句拼接来完成,另外SQL语句有Select. ...

  4. 会话控制:SESSION,COOKIE

    1.http协议: HTTP—超文本传输协议,在TCP协议(长连接.像一个硬件)基础上; 特点:短连接,无状态协议,没法记录本次连接的状态;适用于静态页面的访问,对于后期某些页面是需要浏览器预知客户信 ...

  5. 网站sql注入漏洞修复方案之metinfo 6.1.0系列

    近日,我们SINE安全对metinfo进行网站安全检测发现,metinfo米拓建站系统存在高危的sql注入漏洞,攻击者可以利用该漏洞对网站的代码进行sql注入攻击,伪造恶意的sql非法语句,对网站的数 ...

  6. 《黑客大曝光》实践部分——sql注入(7/8)

    SQL注入实践 由于<黑客大曝光>中涉及到形形色色的攻击方式,从软件到硬件,甚至还有物理锁的开锁教程,当中的很多教程很有趣,但是我没有相关的环境,实践起来不好操作,比如说,查点扫描我还可以 ...

  7. sql注入在线检测(sqlmapapi)

    版权:http://blog.csdn.net/yueguanghaidao/article/details/38026431 每次看都不方便   摘抄下来 之前一搞渗透的同事问我,sqlmapapi ...

  8. sql注入在线检測(sqlmapapi)

    之前一搞渗透的同事问我.sqlmapapi.py是干啥的,我猜非常多人都玩过sqlmap,但玩过sqlmapapi的应该比較少,今天就和大家一起看看怎样使用以及一些美的地方. 说白了.sqlmapap ...

  9. PHP实现防止SQL注入的2种方法

    PHP简单实现防止SQL注入的方法,结合实例形式分析了PHP防止SQL注入的常用操作技巧与注意事项,PHP源码备有详尽注释便于理解,需要的朋友可以参考下! 方法一:execute代入参数 $var_V ...

  10. 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版本都受到影响.攻击者通过该漏洞可以直接 ...

随机推荐

  1. 超级强大的vim配置(vimplus)--续集

    An automatic configuration program for vim 安装(github地址:https://github.com/chxuan/vimplus.git, 欢迎star ...

  2. DNS ARP地址解析原理

    ARP是地址解析协议 主机A与主机B之间如果要进行数据间的传输,需要获取对方的IP与物理地址(MAC),在只清楚ip的情况下,主机A向主机B请求链接,会先查找ARP高速缓存表,是否存在对应的主机B的i ...

  3. 基于tomcat集群做session共享

    前端代理服务器nginx:192.168.223.136 tomcat服务器:采用的一台多实例192.168.223.146:8081,192.168.223.146:8082(如何构建多实例tomc ...

  4. Spring Boot 之restful风格

    步骤一:restful风格是什么? 我们知道在做web开发的过程中,method常用的值是get和post.可事实上,method值还可以是put和delete等等其他值. 既然method值如此丰富 ...

  5. ubuntu安装python MySQLdb模块

    本文讲述了python安装mysql-python的方法.分享给大家供大家参考,具体如下: ubuntu 系统下进行的操作 首先安装了pip工具 ? 1 sudo apt-get install py ...

  6. 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛-A banana·

    2017-09-09 16:41:28 writer:pprp 题意很好理解就不说了,实现比较清晰,选择邻接表来做 但是我用的是链表来实现的,所以导致出现了很多问题,最后卡的最长时间的一个问题是 应该 ...

  7. gcc编译出错---make[5]: *** [s-attrtab] Killed

    内存不足导致的编译出错,解决方法是增加swapfile. root@ubuntu:home# swapon -s Filename    Type            Size    Used    ...

  8. Extjs前端框架解决了什么问题

    Extjs 作为一套企业级富客户端前端开发框架,主要解决了以下问题: 1.DOM Ext.Element: Ext.Element.get()快捷方式Ext.get(),只能以dom的id作为参数去获 ...

  9. 最新版本的Struts2+Spring4+Hibernate4三大框架整合(截止2014-10-15,提供源码下载)

    一. 项目名称:S2316S411H436 项目原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6 + Quartz2.2.1 源代码下载地址: 基本版:ht ...

  10. centos下搭建DNS

    一.DNS名词介绍: ( Domain Name System )是“域名系统”的英文缩写 正向解析:通过域名查找IP 反向解析:通过IP查找域名 二.安装BIND: BIND即Berkeley In ...