什么是sql注入,如何防治

什么是SQL注入:就是通过入参将非法sql语句植入到原本sql的入参里,改变了原有sql的表达,从而达到自己的目的。

什么意思呢,比如 

select * from usertab where name = ${}  --->> "张三"

原本我们只想通过“入参”来查询name为“张三”人的信息,但是如果我们将“入参”改为“张三 or name != '张三' ”,此时sql执行相当于是

select * from usertab where name = '张三' or name !='张三'

这样其实也就是改变了原有的sql表达,成了查询 usertab 表中的全量数据。

如何防治sql注入:防止sql注入的方法有很多种

1.使用#{}来代替${}.  因为#{}有一个预编译的过程不会直接写入,会将 #{} 变为‘?’ 再传入参数,这样即使入参为“张三 or name != '张三' ” ,其sql也将是

将'张三' or name !='张三'作为一个整体的 neme 来进行查询:

select * from usertab where name = "'张三' or name !='张三'"

这样即使你怎么传入‘非法’sql,也只会查询name为“ '张三' or name !='张三' ”,发现根本查不到。ok,解决。

2.但是这样好的#{}为何还要有${},或者说在某些场景下我们可能非用${}不可,怎么办。

比如我们需要动态的查询表:

select * from ${} where id = 100

对于这样的情况,我们也只能进行一些校验或者指定一些验证方法来解决,比如我们的变化查询的库只有 usertab、product、order 三种表,这样我们在sql查询前先进行验证, 

if(tab.equals(usertab)||tab.equals(product)||tab.equals(order)){
执行sql
}

总之${}的使用一定要慎重,保持原则:不要让入参改变了sql原来要表达的意思

posted @ 2020-09-02 22:46  城北左少爷  阅读(417)  评论(0编辑  收藏  举报