防范sql注入的方法

鲨掉东西   ·   发表于 2020-04-28 15:08:48   ·   技术文章

sql注入攻击的防范

注入攻击产生的关键在于系统对用户输入处理不当,未做到数据与代码分离,从而导致输入的数据被当作代码执行。
在系统开发时,只要遵循数据与代码分离的原则,并且完全做到这点。注入漏洞是完全可以彻底避免的。

下面就写一些积累的防范方法。鄙人技术不够,具体的代码写不出来,见谅。

方法之一:使用预编译语句

sql 预编译指的是数据库驱动在发送 sql 语句和参数给 DBMS(数据库管理系统) 之前对 sql 语句进行编译,这样 DBMS 执行 sql语句 时,就不需要重新编译。
预编译阶段可以优化 sql 的执行。预编译语句对象也可以重复利用。
防御SQL注入的关键是使用预编译的SQL语句,实现对变量的绑定
同时SQL语句的语义不会发生改变。使用预编译后的SOL语句,攻击者无法改变SQL的结构,
即使插入非法的数据。预编译后的SQL语句也不会将其当作代码去执行。

举例 sql String sql = "select id,username from user where id=?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1, id); ps.executeQuery();
其原因就是:采用了PreparedStatement,就会将sql语句:”select id, no from user where id=?” 预先编译好,也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的语法结构了,因为语法分析已经完成了,而语法分析主要是分析sql命令,比如 select ,from ,where ,and, or ,order by 等等。所以即使你后面输入了这些sql命令,也不会被当成sql命令来执行了,因为这些sql命令的执行, 必须先的通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为sql命令来执行的,只会被当做字符串字面值参数。所以sql语句预编译可以防御sql注入。

方法之二:转义输出

当数据库对用户在客户端的输入字符或语句不加限制的读取到并执行时,就产生了sql注入漏洞,自然的当数据库对客户端的输入进行了相关的限制和过滤后,sql注入的风险会大大降低。

过滤输入 利用php自带的str_repalce函数,进行过滤
例如 str_replace(“‘“,” “,”$_POST[‘username’]”) ,这是把post提交的username中的单引号替换为空格。
将敏感的字符都进行转义,可以一定程度上减少被攻击的可能。
php的mysqli_real_escape_string()函数也可以进行自定义的转义。

此外,php中的addslashes()函数,类似于魔术引号,可以对传入的单双引号、反斜杠前面加反斜杠进行字符串转义。但是我们有几率可以通过宽字节注入绕过。这里就不举例子了。

方法三:使用相应的安全设备,例如防火墙,著名的阿里云盾等

网路层面
1.通过WAF设备启用防SQL Inject注入策略(或类似防护系统)
2.云端防护( 360网站卫士,阿里云盾等)

用户名金币积分时间理由
奖励系统 50.00 0 2020-04-29 15:03:56 投稿满 5 赞奖励
admin 100.00 0 2020-04-29 14:02:16 首次投稿奖励!

打赏我,让我更有动力~

0 条回复   |  直到 2020-4-28 | 1099 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.