Atitit.提升电子商务安全性 在线充值功能安全方面的设计

1. 防止dataservcie对充值订单表的直接改写,只能通过api,不能通过sql1

1.1. Order_id的安全取值,注入检测1

1.2. 判断是否有此订单,否则CantFindRechargeOrderEx1

1.3. 如果订单状态有无。throw new RechargeOrderStatErr(" order.stat:" + order_id + "." + stat);1

1.4. 判断次订单是否处理过。。if (finished(order_id))1

1.5. 2

1.6. 判断来路money是否与数据库内的相同FeeNotEquEx2

1.7. 判断订单修改状态,如果不为1 OrderFinishEx2

1.8. Codce2

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 = (StringSqlSecuryCheckor.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.提升电子商务安全性 在线充值功能安全方面的设计的更多相关文章

  1. Atitit.在线充值功能的设计

    Atitit.在线充值功能的设计 1. 流程1 2. Js sdk api   增加订单1 3. Java api 返回servlet处理1 3.1. 返回网址的本地host测试2 1. 流程 本地增 ...

  2. Atitit.提升 升级类库框架后的api代码兼容性设计指南

    Atitit.提升 升级类库框架后的api代码兼容性设计指南 1. 增加api直接增加,版本号在注释上面增加1 2. 废弃api,使用主见@dep1 3. 修改api,1 4. 修改依赖import, ...

  3. Atitit 提升开发进度大方法--高频功能与步骤的优化 类似性能优化

    Atitit 提升开发进度大方法--高频功能与步骤的优化 类似性能优化 1. 通用功能又可以组合成crud模块1 1.1. 查询(包括步骤,发送查询dsl,通讯返回结果,绑定到表格控件)2 1.2. ...

  4. Atitit. 提升存储过程与编程语言的可读性解决方案v3 qc25.docx

    Atitit. 提升存储过程与编程语言的可读性解决方案v3 qc25.docx 1. 大原则:分解+命名1 1.1. 命名规范1 1.2. 分层.DI和AOP是继OO1 1.3. 运算符可读性一般要比 ...

  5. Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结

    Atitit 软件项目非法模块与功能的管理与  监狱管理的对比 原理与概论attilax总结 软件项目中的非法模块非法功能非法分子与人类中的非法分子很是相似,必须要建议不同的的约束管理标准化... 软 ...

  6. Atitit.linux 内核 新特性 新功能

    Atitit.linux 内核 新特性 新功能 1.  Linux 3.2内核新特性 2012-02-12 22:41:471 1.1. EXT4:支持更大的块2 1.2. BTRFS:更快的数据清理 ...

  7. Atitit。数据库 安全性 重要敏感数据加密存储解决方案

    Atitit.数据库 安全性 重要敏感数据加密存储解决方案 1.1. 加密存储的重要性1 1.2. 使用的加密算法aes1 1.3. 数据加密以后会有一些问题.1 1.3.1. 一个是统计,比如统计资 ...

  8. Atitit.提升语言可读性原理与实践

    Atitit.提升语言可读性原理与实践 表1-1  语言评价标准和影响它们的语言特性1 1.3.1.2  正交性2 1.3.2.2  对抽象的支持3 1.3.2.3  表达性3 .6  语言设计中的权 ...

  9. atitit.提升软件开发的效率and 质量的那些强大概念and方法总结

    atitit.提升软件开发的效率and 质量的那些强大概念and方法总结 1. 主流编程中三个最糟糕的问题 1 1.1. 从理解问题后到实现的时间很长 1 1.2. 理解和维护代码  2 1.3. 学 ...

随机推荐

  1. javascript学习—理解addLoadEvent函数

    onload事件是HTML DOM Event 对象的一个属性,又叫事件句柄(Event Handlers),它会在页面或图像加载完成后(注意是加载完成后)立即发生. window.onload = ...

  2. 【GIT】Github上传本地代码详解

    本教程结合Github服务端和客户端完成本地代码上传至Github,下面进行详细讲解: 1.创建Github账号,这一个步骤应该不用太多解释,直接上官网进行注册登录即可https://github.c ...

  3. Spring定时器,定时执行(quartz)

    这个定时器与继承了timertask的定时器不同的是,这个定时器是更强大的,可以指定每分的第n秒,每天的第n时,每周的.每年的.来定时运行这个定时器.那么下面来讲诉如何使用quartz定时器. spr ...

  4. JS魔法堂: Native Promise Only源码剖析

    一, 前言 深入学习Promise的朋友应该都看过<深入理解Promise五部曲>这一系列的文章, 以解除回调地狱之外的观点来剖析Promise更多的内涵,确实十分精彩. Part 1: ...

  5. 高性能Web系统设计方案(初稿目录),支持者进

    第一部分 客户端篇 1.压缩js.css,将js的引入放在</html>之前; 2.合并一个页面下的js/css文件,压缩传输.(SquishIt) 相关博文 3.ajax技术应用.aja ...

  6. Spark程序使用groupByKey后数据存入HBase出现重复的现象

    最近在一个项目中做数据的分类存储,在spark中使用groupByKey后存入HBase,发现数据出现双份( 所有记录的 rowKey 是随机  唯一的 ) .经过不断的测试,发现是spark的运行参 ...

  7. 未能加载文件或程序集“System.Web.Http.WebHost, Version=4.0.0.0, ”或它的某一个依赖项。系统找不到指定的文件。

    一:错误提示 "未能加载文件或程序集"System.Web.Http.WebHost, Version=4.0.0.0, Culture=neutral, PublicKeyTok ...

  8. char类型的说明

    CREATE TABLE [dbo].[CharTest]( ) NULL, ) NULL, ) NULL, ) NULL ) insert into dbo.CharTest ( Char, Var ...

  9. ASP.NET MVC部分视图PartialView的使用

    在ASP.NET MVC项目中,部分视图PartialVieww使用很广.它实际就是在ASP.NET环境的用户自定义控件UserControl. 在控制器中,创建一个视图操作Action和一个部分视图 ...

  10. 线程池ThreadPool的初探

    一.线程池的适用范围 在日常使用多线程开发的时候,一般都构造一个Thread示例,然后调用Start使之执行.如果一个线程它大部分时间花费在等待某个事件响应的发生然后才予以响应:或者如果在一定期间内重 ...