zoukankan      html  css  js  c++  java
  • Python-mysql 权限 pymysql 注入共计

    1.mysql用户管理  ***
    数据安全非常重要 不可能随便分配root账户
    应该按照不同开发岗位分配不同的账户和权限

    mysql中 将于用户相关的数据放在mysql库
    user - > db - > tables_priv -> columns_priv
    如果用户拥有对所有库的访问权 则存储在 user中
    如果用户拥有对部分库的使用权 db
    如果用户拥有对部分表的使用权 tables;
    如果用户拥有对表中某些字段的使用权 columns_priv中

    创建新账户
    create user "账户名"@"主机名" identified by 密码
    create user "tom"@"localhost" identified by "123";

    授予所有数据库所有表的所有权限给jerry这个用户 并允许jerry在任意一台电脑登录
    如果用户不存在会自动创建
    grant all on *.* to "jerry"@"%" identified by "123" with grant option;
    with grant option这个用户可以将拥有的权限授予别人

    授予day45数据库所有表的所有权限给jack这个用户 并允许jerry在任意一台电脑登录
    grant all on day45.* to "jack"@"%" identified by "123";
    授予day45数据库的emp表的所有权限给rose这个用户 并允许jerry在任意一台电脑登录
    grant all on day45.emp to "rose"@"%" identified by "123";
    授予day45数据库的emp表的name字段的查询权限给maria这个用户 并允许jerry在任意一台电脑登录
    grant select(name) on day45.emp to "maria"@"%" identified by "123";

    收回权限
    REVOKE all privileges [column] on db.table from user@"host";

    如何授权就如何收回 因为不同权限信息存到不同的表中
    REVOKE all privileges on day45.emp from maria@"%";

    立即刷新权限信息
    flush privileges;

    # 删除用户
    drop user 用户名@主机
    drop user maria@%

    当你在云服务器部署了 mysql环境时 你的程序无法直接连接到服务器 需要授予在任意一台电脑登录的权限
    grant all on *.* to "jerry"@"%" identified by "123" with grant option;


    MySQL数据备份
    1 使用mysqldump实现逻辑备份
    #语法:
    # mysqldump -h 服务器 -u用户名 -p密码 数据库名 > 备份文件.sql

    #示例:
    #单库备份
    mysqldump -uroot -p123 db1 > db1.sql
    mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql
    #多库备份
    mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql
    #备份所有库
    mysqldump -uroot -p123 --all-databases > all.sql

    2 恢复逻辑备份
    #方法一:
    [root@egon backup]# mysql -uroot -p123 < /backup/all.sql
    #方法二:
    mysql> use db1;
    mysql> SET SQL_LOG_BIN=0;
    mysql> source /root/db1.sql

    #注:如果备份/恢复单个库时,可以修改sql文件
    DROP database if exists school;
    create database school;
    use school;



    2.pymysql ****
    后期开发中都是用框架代替pymysql

    为什么使用pymysql 因为我们需要在程序去连接数据库进行增删改查

    import pymysql
    conn = pymysql.connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    password="123",
    database="1123test",
    charset="utf8"
    )
    # cursor 游标对象 负责执行sql语句 获取返回的数据
    # pymysql.cursors.DictCursor指定使用字典类型的游标 默认是元祖类型
    cursor = conn.cursor(pymysql.cursors.DictCursor)

    sql = "select *from book"

    # 返回值是本次查询的记录条数
    res = cursor.execute(sql) #执行sql
    # print(res)
    # print(cursor.fetchall()) # 提取所有结果
    print(cursor.fetchone())
    print(cursor.fetchone())
    # cursor.scroll(1,mode="absolute") # 游标从开始位置往后移动1条记录
    cursor.scroll(1,mode="relative") # 游标从当前位置往后移动1条记录
    print(cursor.fetchone()) # 提取一条记录
    # print(cursor.fetchone())
    # print(cursor.fetchone())
    # print(cursor.fetchmany(2)) # 提取指定数量记录


    3. sql注入共计
    注意:符号--会注释掉它之后的sql,正确的语法:--后至少有一个任意字符

    根本原理:就根据程序的字符串拼接name='%s',我们输入一个xxx' -- haha,
    用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'

    # 什么是sql注入攻击 一些了解sql语法的攻击者 可以通过一些特殊符号 来修改 sql执行逻辑 达到绕过验证的效果
    # 避免的方式
    1.在输入时加上正则判断 不允许输入与sql相关的关键字 这种方式 无法避免 代理服务器发起的攻击
    2.在服务器端 执行sql前先来一波判断
    # pymysql中已经帮你做了处理 只要将参数的拼接交给pymysql来完成就能够避免攻击
    import pymysql

    conn = pymysql.connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    password="123",
    database="1123test",
    charset="utf8"
    )
    # cursor 游标对象 负责执行sql语句 获取返回的数据
    # pymysql.cursors.DictCursor指定使用字典类型的游标 默认是元祖类型
    cursor = conn.cursor(pymysql.cursors.DictCursor)

    author = input("输入author:")

    page = input("输入page:")


    sql = "select *from book where author = '%s' and page = '%s'" %(author,page)
    # sql = "select *from book where author = %s and page = %s"
    print(sql)
    res = cursor.execute(sql)
    # res = cursor.execute(sql,(author,page))
    if res:
    print("登录成功")
    else:
    print("登录失败")


    4.mysql 增删改

    import pymysql

    conn = pymysql.connect(
    host="127.0.0.1",
    port=3306,
    user="root",
    password="root",
    database="day47",
    charset="utf8"
    )
    # cursor 游标对象 负责执行sql语句 获取返回的数据
    # pymysql.cursors.DictCursor指定使用字典类型的游标 默认是元祖类型
    cursor = conn.cursor(pymysql.cursors.DictCursor)

    # sql = "insert into user values(null,'中狗子','123')"
    sql = "update user set name = '小黄' where name = '中狗子'"
    # sql = "delete from user where name = '大狗子'"

    res = cursor.execute(sql)
    # pymysql不会自动提交 对数据的修改不会持久化 需要手动commit
    conn.commit()
    print(res)


    3.可视化工具navicat *****

    # 什么阶段使用可视化
    # 项目开始前 就应该先设计数据库 如果表很多 就需要使用可视化
    # 最好的功能是ER图 可以直观看出 表与表的关系
    掌握:
    #1. 测试+链接数据库
    #2. 新建库
    #3. 新建表,新增字段+类型+约束
    #4. 设计表:外键
    #5. 新建查询
    #6. 备份库/表

    #注意:
    批量加注释:ctrl+?键
    批量去注释:ctrl+shift+?键

    
    
  • 相关阅读:
    如何快速转载CSDN及博客园中的博客
    Ubuntu18.04连不网 报"有线连接未托管"
    Ubuntu18.04的网络配置
    vim基本操作
    Git更新远程仓库代码到本地(转)
    POJ 3253 Fence Repair
    POJ 2503 Babelfish
    POJ 2002 Squares
    POJ 1840 Eqs
    POJ 3274 Gold Balanced Lineup
  • 原文地址:https://www.cnblogs.com/du-jun/p/10009826.html
Copyright © 2011-2022 走看看