1.检测变量数据的类型和文件格式
如果你的SQL语句类似于whereid={$id}的形式,数据库中的所有id都是数字,则在SQL运行以前,检测变量id是int类型的邮箱,检测变量需要是邮箱的形式,其他类型总而言之,只要有固定文件格式的变量,在SQL句子实施以前,应严格按照固定文件格式进行检测,以确保变量是我们预期的文件格式,从而大大避免SQL注入攻击。例如,在我们以前接受username参数的例子中,我们的产品设计应该是用户注册的最初,有用户名的规则。例如,5-20个字符只能由大小写字符、数字和安全符号构成,不包括特殊字符。这个时候,我们需要有cheak_username的变量来统一化检测。然而,仍有许多例外情况不能应用于这一标准,如文章发布系统、评论系统等。需要允许用户提交任何字符串的场景,这需要过滤等其他方案。
2.过滤特殊符号
没法确认固定文件格式的变量时,需要进行特殊符号的过滤和转义处置。
3、关联变量,应用预编译语句
MySQL的Mysqli驱动器提供了预编译语句的支持,不同的程序语句应用预编译句的方式。实际上,关联变量应用预编译语句是防止SQL注入的最好方式。应用预编译的SQL语句意义不会改变。在SQL语句中,变量应用问号?黑客即使能力更大,也没法改变SQL语言的构造MyBatis框架作为半自动持续层框架,SQL语言需要由我们自己手动制作,这个时候需要防止SQL注入。实际上,MyBatis的SQL是一个具有键入+输出功能的结构,类似于变量,请参考以上两个例子。在其中,evimeterType代表键入的参数类型,rasulttype代表输出的参数类型。回应上述内容,如果我们想防止SQL注入,当然我们需要在键入参数上下功夫。在上面的代码中应用#的是键入参数在SQL中连接的部分,键入参数后,打印运行的SQL语言,可以看出SQL是这样的。
无论键入什么参数,印刷的SQL都是这样。这是由于MyBatis开启了预编译功能,在SQL运行以前,将上述SQL发送给数据库进行编译。运行时,直接应用编译的SQL,更换占位符?就好了。SQL注入只能起到编译过程的作用,所以这种方式很好地避免了SQL注入的问题。基本实现原理MyBatis是怎样编译SQL的?实际上在框架的基本上,JDBC的PraparedStatededuce类发挥作用,PraparedStatededuce是我们熟悉的Statededuce子类,其对象包括编译的SQL语言。这种准备好的方式不仅可以提高安全性,还可以在多次运行同一个SQL时提高效率。原因是SQL已经编译好,再运行时不需要再编译。