今天在看Magento官网的免费版支付宝(Alipay)支付和快钱(99bill)支付插件,首先感谢开发者的共享精神,但发现一个严重问题,而且警告现在正使用这两个插件的用户。它们极其不安全,在后端接收支付网关的相关程序有严重安全漏洞,可以篡改订单的支付状态到已支付,实际用户并未支付。如果插件确认是下面列的版本,建议立即
停止使用。
<CosmoCommerce_Alipay>
<version>0.9.1</version>
</CosmoCommerce_Alipay>
<CosmoCommerce_Cosmo99Bill>
<version>0.9.0</version>
</CosmoCommerce_Cosmo99Bill>
直觉告诉我在MAGENTO CONNECT里由CosmoCommerce写的支付网关都有问题,没有时间做进一步验证。
缺陷解释,一般我们在开发支付接口的时候有验签和解签的动作,一般用户可以理解它为加密与支付网关之间的数据。而在接收支付网关的数据时我们必须做的两步:
第一是验签,即严正这个请求数据是否由网关发出的,不然任何一个人都可以更改订单状态。
第二是去重处理,即支付网关有可能重复发送支付结果给你的网站,如果不做去重处理,已经到已完成的订单很可能又会回到处理中状态(取决于支付插件的配置—支付成功后的订单状态)。
而这两个插件的接收参数端没有对以上两点做任何的处理。结论是,任何一个人都可以修改订单状态,已经到已完成的订单又会回到处理中状态,有经过实际测试!简单到访问这个URL就可以:
https://www.somestore.com/cosmo99bill/payment/notify/?reference=100000009
http://www.somestore.com/alipay/payment/notify/?trade_status=TRADE_FINISHED&out_trade_no=100000008
我带大家看一段代码,用来解释,请打开这个文件 app/code/community/CosmoCommerce/Alipay/controllers/PaymentController.php
下面这段代码就是对应的上面的URL(http://www.somestore.com/alipay/payment/notify/?trade_status=TRADE_FINISHED&out_trade_no=100000008)
public function notifyAction()
{
//WEMVC:这里是获取参数代码
if ($this->getRequest()->isPost())
{
$postData = $this->getRequest()->getPost();
$method = 'post';
} else if ($this->getRequest()->isGet())
{
$postData = $this->getRequest()->getQuery();
$method = 'get';
} else
{
return;
}
//WEMVC:问题就在这里,开发者没有经过任何验签过程直接改了订单状态。同时也没有去重处理。
if ($postData['trade_status'] == "TRADE_FINISHED")
{
$order = Mage::getModel('sales/order');
$order->loadByIncrementId($postData['4']);
//$order->setAlipayTradeno($postData['trade_no']);
$order->setStatus(Mage_Sales_Model_Order::STATE_PROCESSING);
// $order->sendNewOrderEmail();
$order->addStatusToHistory(
$order->getStatus(),
Mage::helper('alipay')->__('买家已付款, 等待卖家发货。'));
try
{
$order->save();
} catch(Exception $e)
{
;
}
}
return;
}