JDBC和MyBatis防止SQL注入攻击的原理

JDBC 的 PrepareStatement 可以阻止 SQL 注入攻击,MyBatis 之类的 ORM 框架也可以阻止 SQL 注入,如何实现的?
因为SQL语句在程序运行前已经进行了预编译,在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,对应的执行计划也会缓存下来并允许数据库已参数化的形式进行查询,当运行时动态地把参数传给PreprareStatement时,即使参数里有敏感字符如 or '1=1’也数据库会作为一个参数一个字段的属性值来处理而不会作为一个SQL指令,如此,就起到了SQL注入的作用了

如果用statement jdbc会简单拼接字符串然后作为sql执行
preparedstatement就会进行预编译 对其中的换行符等字符做转义 对注入的sql会起到混淆的作用
mybatis这些orm框架也是基于preparedstatement mybatis尽量使用#占位符

你可能感兴趣的:(MySQL,sql,注入)