sql注入

Posted 小学生求教

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql注入相关的知识,希望对你有一定的参考价值。

sql注入

  1. 什么是sql注入

    用户提交带有恶意数据与sql语句进行字符串方式的拼接,从而影响了sql语句的语义,最终产生数据泄露的现象

    示例

    # 1. 导包
    import pymysql

    if __name__ == \'__main__\':

       # 2. 创建连接对象
       # connect = Connection = Connect 本质上是一个函数,使用这三个里面的任何一个函数都可以创建一个连接对象
       # 1. host : 服务器的主机地址
       # 2. port: mysql数据库的端口号
       # 3. user: 用户名
       # 4. password:密码
       # 5. database: 操作的数据库
       # 6. charset: 操作数据库使用的编码格式
       conn = pymysql.connect(host="localhost",
                              port=3306,
                              user="root",
                              password="mysql",
                              database="python41",
                              charset="utf8")

       # 3. 获取游标, 目的就是要执行sql语句
       cursor = conn.cursor()
       # 准备sql, 之前在mysql客户端如何编写sql,在python程序里面还怎么编写
       sql = "select * from students where name = \'%s\';" % "黄蓉\' or 1 = 1 or \'"
       print(sql)

       # 4. 执行sql语句
       cursor.execute(sql)

       # 获取查询的结果, 返回的数据类型是一个元组
       # row = cursor.fetchone()
       # print(row)
       # 返回的数据类型是一个元组,其中元组里面的每条数据还是元组
       result = cursor.fetchall()
       for row in result:
           print(row)

       # 5. 关闭游标
       cursor.close()
       # 6. 关闭连接
       conn.close()

     

  2. 如何防止sql注入?

    sql语句参数化

    • sql语言中的参数使用%s来占位,此处不是python中的字符串格式化操作

    • 将sql语句中的%s占位所需要的参数存在一个列表中,把参数列表传递给execute方法中第二个参数

      # 1. 导包
      import pymysql

      if __name__ == \'__main__\':

         # 2. 创建连接对象
         # connect = Connection = Connect 本质上是一个函数,使用这三个里面的任何一个函数都可以创建一个连接对象
         # 1. host : 服务器的主机地址
         # 2. port: mysql数据库的端口号
         # 3. user: 用户名
         # 4. password:密码
         # 5. database: 操作的数据库
         # 6. charset: 操作数据库使用的编码格式
         conn = pymysql.connect(host="localhost",
                                port=3306,
                                user="root",
                                password="mysql",
                                database="python41",
                                charset="utf8")

         # 3. 获取游标, 目的就是要执行sql语句
         cursor = conn.cursor()
         # 准备sql, 使用防止sql注入的sql语句, %s是sql语句的参数和字符串里面的%s不一样,不要加上引号
         sql = "select * from students where name = %s;"
         print(sql)

         # 4. 执行sql语句
         cursor.execute(sql,("黄蓉",))

         # 获取查询的结果, 返回的数据类型是一个元组
         # row = cursor.fetchone()
         # print(row)
         # 返回的数据类型是一个元组,其中元组里面的每条数据还是元组
         result = cursor.fetchall()
         for row in result:
             print(row)

         # 5. 关闭游标
         cursor.close()
         # 6. 关闭连接
         conn.close()
    •  

以上是关于sql注入的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis如何防止SQL注入

MyBatis怎么防止SQL注入

mybatis以及预编译如何防止SQL注入

手机只需发条消息即可开始大规模SQL注入攻击

4个单词,谷歌返回16个SQL注入漏洞

基于约束的SQL攻击