我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么才能有效防止SQL注入

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么才能有效防止SQL注入

这篇文章主要为大家展示了“怎么才能有效防止SQL注入”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么才能有效防止SQL注入”这篇文章吧。

sql注入入门

SQL 注入是一类危害极大的攻击形式。虽然危害很大,但是防御却远远没有XSS那么困难。

SQL 注入漏洞存在的原因,就是拼接 SQL 参数。也就是将用于输入的查询参数,直接拼接在 SQL 语句中,导致了SQL 注入漏洞。

演示下经典的SQL注入

怎么才能有效防止SQL注入

我们看到:select id,no from user where id=2;

如果该语句是通过sql字符串拼接得到的,比如: String sql = "select id,no from user where id=" + id;

其中的 id 是一个用户输入的参数,那么,如果用户输入的是 2, 那么上面看到查到了一条数据,如果用户输入的是 2 or 1=1 进行sql注入攻击, 那么看到,上面的语句(select id,no from user where id=2 or 1=1; )将user表中的所有记录都查出来了。 这就是典型的sql注入。

再看一列:

怎么才能有效防止SQL注入

我们看到通过 sql 注入能够直接将表 sqlinject 删除掉!可见其危害!

SQL注入攻击的总体思路

      1、寻找到SQL注入的位置

      2、判断服务器类型和后台数据库类型

      3、针对不通的服务器和数据库特点进行SQL注入攻击

SQL注入攻击实例

比如在一个登录界面,要求输入用户名和密码:

可以这样输入实现免帐号登录:

用户名: ‘or 1 = 1 –

密 码:点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)

这是为什么呢? 下面我们分析一下:

从理论上说,后台认证程序中会有如下的SQL语句:

String sql = "select * from user_table where username=' "+userName+" ' and password=' "+password+" '";

当输入了上面的用户名和密码,上面的SQL语句变成:

SELECT * FROM user_table WHERE username=''or 1 = 1 -- and password=''

分析SQL语句:

条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;

然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。

这还是比较温柔的,如果是执行

SELECT * FROM user_table WHERE username='' ;DROP DATABASE (DB Name) --' and password=''

….其后果可想而知…

应对方法

下面我针对JSP,说一下应对方法:

1.(简单又有效的方法)PreparedStatement

采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。

使用好处:

     (1).代码的可读性和可维护性.

     (2).PreparedStatement尽最大可能提高性能.

     (3).最重要的一点是极大地提高了安全性.

原理:

sql注入只对sql语句的准备(编译)过程有破坏作用

而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,

而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.

2.使用正则表达式过滤传入的参数

要引入的包:

import java.util.regex.*;

正则表达式:

private String CHECKSQL = “^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$”;

判断是否匹配:

Pattern.matches(CHECKSQL,targerStr);

下面是具体的正则表达式:

检测SQL meta-characters的正则表达式 : /(\%27)|(\')|(\-\-)|(\%23)|(#)/ix

修正检测SQL meta-characters的正则表达式 : /((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-)|(\%3B)|(:))/i

典型的SQL 注入攻击的正则表达式 : /\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix

检测SQL注入,UNION查询关键字的正则表达式 : /((\%27)|(\'))union/ix(\%27)|(\')

检测MS SQL Server SQL注入攻击的正则表达式: /exec(\s|\+)+(s|x)p\w+/ix

等等…..

3.字符串过滤

比较通用的一个方法:

(||之间的参数可以根据自己程序的需要添加)

public static boolean sql_inj(String str){

String inj_str = "'|and|exec|insert|select|delete|update|

count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";

String inj_stra[] = split(inj_str,"|");

for (int i=0 ; i < inj_stra.length ; i++ ){

if (str.indexOf(inj_stra[i])>=0){

return true;

}

}

return false;

}

4.jsp中调用该函数检查是否包函非法字符

防止SQL从URL注入:

sql_inj.java代码:

package sql_inj;

import java.net.*;

import java.io.*;

import java.sql.*;

import java.text.*;

import java.lang.String;

public class sql_inj{

public static boolean sql_inj(String str){

String inj_str = "'|and|exec|insert|select|delete|update|

count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";

//这里的东西还可以自己添加

String[] inj_stra=inj_str.split("\\|");

for (int i=0 ; i < inj_stra.length ; i++ ){

if (str.indexOf(inj_stra[i])>=0){

return true;

}

}

return false;

}

}

5.JSP页面判断代码:

使用javascript在客户端进行不安全字符屏蔽

功能介绍:检查是否含有”‘”,”\\”,”/”

参数说明:要检查的字符串

返回值:0:是1:不是

函数名是

function check(a){

return 1;

fibdn = new Array (”‘” ,”\\”,”/”);

i=fibdn.length;

j=a.length;

for (ii=0; ii<i; ii++)

{ for (jj=0; jj<j; jj++)

{ temp1=a.charAt(jj);

temp2=fibdn[ii];

if (tem'; p1==temp2)

{ return 0; }

}

}

return 1;

}

总的说来,防范一般的SQL注入只要在代码规范上下点功夫就可以了。

凡涉及到执行的SQL中有变量时,用JDBC(或者其他数据持久层)提供的如:PreparedStatement就可以 ,切记不要用拼接字符串的方法就可以了。

以上是“怎么才能有效防止SQL注入”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么才能有效防止SQL注入

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么有效防止sql注入

这期内容当中小编将会给大家带来有关怎么有效防止sql注入,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一 背景数据如下:本系统采用mysql做为数据库,使用Jdbc来进行数据库的相关操作。系统提供了一个功
2023-06-15

golang怎么防止sql注入

防止SQL注入:Go语言中的最佳实践SQL注入是一种严重的网络安全漏洞,可导致未经授权的数据访问和系统危害。在Go语言中防止SQL注入的最佳实践包括:使用预处理语句或类型化占位符转义特殊字符验证用户输入使用安全库限制数据库访问权限持续监控和更新通过遵循这些做法,Go语言开发人员可以有效地保护其应用程序免受SQL注入攻击。
golang怎么防止sql注入
2024-04-12

golang怎么防止sql注入

在Go语言中,可以使用参数化查询或预编译语句来防止SQL注入。1. 参数化查询:使用占位符来代替实际的参数值,然后将参数值作为参数传递给查询语句。这样可以确保参数值被正确地转义,从而防止SQL注入。示例代码:```gostmt, err :
2023-09-17

laravel怎么防止sql注入

这篇文章主要介绍“laravel怎么防止sql注入”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“laravel怎么防止sql注入”文章能帮助大家解决问题。当你使用Eloquent查询时,如:User
2023-07-04

mysql怎么防止sql注入

要防止SQL注入,可以采取以下措施:1. 使用参数化查询或预编译语句:通过将用户输入的值作为参数传递给查询语句,而不是将其直接拼接到查询语句中,可以有效防止SQL注入攻击。例如,在使用MySQL的PHP代码中,可以使用预编译语句来执行查询,
2023-08-23

Tomcat中怎么防止SQL注入

使用预编译语句:不要直接拼接SQL语句,而是使用预编译语句,如PreparedStatement,可以将参数传递给SQL语句,而不是直接拼接到SQL语句中。使用参数化查询:使用参数化查询可以有效防止SQL注入攻击。确保用户输入的数据不会被当
Tomcat中怎么防止SQL注入
2024-04-25

sql注入漏洞怎样防止

为了防止 sql 注入漏洞,组织应采取以下步骤:使用参数化查询替换敏感数据。验证数据输入的格式和字符。限制用户输入的字符列表。转义特殊字符以避免被解释为 sql 命令。使用预编译的存储过程来提高安全性。集成安全框架以保护应用程序。定期更新软
sql注入漏洞怎样防止
2024-06-17

编程热搜

目录