zoukankan      html  css  js  c++  java
  • 第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:UsersAdministratorDesktop	est.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, '小黑')
  • 相关阅读:
    Python——协程
    Linux——raid介绍
    Linux——网关介绍
    Linux——inode节点介绍
    算法:排序加二分查找
    Mysql主从复制作用和工作原理详解
    Selenium中错误:selenium.common.exceptions.ElementClickInterceptedException: Message: element click inte
    redis.exceptions.DataError: Invalid input of type: 'dict'. Convert to a byte, string or number first
    Python之requests错误Expecting value: line 1 column 1 (char 0)
    简述cookies和session的区别
  • 原文地址:https://www.cnblogs.com/qiezizi/p/8406907.html
Copyright © 2011-2022 走看看