JAVA 基础之SQL注入防范

摘要:
和密码=?

java之sql注入漏洞

以及如何防范

所谓SQL注入,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力

首先创建一个数据库工具类

package zr;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class main2
{

public static void main(String[] args)
{
	Scanner sc = new Scanner(System.in);
	System.out.println("请输入用户名");
	String username = sc.nextLine();
	System.out.println("请输入密码");
	String password = sc.nextLine();
	try
	{
		Class.forName("com.mysql.jdbc.Driver");
	} catch (ClassNotFoundException e)
	{
		System.out.println("加载驱动失败"+e.getMessage());
		
	}
	Connection conn = null;
	PreparedStatement ps = null;
	ResultSet rs = null;
	try{
		conn = DriverManager.getConnection("jdbc:mysql://localhost/study1?seUnicode=true&characterEncoding=UTF8", "root", "root");
		String sql = "select count(*) c from T_Users where UserName='"+username+"' and PassWord = '"+password+"'";
		ps = conn.prepareStatement(sql);   
     /*
      * 存在注入漏洞   a' or 'a'='a
      * 需要对其过滤
      */
	        /*String sql ="select count(*) c from T_Users where UserName=? and PassWord =?";
		
		ps = conn.prepareStatement(sql); 
		ps.setString(1, username);
		ps.setString(2, password);*/
		rs = ps.executeQuery();
       rs.next();
       int c = rs.getInt("c");	
       System.out.println(c);
   
		
		
		
		if(c<=0){
    	   System.out.println("登录失败");
    	   
       }
       else{
    	  System.out.println("登陆成功");
       }
	}catch(SQLException ex){
		System.out.println("执行数据库出错"+ ex);
		}
	finally{
			JDBCGB.closeQuiety(ps);
			JDBCGB.closeQuiety(conn);
			JDBCGB.closeQuiety(rs);
		}
		}
	}

然后使用navicat工具在数据库里创建一个账号,再使用上面的代码进行登录

JAVA 基础之SQL注入防范第1张

账号为任意值密码为

 a' or 'a'='a

都可以登录成功原因是因为

JAVA 基础之SQL注入防范第2张

password的值永远为真值

所以where整个的数据也为真

这样就可以成功执行sql语句

 

JAVA 基础之SQL注入防范第3张


需要对sql语句进行过滤

ps = conn.prepareStatement(sql); 
ps.setString(1, username);
ps.setString(2, password);

这里采用的是setstring的方法实现预编译处理

最终提升系统的安全性

免责声明:文章转载自《JAVA 基础之SQL注入防范》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇贷款减值准备和折现回拨springboot+thymeleaf 实现图片文件上传及回显下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

linux 安装nginx

1.检查服务器上是否安装了nginx:nginx v2。查看编译参数:nginxv3。查看安装目录:rpm-qlnginx4。查看配置文件:/etc/logrotate D/nginx5。在安装nginx之前,请确保系统中安装了gcc、pcre-devel、zlib-devel和openssl-devel。5.1如果安装了rpm软件包,您可以使用rpm qa...

关于WINFORM中输入法的设置

关于WINFORM(转移到)John Suna的专栏开发中输入方法的设置,它碰巧遇到了这种问题。网络真的很好:)这是文本集。感谢作者的辛勤工作给您带来的便利。在WINFORM中,我们经常遇到这样的问题:文本输入框中的输入法被禁用或总是更改为全宽输入法。查阅相关数据后,总结如下:(1)Control.ImeMode属性:获取或设置控件的输入方法编辑器模式。此模...

Android 帧动画使用

本文介绍使用AnimationDrawable类来实现动画效果。oneshot="false",表示让动画一直循环播放下去。.backgroundasAnimationDrawableani.start()当动画正在播放时,调用start()方法是不会影响当前播放的。˃android:oneshot="true",动画播放1次后就会自行停止并保持在最后一帧。...

.NET5 ABP框架(一)

授权-ABP可以以声明的方式检查权限。如果发生异常,ABP将自动记录并向客户机返回适当的结果。默认情况下,ABP使用Log4Net写入日志。当然,我们也可以通过修改配置来使用其他日志框架。除了本示例中显示的ABP的优点之外,ABP还提供了一个健壮的基础架构和应用程序模型。...

微信小程序生成带参数的二维码(小程序码)独家asp.net的服务端c#完整代码

1) 我第一次使用wx。小程序端请求调用API,发现这是一个坑!@-_~Page:'pages/index/index',//在此处填写要跳转到的小程序页面。你不能在它前面添加/oh。发布后必须为1024页//小程序代码的边长,以像素为单位,范围[2801280]},标头:{'content-type':“application/json;charset=U...

登陆脚本

#!' num_ count+=1其他:lock_ input(用户名)#############1##########_###!...