多语言展示
当前在线:746今日阅读:167今日分享:16

在web开发中如何避免sql注入

SQL全称是“结构化查询语言(Structured Query Language)”,最早的是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易 学,所以自从IBM公司1981年推出以来,SQL语言,得到了广泛的应用。如今无论是像Oracle ,Sybase,Informix,SQL server这些大型的数据库管理系统,还是像Visual Foxporo,PowerBuilder这些微机上常用的数据库开发系统,都支持SQL语言作为查询语言。
工具/原料
1

电脑

2

myeclipse

3

mysql和mysql图形界面工具Navicat for MySQL

方法/步骤
1

第一步:sql注入产生原因。1、说起sql注入就要说一下java与数据库连接的问题那就是java.sql.Statement对象;2、java.sql.Statement对象执行的是拼接的sql也就是说它直接执行sql。此时当你传入的参数是一个sql语句的时候就会造成sql操作安全问题。如下图:不管入参是什么它都会将其当做一个语句执行3、也是用户web前台输入的参数未限制。

2

第二步:创建表和自段。1、创建一个库如果已经存放用已有的也可以2、创建一个表test字段如下图所示;

3

第三步:问题演示。1、创建一个javaweb工程。2、引入mysql数据库驱动包3、编写代码3.1编写数据库连接3.2 编写测试代码(使用更新删除或者其它注入危害为更大,如在后面拼接一条删除语句)public static void testStatement(){ String name = ''zhan'  or 1=1'; String sql = 'select * from test where name = '+name;   Connection conn = getConnection(); try { st = conn.createStatement(); ResultSet rs = st.executeQuery(sql); while(rs.next()){                System.out.println('id:'+rs.getString('id')+' name:'+rs.getString('name')+' age'+rs.getString('age')+' sex:'+rs.getString('name'));            } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }3.3 main方法调用查询

4

第三步:使用PreparedStatement。1、总结第一次出现本不应该查出数据却获得所有数据的原因是Statement对象会将整个sql当作原生语句执行它没有区分变量和sql的能力。2、借助于java.sql.PreparedStatement填充变量,其会将变量当做值去执行sql,而不会将其当做sql执行,并且有预编译功能查询效率更高。public static void testPreparedStatement(){ String name = ''zhan'  or 1=1'; String sql = 'select * from test where name = ?';   Connection conn = getConnection(); try { pst = conn.prepareStatement(sql); pst.setObject(1, name);   ResultSet rs = pst.executeQuery();   while(rs.next()){                System.out.println('id:'+rs.getString('id')+' name:'+rs.getString('name')+' age'+rs.getString('age')+' sex:'+rs.getString('name'));            } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }3、执行测试,查询结果为空

5

第三步:查询之前校验数据。1、web前端使用js的正则表达式在前台文本中做输入校验2、在java后台做输入校验,如使用过滤器统一校验。或者自己单独在controller中校验。

推荐信息