SQL注入的终焉

admin 2023年2月9日09:47:34评论74 views字数 1006阅读3分21秒阅读模式

SQL注入的终焉

SQL注入漏洞成因

  • 用户能控制传参

  • SQL语句中拼接了用户传参的内容、

  • 拼接后的SQL语句必须等在数据库中方执行

什么是预编译?

  1. 普通的SQL语句执行过程:

    1. 客户端对SQL语句进行占位符替换得到完整的SQL语句

    2. 客户端发送完整SQL语句到MySQL服务端

    3. MySQL服务端执行完整的SQL语句并将结果返回给客户端

    4. 一次编译,单次运行,此类普通语句被称作 Immediate Statements (即时 SQL)

    5. SQL注入的终焉


  2. 预编译执行过程:

    1. 把SQL语句分成两部分,命令部分与数据部分

    2. 先把命令部分发送给MySQL服务端,MySQL服务端进行SQL预编译

    3. 然后把数据部分发送给MySQL服务端,MySQL服务端对SQL语句进行占位符替换

    4. MySQL服务端执行完整的SQL语句并将结果返回给客户端  

    5. 所谓预编译语句就是将此类 SQL 语句中的值用占位符替代,可以视为将 SQL 语句模板化或者说参数 化,一般称这类语句叫Prepared Statements

    6. SQL注入的终焉


预编译的好处

  1. 优化MySQL服务器重复执行SQL的方法,可以提升服务器性能,提前让服务器编译,一次编 译多次执行,节省后续编译的成本  

  2. 避免SQL注入  

预编译如何设置

  • 定义预编译语句

    • PREPARE stmt_name FROM preparable_stmt;

  • 执行预编译语句

    • EXECUTE stmt_name [USING @var_name [, @var_name] ...];

  • 删除(释放)定义

    • {DEALLOCATE | DROP} PREPARE stmt_name;

use sql_inject;
prepare select_content from 'select id,name,content,released from products where
category = ? and released = ?';      #select_content可以理解为变量名
                                    #单引号内的为模板
set @a='Gifts'                       #设置两个变量
set @b=0
execute select_content using @a,@b;   #在select_content变量模板中依次填入a,b的值



Q:可能有人疑惑最终运行的代码还是拼接后的sql语句,为何能避免SQL注入
A:只对模板进行了编译,用户传的参数,不会进行编译,导致参数中sql语句不会执行
  • 文章图片摘自互联网,如有侵权,速删



原文始发于微信公众号(乌托邦安全团队):SQL注入的终焉

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年2月9日09:47:34
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   SQL注入的终焉http://cn-sec.com/archives/1283865.html

发表评论

匿名网友 填写信息