1021上课演练----SQL注入与避免(银行系统)

package com.bank;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;

//封装银行卡数据库操作类
public class CardDAO
{

	//添加卡
	//返回卡号
	public String addCard (String userid,String username,String password)
	{
		String rtn=null;
		//生成卡号

		String cardid =(int)(Math.random()*1000000)+"";
		try
		{
		//保存数据
		//1.加载驱动
		Class.forName("oracle.jdbc.driver.OracleDriver");

		//2.获得连接
		Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "test0816", "123456");
		//3.创建声明
		Statement st=conn.createStatement();
		//4.执行语句
		String sql ="insert into t_bankcard (cardid,user_id,user_name,password,times)"
				+" values(‘"+cardid+"‘,‘"+userid+"‘,‘"+username+"‘,‘"+password+"‘,sysdate)";
		if(st.executeUpdate(sql)==1)
		{
			rtn=cardid;
		}

		//5.释放资源
		st.close();
		conn.close();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		return rtn;
	}

	//修改余额
	//可以完成取款和存款的功能
	//卡号,余额
	public boolean updateBalance(String cardid,double yue) throws Exception
	{
		boolean rtn =false;
		//验证余额
		if(yue<0)
		{
			throw new Exception("余额数据异常");
		}
		try
		{

		//保存数据
		//1.加载驱动
		Class.forName("oracle.jdbc.driver.OracleDriver");

		//2.获得连接
		Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "test0816", "123456");
		//3.创建声明
		Statement st=conn.createStatement();
		//4.执行语句
		String sql ="update t_bankcard set yue= "
				+yue+"where cardid=‘"+cardid+"‘";

			rtn=st.executeUpdate(sql)==1;

		//5.释放资源
		st.close();
		conn.close();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		return rtn;
	}

	//登入
	//登入
	public boolean login(String cardid,String password)
	{
		boolean rtn=false;
		try{
			//保存数据
			//1.加载驱动
			Class.forName("oracle.jdbc.driver.OracleDriver");
			//2.获得链接
			Connection conn=DriverManager.
					getConnection("jdbc:oracle:thin:@localhost:1521:orcl","test0816","123456");

			//3.创建声明
			Statement st=conn.createStatement();
			//4.执行语句
			//这种方式会造成SQL注入
			String sql="select * from t_bankcard where cardid=‘"+cardid
					 +"‘"+"and password=‘"+password+"‘";
			//遍历结果集
			ResultSet rs=st.executeQuery(sql);
			rtn=rs.next();
			//5.释放资源
			st.close();
			conn.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		return rtn;
	}

		//验证登录

		public boolean login2 (String cardid,String password)
		{
			boolean rtn =false;

			try
			{
				Class.forName("oracle.jdbc.driver.OracleDriver");

				Connection conn=DriverManager.getConnection(
						"jdbc:oracle:thin:@127.0.0.1:1521:orcl",
						"test0816", "123456");
				//带有?占位符的语句
				String sql= "select * from t_bankcard where "
						+ "cardid=? and"
						+ " password=? and state=?";
				//预编译的声明
				//优点:1.执行效率高
				//2.避免SQL注入
				PreparedStatement ps= conn.prepareStatement(sql);
				//替换占位符
				ps.setString(1, cardid);
				ps.setString(2, password);
				ps.setString(3, "1");

				//查询结果集
				ResultSet rs = ps.executeQuery();
				rtn=rs.next();//如果有数据就验证通过

				//调用存储过程
				//不怎么用
				//CallableStatement cs=conn.prepareCall("{call存储过程(?,?)}");

				//获得数据库的元数据
				DatabaseMetaData dmd= conn.getMetaData();
				System.out.println(dmd.getURL());
				System.out.println("getUserName()"+dmd.getUserName());
				System.out.println("getDatabaseProductName="+dmd.getDatabaseProductName());

				//结果集的元数据
				ResultSetMetaData rsmd= rs.getMetaData();

				System.out.println("getColumnCount="+rsmd.getColumnCount());
				System.out.println("getColumnName="+rsmd.getColumnName(1));

				rs.close();
				conn.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}

			return rtn;
		}
	//查询

}

  

package com.bank;

import static org.junit.Assert.*;

public class Test {

	@org.junit.Test
	public void testInsert()
	{

		//测试发卡
		CardDAO cd =new CardDAO ();
		String cardid=cd.addCard("1234567890", "张三", "123456");
		if(cardid !=null)
		{
			System.out.println("发卡成功"+cardid);
		}
		else
		{
			System.out.println("发卡失败");
		}
	}

	//测试修改余额
	@org.junit.Test
	public void  testEdit()
	{
		CardDAO cd =new CardDAO ();
		boolean b=false;
		 try
		 {

			 b=cd.updateBalance("148102", 100);
		}
		 catch (Exception e)
		 {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		if(b)
		{
			System.out.println("修改余额成功");
		}
		else
		{
			System.out.println("修改余额失败");
		}
	}

	//登入
	@org.junit.Test
	public void testLogin()
	{
		CardDAO cd=new CardDAO();
		if(cd.login("‘or 1=1--","14"))//SQL注入

		{
			System.out.println("登陆成功");
		}
		else{
			System.out.println("登录失败");
		}
	}

	@org.junit.Test
	//避免SQL注入的测试登入
	public void testLogin2()
	{
		CardDAO cd=new CardDAO();
		if(cd.login2("148102","123456"))
		{
			System.out.println("登陆成功");
		}
		else{
			System.out.println("登录失败");
		}
	}

}

  

时间: 2024-07-30 15:05:34

1021上课演练----SQL注入与避免(银行系统)的相关文章

动态分析小示例| 08CMS SQL 注入分析

i春秋作家:yanzm 0×00 背景 本周,拿到一个源码素材是08cms的,这个源码在官网中没有开源下载,需要进行购买,由某师傅提供的,审计的时候发现这个CMS数据传递比较复杂,使用静态分析的方式不好操作,刚好这周小三上位(换了新电脑),就直接安装下phpstorm+xdebug+xdebug-ext(火狐)进行动态分析,本篇主要是以SQL注入漏洞为例子,进行动态分析的演练,当然源码还有其他漏洞待挖掘,期待师傅们一起交流讨论. 0×01 审计过程 动态分析环境配置 动态分析组合:phpstor

WAF——针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入、XSS跨站、Webshell上传、命令注入、非法HTTP协议请求、非授权文件访问等

核心概念 WAF Web应用防火墙(Web Application Firewall),简称WAF. Web攻击 针对Web应用发起的攻击,包括但不限于以下攻击类型:SQL注入.XSS跨站.Webshell上传.命令注入.非法HTTP协议请求.非授权文件访问等.

sql注入初中高学习

以下三篇文件关于SQL注入写的很通俗易懂,整理收藏下 渗透攻防Web篇-SQL注入攻击初级: http://bbs.ichunqiu.com/thread-9518-1-1.html 渗透攻防Web篇-SQL注入攻击中级: http://bbs.ichunqiu.com/thread-9668-1-1.html 渗透攻防Web篇-SQL注入攻击高级: http://bbs.ichunqiu.com/thread-10093-1-1.html

php中防止SQL注入的方法

[一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最主要就是要配置php.ini中的内容,让我们执行 php能够更安全.整个PHP中的安全设置主要是为了防止phpshell和SQL Injection的攻击,一下我们慢慢探讨.我们先使用任何编辑工具打开 /etc/local/apache2/conf/php.ini,如果你是采用其他方式安装,配置文件

sql注入总结

本实验测试是基于sqli-labs的实验环境 环境配置:php+mysql 环境搭建请参考 http://www.freebuf.com/articles/web/34619.html Sql注入定义: 就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行的sql命令的目的 sql注入分类: 基于联合查询 基于错误回显 基于盲注,分时间盲注和布尔型的盲注 基于user-agent 基于feferer 基于cookie 二次注入 宽字节注入 注入一个网站

SQL注入解决思路(C#示例)

最近在编程中遇到一个SQL注入防护的问题.在这里顺便把SQL注入小结一下.以MYSQL(5.1)为例. 一.常规的SQL语句 观察SQL语句 SELECT * FROM [tableName] WHERE col1='value1' 这个语句由3个部分组成,SELECT子句筛选得到结果,FROM子句指定了筛选的范围,WHERE子句指定了条件.当在其中进行如下置换: SELECT * FROM [tableName] WHERE 1 之后,选出了[tableName]表中的全部内容.分析其语法不难

微擎SQL注入漏洞

漏洞名称:微擎SQL注入漏洞 补丁文件:/web/source/mc/card.ctrl.php 补丁来源:阿里云云盾自研 漏洞描述:微擎CMS的/web/source/mc/card.ctrl.php中,对cardid输入参数未进行严格类型转义,导致SQL注入的发生 解决方法 搜索代码 if ($do == 'manage') 如下图: 在 201 行 前添加代码 $_GPC['cardid'] = intval($_GPC['cardid']); 修改后如图: 补丁文件:/web/sourc

SQL注入之SQLmap入门

什么是SQLmap? SQLmap是一款用来检测与利用SQL注入漏洞的免费开源工具,有一个非常棒的特性,即对检测与利用的自动化处理(数据库指纹.访问底层文件系统.执行命令). 读者可以通过位于SourceForge的官方网站下载SQLmap源码:http://sourceforge.net/projects/sqlmap/ SQLmap的作者是谁? Bernardo DameleAssumpcao Guimaraes (@inquisb),读者可以通过[email protected]与他取得联

PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析

catalog 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/phpcms_v9/index.php?m=member&c=index&a=login dosubmit=1&username=phpcms&password=123456%26username%3d%2527%2bunion%2bselect%2b%25272%2