什么是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原来要表达的意思