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("登录失败");
}
} }

  

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

  1. 【攻防实战】SQL注入演练!

    这篇文章目的是让初学者利用SQL注入技术来解决他们面临的问题, 成功的使用它们,并在这种攻击中保护自己. 1.0 介绍 当一台机器只打开了80端口, 你最依赖的漏洞扫描器也不能返回任何有用的内容, 并 ...

  2. DVWA漏洞演练平台 - SQL注入

    SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,具体来说,它是利用现有应用程序将(恶意的)SQL命令注入到后台数据库引擎执 ...

  3. DAY5 DVWA之SQL注入演练(low)

    1.设置 把安全等级先调整为low,让自己获得点信心,免得一来就被打脸. 2.测试和分析页面的功能       这里有一个输入框 根据上面的提示,输入用户的id.然后我们输入之后,发现它返回了关于这个 ...

  4. DVWA 黑客攻防演练(八)SQL 注入 SQL Injection

    web 程序中离不开数据库,但到今天 SQL注入是一种常见的攻击手段.如今现在一些 orm 框架(Hibernate)或者一些 mapper 框架( iBatis)会对 SQL 有一个更友好的封装,使 ...

  5. DVWA之SQL注入演练(low)

    1.设置 把安全等级先调整为low,让自己获得点信心,免得一来就被打脸. 2.测试和分析页面的功能       这里有一个输入框 根据上面的提示,输入用户的id.然后我们输入之后,发现它返回了关于这个 ...

  6. [SQL注入1]From SQL injection to Shell

    第一次写,希望大神们多指点. 对于刚接触WEB渗透测试这块的朋友们,很希望能有个平台可以练习.网络上有不少,十大渗透测试演练系统,我这里推荐一个在10以外,适合初学者一步一步进步的平台PENTESTE ...

  7. SQL注入关联分析

    在Web攻防中,SQL注入绝对是一个技能的频繁项,为了技术的成熟化.自动化.智能化,我们有必要建立SQL注入与之相关典型技术之间的关联规则.在分析过程中,整个规则均围绕核心词进行直线展开,我们简单称之 ...

  8. 入门级----黑盒测试、白盒测试、手工测试、自动化测试、探索性测试、单元测试、性能测试、数据库性能、压力测试、安全性测试、SQL注入、缓冲区溢出、环境测试

    黑盒测试 黑盒测试把产品软件当成是一个黑箱子,只有出口和入口,测试过程中只要知道往黑盒中输入什么东西,知道黑盒会出来什么结果就可以了,不需要了解黑箱子里面是如果做的. 即测试人员不用费神去理解软件里面 ...

  9. 手工检测SQL注入漏洞

    SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,具体来说,它是利用现有应用程序将(恶意的)SQL命令注入到后台数据库引擎执 ...

随机推荐

  1. Asp.Net MVC中Controller与View之间传递的Model

    Controller --> View 的Model 与 提交表单后 View --> Controller 的Model 不是相同的对象,即:这两个Model为不同的指针,指向不同的地址 ...

  2. 系统剖析Android中的内存泄漏

    [转发]作为Android开发人员,我们或多或少都听说过内存泄漏.那么何为内存泄漏,Android中的内存泄漏又是什么样子的呢,本文将简单概括的进行一些总结. 关于内存泄露的定义,我可以理解成这样 没 ...

  3. Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab

     今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可 ...

  4. 使用lsof查看进程句柄使用情况

    lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more

  5. 第二篇:JMeter实现接口/性能自动化(JMeter/Ant/Jenkins)

    主要是对HTML报告的优化 如果按JMeter默认设置,生成报告如下:

  6. hdu1166 线段树

    Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...

  7. XSS 跨站脚本攻击之构造剖析(二)

    1.利用字符编码 (1)字符编码在跨站脚本中经常运用到,透过这种技巧,不仅能让XSS代码绕过服务端的过滤,还能更好的隐藏ShellCode (2)使用一个XSS编码工具,以便对字符串进行十进制和十六进 ...

  8. css3 总结01

    前缀 chrome: -webkit- safari: -webkit- firefox: -moz- ie: -ms- opera: -o- 书写的时候应该先用有前缀的样式,再用无前缀的样式 颜色 ...

  9. Ue4 Shader博客

    http://blog.csdn.net/noahzuo/article/details/51133166 国外HLSL网站 https://www.shadertoy.com/browse

  10. ps让文字的颜色变成图片的颜色

    第一种: 把某张图片图层置于文字图层之上,右击图片图层-->选择"创建剪贴蒙版"即可.第二种:把某张图片图层置于文字图层之上,并选择图片图层,按住Ctrl键,点击文字图层,载 ...