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


1021上课演练----SQL注入与避免(银行系统)的更多相关文章
- 【攻防实战】SQL注入演练!
这篇文章目的是让初学者利用SQL注入技术来解决他们面临的问题, 成功的使用它们,并在这种攻击中保护自己. 1.0 介绍 当一台机器只打开了80端口, 你最依赖的漏洞扫描器也不能返回任何有用的内容, 并 ...
- DVWA漏洞演练平台 - SQL注入
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,具体来说,它是利用现有应用程序将(恶意的)SQL命令注入到后台数据库引擎执 ...
- DAY5 DVWA之SQL注入演练(low)
1.设置 把安全等级先调整为low,让自己获得点信心,免得一来就被打脸. 2.测试和分析页面的功能 这里有一个输入框 根据上面的提示,输入用户的id.然后我们输入之后,发现它返回了关于这个 ...
- DVWA 黑客攻防演练(八)SQL 注入 SQL Injection
web 程序中离不开数据库,但到今天 SQL注入是一种常见的攻击手段.如今现在一些 orm 框架(Hibernate)或者一些 mapper 框架( iBatis)会对 SQL 有一个更友好的封装,使 ...
- DVWA之SQL注入演练(low)
1.设置 把安全等级先调整为low,让自己获得点信心,免得一来就被打脸. 2.测试和分析页面的功能 这里有一个输入框 根据上面的提示,输入用户的id.然后我们输入之后,发现它返回了关于这个 ...
- [SQL注入1]From SQL injection to Shell
第一次写,希望大神们多指点. 对于刚接触WEB渗透测试这块的朋友们,很希望能有个平台可以练习.网络上有不少,十大渗透测试演练系统,我这里推荐一个在10以外,适合初学者一步一步进步的平台PENTESTE ...
- SQL注入关联分析
在Web攻防中,SQL注入绝对是一个技能的频繁项,为了技术的成熟化.自动化.智能化,我们有必要建立SQL注入与之相关典型技术之间的关联规则.在分析过程中,整个规则均围绕核心词进行直线展开,我们简单称之 ...
- 入门级----黑盒测试、白盒测试、手工测试、自动化测试、探索性测试、单元测试、性能测试、数据库性能、压力测试、安全性测试、SQL注入、缓冲区溢出、环境测试
黑盒测试 黑盒测试把产品软件当成是一个黑箱子,只有出口和入口,测试过程中只要知道往黑盒中输入什么东西,知道黑盒会出来什么结果就可以了,不需要了解黑箱子里面是如果做的. 即测试人员不用费神去理解软件里面 ...
- 手工检测SQL注入漏洞
SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,具体来说,它是利用现有应用程序将(恶意的)SQL命令注入到后台数据库引擎执 ...
随机推荐
- 5.linux内核模块基础,内核模块学习
linux内核模块基础 一.定义 Linux 内核的整体结构非常庞大,其包含的组件也非常多,如何使用这些组件呢: 方法 1:把所有的组件都编译进内核文件,即:zImage 或 bzImage,但这样会 ...
- C 和 C++ 混合代码 cmath编译出错
最近在网上下载了 Triangle 库,准备在程序中调用来三角化生成网格,但出现了很多错误,如下: 1> triangle.c1>d:\program files\visualstudi ...
- SSH无密码登录配置小结
ssh-keygen -t rsa //-t指定算法 将公钥复制到被管理机器上面 ssh-copy-id -i ~/.ssh/id_rsa.pub 172.29.0.89 ssh-copy-id -i ...
- ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习
一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留 ...
- ArrayList和LinkedList的几种循环遍历方式及性能对比分析
最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...
- javascript优化--11模式(设计模式)02
策略模式 在选择最佳策略以处理特定任务(上下文)的时候仍然保持相同的接口: //表单验证的例子 var data = { firs_name: "Super", last_name ...
- python 线程之_thread
python 线程之_thread _thread module: 基本用法: def child(tid): print("hello from child",tid) _thr ...
- js-高级技术
高级技术: 1.function Person(name,age,job){ this.name=name; this.age=age; this.job=job; } var person=new ...
- hdu 1059 Dividing
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- js中typeof与instanceof区别
今天写JS代码,遇到动态生成多个名称相同的input复选按钮 需要判断其是否是数组,用到了if (typeof(document.MapCheckMgr.checkid)!="undefin ...