mysql中,使用存储过程,动态执行sql语句,可以防止sql注入。

一、基本原理

二、优化使用

注意:其中@sqlstr、@sqlargs属于用户变量,当用户退出后消失,

-- sql语句的动态执行,可以防止sql注入,

-- 原理---------------------------------------------
delimiter \\
drop procedure if exists proc_sql \\
create procedure proc_sql()
begin
    declare p1 int;
    set p1=4;
    set @p=p1;
    
-- 预编译
    prepare prod from 'select * from woman where nid>?';
-- 指定参数
    execute prod using @p;
-- 删除预编译
    deallocate prepare prod;
end \\
delimiter;

call proc_sql();

-- 优化------------------------------------------------
delimiter \\
drop procedure if exists proc_sql \\
create procedure proc_sql(
    in sql_str varchar(128),
    in nid int
)
begin
    set @sqlstr=sql_str;
    set @sqlargs=nid;

    prepare prod from @sqlstr;
    execute prod using @sqlargs;
    deallocate prepare prod;
end \\
delimiter;

call proc_sql('select * from woman where nid>?',2);
存储过程动态执行sql语句