Atitit.提升电子商务安全性 在线充值功能安全方面的设计
Atitit.提升电子商务安全性 在线充值功能安全方面的设计
1. 防止dataservcie对充值订单表的直接改写,只能通过api,不能通过sql1
1.2. 判断是否有此订单,否则CantFindRechargeOrderEx1
1.3. 如果订单状态有无。throw new RechargeOrderStatErr(" order.stat:" + order_id + "." + stat);1
1.4. 判断次订单是否处理过。。if (finished(order_id))1
1.6. 判断来路money是否与数据库内的相同FeeNotEquEx2
1.7. 判断订单修改状态,如果不为1 OrderFinishEx2
1. 防止dataservcie对充值订单表的直接改写,只能通过api,不能通过sql
1.1. Order_id的安全取值,注入检测
String order_id = (String) SqlSecuryCheckor.val(m.get("order_id"));
1.2. 判断是否有此订单,否则CantFindRechargeOrderEx
1.3. 如果订单状态有无。throw new RechargeOrderStatErr(" order.stat:" + order_id + "." + stat);
1.4. 判断次订单是否处理过。。if (finished(order_id))
return "already_finish";
必须判断feeFromUrl throw new SecuryEx(" feeFromUrl is null");
作者:: ★(attilax)>>> 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
1.5.
if(m.get("feeFromUrl")==null)
throw new SecuryEx(" feeFromUrl is null");
1.6. 判断来路money是否与数据库内的相同FeeNotEquEx
if( money_frmDb.compareTo(money_frmUrl)!=0 )
throw new FeeNotEquEx(" froom url total_fee.dbfee:"+m.get("feeFromUrl").toString()+"-"+ ormx.querySingleRow.get("money") );
1.7. 判断订单修改状态,如果不为1 OrderFinishEx
Object r = ormx.exe(m);
if ((Integer) r == 1)
{
String uid=ormx.querySingleRow.get("uid").toString();
BigDecimal money=(BigDecimal) ormx.querySingleRow.get("money");
accSvr.addAmount(uid, money);
return "ok";
}
throw new OrderFinishEx(" order finish ex");
1.8. Codce
package com.attilax.order;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.apache.xmlbeans.impl.xb.xsdschema.Public;
import aaaCfg.IocX4casher;
import bsh.StringUtil;
import com.attilax.acc.Acc;
import com.attilax.acc.AccService;
//import com.attilax.bet.AmountCalcService;
import com.attilax.data.DataStoreService;
import com.attilax.db.DBX;
import com.attilax.db.DbService;
import com.attilax.function.Function;
import com.attilax.io.filex;
import com.attilax.ioc.IocUtilV2;
import com.attilax.ioc.IocXq214;
import com.attilax.json.AtiJson;
import com.attilax.lang.FunctinImp;
import com.attilax.lang.Global;
import com.attilax.lang.SecuryEx;
import com.attilax.log.LogSvr;
import com.attilax.math.ADecimal;
import com.attilax.orm.AOrm;
import com.attilax.orm.AtiOrm;
import com.attilax.sms.SmsService;
import com.attilax.sql.SqlSecuryCheckor;
//import com.attilax.sql.DbService;
import com.attilax.store.StoreService;
import com.attilax.user.User;
import com.attilax.user.UserService;
import com.attilax.util.DataMapper;
import com.attilax.web.ReqX;
import com.google.common.collect.Maps;
import com.google.inject.ImplementedBy;
import com.google.inject.Inject;
import com.google.inject.name.Named;
import com.attilax.trigger.Trigger_after;
/**
* v3 add refuse and accept com.attilax.order.OrderService4jobus.refuse
*
* com.attilax.order.RechargeOrderService
* @author attilax 2016年4月14日 下午12:36:44
*/
public class RechargeOrderService extends OrderService {
public static void main(String[] args) {
System.out.println("--f");
System.setProperty("apptype", "jobus");
System.setProperty("prj", "jobus");
RechargeOrderService srv = IocUtilV2
.getBean(RechargeOrderService.class);
// System.out.println(srv.refuse("0301_152839_178"));
// System.out.println(srv.accept("0301_152839_178"));
Map m = Maps.newLinkedHashMap();
m.put("$table", "orderv2");
m.put("order_id", "198201");
//
String finishMsg = (String) srv.finish(m);
System.out.println(finishMsg);
System.out.println("--f");
}
@Inject
DataStoreService storeSvr;
@Inject
UserService userSvr;
@Inject
AccService accSvr;
@Inject
AmountCalcService amoutCalcSvr;
@Inject
private LogSvr logSvr;
// @Inject @Named("order_service_dataMaper")
// @ImplementedBy(FunctinImp.class) should ostion in interface java hto..
// public Function dataMaper;
@Inject
public Trigger_after trig_bef;
@Inject
public Trigger_after trig_aft;
public int insert(HttpServletRequest req) {
return insert(ReqX.toMap(req));
}
public int insert(Map order) {
if (userSvr == null)
throw new RuntimeException("#userSvr_is_null");
if (accSvr == null)
throw new RuntimeException("#accSvr_is_null");
if (amoutCalcSvr == null)
throw new RuntimeException("#amoutCalcSvr_is_null");
if (userSvr.isNotLogin()) {
throw new RuntimeException(" not login 没登录,请先登录..#not_login");
}
User u = userSvr.getLoginUser();
Acc a = accSvr.getAcc(u.id);
BigDecimal needMoney = amoutCalcSvr.calc(order);
if (new ADecimal(needMoney).biggerEqualThan(a.amount))
throw new RuntimeException(
" amount not enough 金额不足够 ..#amount_not_enough ");
// /...insert
order.put("$op", "insert");
order.put("order_id", filex.getUUidName());
order.put("order_money", needMoney);
trig_bef.apply(order);
storeSvr.insert(order);
int rzt = accSvr.reduceAmount(u.id.toString(), needMoney.doubleValue());
logSvr.log(order);
return rzt;
}
@Inject
AtiOrm ormx;
/**
* for req
attilax 2016年4月20日 下午4:11:03
* @return
*/
public Object finish()
{
HttpServletRequest req=Global.req.get();
return finish(ReqX.toMap(req));
}
public Object finish(Map m) {
// if(StringUtils.isEmpty((String)m.get("$where")) )
// throw new RuntimeException("no $where contion..");
String order_id = (String) SqlSecuryCheckor.val(m.get("order_id"));
if (finished(order_id))
return "already_finish";
//-------check money equ
if(m.get("feeFromUrl")==null)
throw new SecuryEx(" feeFromUrl is null");
BigDecimal money_frmDb=(BigDecimal) ormx.querySingleRow.get("money");
BigDecimal money_frmUrl=new BigDecimal( m.get("feeFromUrl").toString());
if( money_frmDb.compareTo(money_frmUrl)!=0 )
throw new FeeNotEquEx(" froom url total_fee.dbfee:"+m.get("feeFromUrl").toString()+"-"+ ormx.querySingleRow.get("money") );
m.put("stat", 1);
String where = " order_id='$order_id$'".replace("$order_id$",
SqlSecuryCheckor.val(m.get("order_id")));
m.put("$where", where);
m.remove("order_id");
// m.put("stat",1);
ormx.m = m;
ormx.setOp(ormx.update);
ormx.setTable("orderv2");
Object r = ormx.exe(m);
if ((Integer) r == 1)
{
String uid=ormx.querySingleRow.get("uid").toString();
BigDecimal money=(BigDecimal) ormx.querySingleRow.get("money");
accSvr.addAmount(uid, money);
return "ok";
}
throw new OrderFinishEx(" order finish ex");
}
/**
attilax 2016年4月21日 下午9:29:02
* @param string
* @return
*/
private Exception FeeNotEquEx(String string) {
// TODO Auto-generated method stub
return null;
}
private boolean finished(String order_id) {
String s = "select * from orderv2 where order_id='" + order_id + "'";
Map m = ormx.tabletype("sql").querySingleRow(s).querySingleRow;
if (m == null)
throw new CantFindRechargeOrder("order id:" + order_id);
String stat = m.get("stat").toString();
if (stat.equals("1"))
return true;
if (stat.equals("0"))
return false;
throw new RechargeOrderStatErr(" order.stat:" + order_id + "." + stat);
// return m.get("stat").toString().equals("1");
// ormx.tabletype("sql").exist(s).existRzt;
// false;
}
public List<Map> query(Map order) {
if (userSvr.isNotLogin()) {
throw new RuntimeException(" not login 没登录,请先登录..#not_login");
}
User u = userSvr.getLoginUser();
return null;
// /...insert
// return accSvr.reduceAmount(u.id.toString(), needMoney.doubleValue());
}
@Deprecated
public String query2json(Map order) {
return AtiJson.toJson(query(order));
// /...insert
// return accSvr.reduceAmount(u.id.toString(), needMoney.doubleValue());
}
}
Atitit.提升电子商务安全性 在线充值功能安全方面的设计的更多相关文章
- Atitit.在线充值功能的设计
Atitit.在线充值功能的设计 1. 流程1 2. Js sdk api 增加订单1 3. Java api 返回servlet处理1 3.1. 返回网址的本地host测试2 1. 流程 本地增 ...
- Atitit.提升 升级类库框架后的api代码兼容性设计指南
Atitit.提升 升级类库框架后的api代码兼容性设计指南 1. 增加api直接增加,版本号在注释上面增加1 2. 废弃api,使用主见@dep1 3. 修改api,1 4. 修改依赖import, ...
- Atitit 提升开发进度大方法--高频功能与步骤的优化 类似性能优化
Atitit 提升开发进度大方法--高频功能与步骤的优化 类似性能优化 1. 通用功能又可以组合成crud模块1 1.1. 查询(包括步骤,发送查询dsl,通讯返回结果,绑定到表格控件)2 1.2. ...
- Atitit. 提升存储过程与编程语言的可读性解决方案v3 qc25.docx
Atitit. 提升存储过程与编程语言的可读性解决方案v3 qc25.docx 1. 大原则:分解+命名1 1.1. 命名规范1 1.2. 分层.DI和AOP是继OO1 1.3. 运算符可读性一般要比 ...
- Atitit 软件项目非法模块与功能的管理与 监狱管理的对比 原理与概论attilax总结
Atitit 软件项目非法模块与功能的管理与 监狱管理的对比 原理与概论attilax总结 软件项目中的非法模块非法功能非法分子与人类中的非法分子很是相似,必须要建议不同的的约束管理标准化... 软 ...
- Atitit.linux 内核 新特性 新功能
Atitit.linux 内核 新特性 新功能 1. Linux 3.2内核新特性 2012-02-12 22:41:471 1.1. EXT4:支持更大的块2 1.2. BTRFS:更快的数据清理 ...
- Atitit。数据库 安全性 重要敏感数据加密存储解决方案
Atitit.数据库 安全性 重要敏感数据加密存储解决方案 1.1. 加密存储的重要性1 1.2. 使用的加密算法aes1 1.3. 数据加密以后会有一些问题.1 1.3.1. 一个是统计,比如统计资 ...
- Atitit.提升语言可读性原理与实践
Atitit.提升语言可读性原理与实践 表1-1 语言评价标准和影响它们的语言特性1 1.3.1.2 正交性2 1.3.2.2 对抽象的支持3 1.3.2.3 表达性3 .6 语言设计中的权 ...
- atitit.提升软件开发的效率and 质量的那些强大概念and方法总结
atitit.提升软件开发的效率and 质量的那些强大概念and方法总结 1. 主流编程中三个最糟糕的问题 1 1.1. 从理解问题后到实现的时间很长 1 1.2. 理解和维护代码 2 1.3. 学 ...
随机推荐
- Mybatis在idea中错误:Invalid bound statement (not found)
学习mybatis的过程中,测试mapper自动代理的时候一直出错,在eclipse中可以正常运行,而同样的代码在idea中却无法成功.虽然可以继续调试,但心里总是纠结原因.百度了好久,终于找到一个合 ...
- Elasticsearch——多索引的使用
在Elasticsearch中,一般的查询都支持多索引. 只有文档API或者别名等不支持多索引操作,因此本篇就翻译一下多索引相关的内容. 首先,先插入几条数据: $ curl -XPOST local ...
- postgres中的视图和物化视图
视图和物化视图区别 postgres中的视图和mysql中的视图是一样的,在查询的时候进行扫描子表的操作,而物化视图则是实实在在地将数据存成一张表.说说版本,物化视图是在9.3 之后才有的逻辑. 比较 ...
- SQL Server数字辅助表的实现
数字辅助表是一个连续整数的数列,通常用来实现多种不同的查询任务.大多分两类:足够大物理数字表和表函数,前者可以称为静态的,后者可以称为动态且按需生产. 物理数字表 物理数字表通常存在一 ...
- SignalR入门之小试身手
建立好持久性连接类TestConnection之后,现在为我们的SignalR程序配置持久性连接类以及访问路径. 进入刚刚建立的Startup类,进入Configuration这个方法里来配置: us ...
- 介绍开源的.net通信框架NetworkComms框架 源码分析(十二)PriorityQueue
原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ...
- 转型?还是延伸?开源建站系统近乎推整套SNS社区解决方案
转型?还是延伸?开源建站系统近乎推整套SNS社区解决方案 近乎(英文:Spacebuilder),作为.net领域的SNS社区建站系统代表之一,一直在技术开发领域算是兢兢业业,在Discuz!和Php ...
- C#中WinForm窗体事件的执行次序
C#中WinForm窗体事件的执行次序如下: 当 Windows Form 应用程序启动时,会以下列顺序引发主要表单的启动事件: System.Windows.Forms.Control ...
- SharedPreferences写入和读出数据
Android中有很多方法存储数据,如SharedPreferences.SQLite数据库等.简单数据的存储适用SharedPreferences. 本文使用SharedPreferences写入和 ...
- MySQL建表规范与常见问题
一. 表设计 库名.表名.字段名必须使用小写字母,“_”分割. 库名.表名.字段名必须不超过12个字符. 库名.表名.字段名见名知意,建议使用名词而不是动词. 建议使用InnoDB存储引擎. 存储精确 ...