如何解决java.sql.Statement无法处理特殊字符以及容易被黑问题
2017-07-30 14:22
891 查看
知识点:展示java.sql.Statement 有两个缺陷,解决方法
第一个:展示Statement的缺陷1(测试数据:1003 换行 a’s) –即若用户输入sql中的特殊字符则程序会挂)
结果失败 含有特殊符号的书名添加失败~
我们输入的SQL语句
第二个:展示Statement的缺陷2(测试数据:aa’ or ‘1’=’1) –即若用户输入sql中的特殊字符则程序会黑进)
结果 数据库不存在的用户登录进去了。
如何解决? 用java.sql.PreparedStatement;
使用方法如下
数据库内部添加特殊字符书名成功
防黑缺陷解决
第一个:展示Statement的缺陷1(测试数据:1003 换行 a’s) –即若用户输入sql中的特殊字符则程序会挂)
public void dem04() throws Exception{ Connection con = ConnUtils.getConnection(); Statement st = con.createStatement(); // 假设书名含有特殊符号 ' Statement将无法处理~ String name = "a's"; String sql_insert = "insert into book(name,price,birth) values('"+name+"','105.3','1883-5-6 13:11:11');"; System.out.println(sql_insert); int n = st.executeUpdate(sql_insert); con.close(); }
结果失败 含有特殊符号的书名添加失败~
我们输入的SQL语句
第二个:展示Statement的缺陷2(测试数据:aa’ or ‘1’=’1) –即若用户输入sql中的特殊字符则程序会黑进)
public void dem05() throws Exception{ Connection con = ConnUtils.getConnection(); Statement st = con.createStatement(); // 假设书名含有特殊符号 ' Statement将无法处理~ String name = "aa' or '1'='1"; String sql = "select count(*) from stud where sname='"+name+"'"; System.out.println("实际的SQL语句:"+sql); ResultSet rs = st.executeQuery(sql); rs.next(); int a = rs.getInt(1); if(a==0){ System.out.println("登陆失败!!"); }else{ System.out.println("登录成功!!"); } con.close(); }
结果 数据库不存在的用户登录进去了。
如何解决? 用java.sql.PreparedStatement;
使用方法如下
// 当用户数入的参数时,一定要通过预处理(PreparedStatement)防黑和防止特殊字符 @Test public void demo6() throws Exception{ Connection con = ConnUtils.getConnection(); // String sql_insert = "insert into book(name,price,birth) values('"+name+"','105.3','1883-5-6 13:11:11');"; String sql = "insert into book(name,price,birth) values(?,?,?);"; PreparedStatement pst = con.prepareStatement(sql); //含有特殊字符的书名 String name = "a's"; String price = "37.5"; String birth = "1783-5-6 13:31:11"; //设置三个? (参数) pst.setString(1, name); pst.setString(2, price); pst.setString(3, birth); // 执行的时候不需要再给参数。 pst.execute(); con.close(); }
数据库内部添加特殊字符书名成功
防黑缺陷解决
@Test //同时展示Statement的缺陷2(测试数据:aa' or '1'='1) --即若用户输入sql中的特殊字符则程序会黑进) public void demo7() throws Exception{ Connection con = ConnUtils.getConnection(); String sql = "select count(*) from stud where sname=?"; // Statement st = con.createStatement(); PreparedStatement pst = con.prepareStatement(sql); // 假设书名含有特殊符号 ' Statement将无法处理~ String name = "aa' or '1'='1"; pst.setString(1, name); //执行时不要再给参数了,否则就调用调用 statement的方法了 ResultSet rs = pst.executeQuery(); rs.next(); int a = rs.getInt(1); if(a==0){ System.out.println("登陆失败!!"); }else{ System.out.println("登录成功!!"); } con.close(); }
相关文章推荐
- 关于如何处理JSONObject.fromObject(Object obj)无法转换特殊日期(java.sql.Date,java.sql.Timestamp)格式的问题。
- 关于如何处理JSONObject.fromObject(Object obj)无法转换特殊日期(java.sql.Date,java.sql.Timestamp)格式的问题。
- JAVA中无法处理带有特殊字符文件名的zip包的问题解决
- java格式化字符串,在指定位置插入指定字符串,兼容中英文以及特殊字符,例如:换行,用于解决生成pdf换行问题等问题
- 静态页面如何接收参数以及解决特殊字符的编码问题
- java格式化字符串,在指定位置插入指定字符串,兼容中英文以及特殊字符,例如:换行,用于解决生成pdf换行问题等问题
- 如何解决在.Net中用Sql语句向SqlServer数据库中插入特殊字符失败的问题?
- 如何解决maven搭建项目的时候,src/main/java无法建立的问题,提示信息The folder is already a source folder.(文件夹已经是源文件夹。)
- Java正则表达式特殊字符及其处理以及正则表达式详解
- PHP处理中文字符串中的特殊字符解决Oracle插入报错的问题
- 如何解决SQL Server 2005无法重装问题 MicrosoftSQLNativeClient Sqlncli.msi
- oracle xe client 如何设置 tnsnames.ora(解决无法使用pl/sql developer的问题)
- SSH中对AJAX的处理无法解决跳转的问题(其实是STRUTS2对AJAX的特殊拦截)
- Jps介绍以及解决jps无法查看某个已经启动的java进程问题
- java导入excel出现特殊字符问题解决
- SQL SERVER Mainenance Plans 无法启动的原因,以及如何解决
- 特殊字符变乱码问题如何解决呢?
- (转)Jps介绍以及解决jps无法查看某个已经启动的java进程问题
- 如何解决XML文件中特殊字符“& <”导致解析错误的问题
- 如何解决XML文件中特殊字符“& <”导致解析错误的问题