本文在研究当前智能终端发展背景和手机银行软件国内外发展现状的基础上,使用Java语言并结合当前主流的Android手机操作系统和客户端手机银行模式,进行了手机银行app和服务端系统的软件设计,并针对sql注入、XSS跨站等问题进行安全方案设计,保障基本的运行条件和安全的支付环境。
-
sql注入
针对sql注入和XSS跨站问题,使用预编译语句可以根据字段获取用户输入的信息,将其拼接在sql语句中。在这个过程中,可以对字段值进行格式判断,比如可以通过正则表达式进行匹配,对特殊字符可以起到过滤作用,避免执行恶意代码。
具体实现方式是建立filter,对所有的url进行数据库关键字和html标签的过滤,在经过过滤后,使用预编译语句来拼接sql语句,进行数据库的相关操作。如图5-1和5-2所示,如果存在特殊字符,系统会提示“存在非法字符”,并自动返回到上一页。
//定义过滤字符的方法
public static boolean sqlValidate(String str) {
// 构造正则表达式 ,过滤sql
String reg="and|or|'|--";
Pattern pattern=Pattern.compile(reg);
Matcher matcher=pattern.matcher(str);
// 构造正则表达式 ,过滤html标签
String regHtmlString="<(\\S*?)[^>]*>.*?|<.*? />";
Pattern pattern1=Pattern.compile(regHtmlString);
Matcher matcher1=pattern1.matcher(str);
if(matcher.find()||matcher1.find())
return true;
return false;
}
// 获得所有请求参数名
Enumeration params = httpRequest.getParameterNames();
while (params.hasMoreElements()) {
// 得到参数名
String name1 = params.nextElement().toString();
name1=new String(name1.getBytes("iso8859-1"),"utf-8");
// 得到参数对应值
String[] value = httpRequest.getParameterValues(name1);
for (int j = 0; j < value.length; j++) {
sql = sql + new String(value[j].getBytes("iso8859-1"),"utf-8");
}
}
// 匹配字符串,防止sql注入
try{
if (sqlValidate(sql)) {
out.print("<script>alert('您输入的信息含有非法内容');</script>");
httpResponse.sendRedirect(urlString);
} else {
//通过过滤器
arg2.doFilter(arg0, arg1);
}
}catch(Exception e){
e.printStackTrace();
}
//具体的数据库操作:获取用户输入信息
String place=request.getParameter("place");
String data=request.getParameter("data");
String weather=request.getParameter("weather");
String sql1="select * from weather where place=? and time=?";
stmt=conn.prepareStatement(sql1);
DB my=new DB();
//设置每个占位符的数值
stmt.setString(1,place);
stmt.setString(2,my.getDateMyP());
//执行sql语句
ResultSet rs3=stmt.executeQuery();
-
登录
为了限制用户行为,对用户的账号密码进行过滤,可以设置filter,在登录时,将用户的账号存在cookie中; 而用户在没有通过登录认证时,用户信息无法存储在cookie中,系统会提示错误信息。
// 设置可通过filter的url
String[] strings={"/myTestServer/login.jsp","/myTestServer/img/denglu.jpg","/myTestServer/servlet/Login"};
// 获取请求地址
String urlString=httpRequest.getRequestURI();
for(int i=0;i<strings.length;i++){
if(urlString.equals(strings[i])){//不对登录界面进行过滤
arg2.doFilter(arg0, arg1);
flag=true;
break;
}
}
if(!flag){
if(cookie[0].getValue()!=null){//获取登录时的账号
name=(String)cookie[0].getValue();
}
if(!name.equals("")){
arg2.doFilter(arg0, arg1);
}
else{
out.print("<script>alert('请先登录');</script>");
httpResponse.sendRedirect("http://localhost:8080/myTestServer/login.jsp");
}
}
-
设置验证码
为了证明用户身份,可以在登录界面设置验证码,动态获取六位数字。如图5-4所示,当用户点击验证码的输入框时,系统会在后台生成验证码,并将其显示在界面上。用户在输入正确的卡号、密码和验证码后,即可登录成功。
//生成验证码
Random a = new Random();
String n1, n2, n3, n4,n5,n6;
//产生一个0-9之间的随机数字
n1 = String.valueOf(a.nextInt(10));
n2 = String.valueOf(a.nextInt(10));
n3 = String.valueOf(a.nextInt(10));
n4 = String.valueOf(a.nextInt(10));
n5 = String.valueOf(a.nextInt(10));
n6 = String.valueOf(a.nextInt(10));
b[0] = n1 + n2 + n3 + n4+ n5+ n6;
//将验证码显示在界面上
Toast toast = Toast.makeText(MainActivity.this,
"您的验证码是"+b[0], Toast.LENGTH_LONG);
toast.show();