我有一个自由客户,希望我将支付网关集成到他们的Woocommerce网站中,但我越来越担心他们选择提供商和整个项目。

问题

根据我的建议,客户已选择网关提供商。该提供者是我从未听说过的远东地区,称为Payforasia。第一个警告标志是其网站的英文和中文(我认为是中文)版本似乎无法正确加载图像。

我已以PDF格式提供了网关API的文档。和一个简单的PHP演示。他们还给我登录了商户前端,以便我可以监视我的测试交易。一切都很正常。

我在本地主机上运行了演示,并设法连接到支付网关,但收到失败错误响应。该错误未在文档中列出,实际上可能的错误列表从0001到0067。我收到错误0068。第二个警告标志。当我通过客户与提供者联系时,要求提供最新的文档以及有关错误的建议。有人告诉我说这些文档是最新的,并且由于国定假日(!?!!!),办公室关闭了一周以上。他们终于今天回来找我,并说错误“可能”是由于他们没有将服务器IP列入白名单,并且他们现在已经解决了。我仍然遇到相同的错误。

我等待他们回到我身边时,我开始深入研究演示代码并重新阅读他们的文档,以查看是否错过了明显的内容。我在他们的文档中注意到这一行:


csid字符串100是通过
http://cm.js.dl.saferconnectdirect.com/csid.js <捕获值br />

从最初的测试开始,在等待他们结束为期一周的国定假日的同时,我已将SSL应用于客户的网站,显然浏览器不会将不安全的连接加载到javascript。此网址位于演示中,但在它与演示表单标记之间有大量返回之后,位于底部。另一个标志向我招手。

尝试使用协议不可知的URL和HTTPS后,发现csid.js无法通过安全连接使用。因此,我将JS复制到服务器并修改了标记中的链接。

脚本使用我的用户代理字符串,屏幕分辨率,原始服务器和哈希数据填充CSID字段。更令人担忧的是,它还添加了一个iframe,它看起来像是跟踪图像或类似图像。 iframe使用wss://协议将localhost断开了六个奇怪的连接。 JS已缩小,并且似乎包含PHP eval(),看起来像是编码字符。我不知道该如何解码,并且不确定继续深入研究代码是否安全。

我的问题

我需要一些建议。


我是不是过于偏执还是有真正的顾虑?
网关提供商对这样的代码进行混淆是正常的吗?
我应该建议我客户立即更换供应商?
我应该离开并总结经验吗?抱歉,如果我的问题很漫长且冗长,我想获得尽可能多的背景知识。

更新

谢谢所有给我很好建议的人,我只是想给大家一个快速更新。

我向客户提出了很多问题,他们没有按照我的期望做出反应。我被指控故意拖延脚,发明问题,无能为力,并且对我的亲戚问题没有那么专业的疑问。我和我的客户之间的关系肯定已经融化了。当我拒绝并邀请他们找到另一位开发人员时,他们几乎立即退缩,变得更加亲切,尽管我还没有道歉。将错误的IP列入白名单,这就是为什么我仍然收到神秘的0068错误的原因。网关提供商试图将其固定在我身上,直到我提供相反的Skype日志为止。我的客户不允许我直接与网关提供者对话,因此IP地址在它们之间的某个位置出现乱码。

关于不安全的JavaScript,我的客户突然向我提供了昨天,使用此网址https://online-safest.com/pub/csid.js。他们没有提供任何进一步的文档,也没有提供该脚本的来源。我尚未测试此脚本。

我不确定我是否要继续使用它,所以我一直在拖延脚步。我今天需要考虑一下。我明天将接受一个答案,很遗憾,即使我使用了多个答案的内容,我也无法接受多个答案。

更新2

只是最后一次更新。我为我的客户完成了这个项目,但我担心与他们的关系现在已经无法挽回。他们坚持认为,我将网关置于没有任何测试的情况下运行,除了单个测试事务已通过。我已经告诉他们,他们遇到的任何发布后问题都将需要寻找另一位开发人员,因为他们没有经过测试就被发布并丧失了我的正常支持期限。您可能会争辩说,对于最终用户而言,将代码大量发布给用户带来麻烦和危险,这对我来说是不道德的,但是我发现没有其他方法可以轻松退出合同。我已经给他们完全访问私有GIT存储库的权限,该存储库包含源代码,该源代码包含我和客户端之间所有已记录的交互。任何未来的开发人员都应该能够查看它并从那里做出决定。

我进一步发现,他们实际上已经将工作分包给了我。总而言之,这是我很高兴能摆脱的一个项目。

谢谢大家的帮助,建议和支持。

评论

您可能有顾虑。虽然Payforasia的网站声称符合PCI标准,但没有文件,例如其符合性报告(RoC)的副本,也没有指向列出已验证服务和应用程序的PCI网站或发卡机构网站的链接。我也去了其中一些网站,找不到Payforasia。建议您联系Payforasia,并索取其PCI合规性文档副本。如果他们没有提供,请向您的客户明确说明。

我只是通过电子邮件发送给@JaimeCastells,要求提供RoC或其他合规性文件,合法的文件看起来或包含什么?

中国的假期有所不同。关闭办公室的情况并不少见。 1-2周前发生了一次此类关机。因此,我不认为关闭办公室对公司造成可怕的影响。我并不是说这是一件好事,只是它应该在正确的文化背景中进行解释。

(这与您的问题无关,但是无论如何,)为避免引发自己的警告标志,应将SSL替换为TLS。

该公司在中国,但我(中国人)从未听说过。我也无法在中文搜索引擎上找到有关该站点的讨论。对于在线支付,我们中文使用支付宝,财付通,百福宝等。

#1 楼



我是不是过于偏执或者我有真正的顾虑?




这样的网关提供者混淆他们的代码是正常的吗? />混淆本身并不是异常现象。但是,在这一点上,他们正在尝试打开与RDP,VNC和其他端口的本地主机连接,这并不是很模糊,这是完全不适当的并且是恶意的。


建议我的客户立即更换供应商?




我建议您的客户提供的集成代码似乎是恶意的,并且您不能假定供应商是a)合法或b)能够确保其业务(并扩展为您客户的)的业务。此外,供应商似乎没有正确集成到安全的购买环境中(http:only js链接),即使合法,这也会质疑其是否适当。问题是,http://www.visa.com/splisting/searchGrsp.do上没有列出“ payforasia”服务提供商。这可能意味着他们以该名称从事业务,但获得了不同名称的认证,也可能意味着他们是“二级服务提供商”。坦率地说,这些选择都不能让人放心。



我应该走开并尝试一下吗? br />如果客户希望继续与该供应商合作,我肯定会考虑放弃。您不能使客户端做正确的事,但是您可以选择不成为客户端为他们做错事的人。

JavaScript分析

混淆的Javascript似乎很重要。我试图弄清Javascript中发生的情况,并在本节中链接到可读的,部分去模糊的副本。总的来说,我的印象是这些脚本中使用的混淆程度超过了商业上合理的程度,因此变得可疑。我可以推断出的推断数量有限,这与正常的付款处理不符。缺少更好的信息,我认为这是恶意javascript。这些文件已通过Online Javascript Beautifier运行,并且我还使用Online Javascript Editor来挑选脚本的功能。您可以看到,即使应用了基本的模糊处理,仍然存在很多混淆处理-check.js充满了整数数组,这些整数数组由代码处理,并且大概是要执行的更多文本或代码。

至少涉及四个脚本:


csid.js
tags.js
check.js
checkcid .js

例如,很明显,OP看到进行连接尝试的五个端口被硬接线到check.js:

td_0a = ['REF:63333', 'VNC:5900', 'VNC:5901', 'VNC:5902', 'VNC:5903', 'RDP:3389'];


我将继续对它们进行戳戳,并可能粘贴一些副本,但是我认为此时不信任此代码是合理的。

评论


仅对最后一个句子+1。有时您只是无法克服故意的愚蠢行为,但这并不意味着您有义务进一步启用它!

–梅森·惠勒
15-10-16在17:35

@duskwuff的答案得出了截然不同的结论-特别是有关尝试的端口连接的性质。

–尼尔·史密斯汀(Neil Smithline)
15年10月16日在18:31

@ NeilSmithline,3389和590X不是您要检查“开放Web代理”的端口,但是它们是您要检查是否希望有机会远程访问系统的端口。同样,信用卡支付客户代码与密尔有关-令人惊讶的是,微小的延迟增加足以使持卡人走到其他地方。就经过的时间而言,设置任何有用的“客户端状态检查”将是绝对禁止的。因此,就我个人而言,我是一个可疑的人……很高兴对人们的任何想法感到厌烦,尽管他们有这么好的想法。

– gowenfawr
15年10月16日在18:42

@gowenfawr也许不是传统意义上的“开放式Web代理”,但是打开这些端口确实表明您可能不是在看普通的台式机系统。

– duskwuff-非活动状态-
2015年10月17日在6:20

去混淆?你是说混淆还是反混淆?

–user49075
15年10月20日在20:24

#2 楼

关于混淆的javascript的更多信息:
他们使用了打包器,一种非常著名的javascript压缩方法。这是解压后的js(您也可以在这里自己解压缩js:http://dean.edwards.name/unpacker/):



var a = "";
try {
    var z = document.createElement('canvas');
    var A = z.getContext('2d');
    var B = 'http://security.tencent.com/';
    A.textBaseline = "top";
    A.font = "14px 'Arial'";
    A.textBaseline = "tencent";
    A.fillStyle = "#f60";
    A.fillRect(125, 1, 62, 20);
    A.fillStyle = "#069";
    A.fillText(B, 2, 15);
    A.fillStyle = "rgba(102, 204, 0, 0.7)";
    A.fillText(B, 4, 17);
    var C = z.toDataURL();
    C = C.replace("data:image/png;base64,", "");
    var D = atob(C).slice(-16, -12);
    a = b(D)
} catch (err) {};

function b(z) {
    var A, B, C = '',
        D;
    z += '';
    for (A = 0, B = z.length; A < B; A++) {
        D = z.charCodeAt(A).toString(16);
        C += D.length < 2 ? '0' + n : D
    };
    return C
};

function c(z, A) {
    var B = 180;
    var C = new Date();
    C.setTime(C.getTime() + B * 24 * 60 * 60 * 1000);
    document.cookie = z + "=" + escape(A) + ";expires=" + C.toGMTString()
};

function d(z) {
    var A, B = new RegExp("(^| )" + z + "=([^;]*)(;|$)");
    if (A = document.cookie.match(B)) return unescape(A[2]);
    else return null
};

function e() {
    var z = "";
    for (var A = 1; A <= 32; A++) {
        var B = Math.floor(Math.random() * 16.0).toString(16);
        z += B
    };
    z += new Date().getTime();
    return z.toUpperCase()
};
var f = "";
f = d("ccpspay");
if (f == null || f == '') {
    f = c("ccpspay", e());
    f = d("ccpspay")
} else {
    f += "OLD"
};
var g = "vduzzz8d";
var h = e();
var i = "";
i = navigator.systemLanguage || window.navigator.systemLanguage || navigator.language;
var j = "";
j = navigator.browserLanguage || window.navigator.browserLanguage || navigator.language;
var k = "";
k = navigator.appCodeName || window.navigator.appCodeName;
var l = "";
l = navigator.appMinorVersion || window.navigator.appMinorVersion;
var m = "";
m = navigator.appName || window.navigator.appName;
var n = "";
n = navigator.appVersion || window.navigator.appVersion;
var o = "";
o = navigator.cookieEnabled || window.navigator.cookieEnabled;
var p = "";
p = f;
var q = "";
q = a;
var r = "";
r = navigator.platform || window.navigator.platform;
var s = "";
s = navigator.userAgent || window.navigator.userAgent;
var t = "";
t = navigator.userLanguage || window.navigator.userLanguage;
var u = "";
u = String(window.screen.fontSmoothingEnabled);
var v = "";
v = String(window.screen.width + "x" + window.screen.height);
var w = "";
w = String(window.screen.colorDepth);
var x = new Array;
x[0] = i;
x[1] = j;
x[2] = k;
x[3] = l;
x[4] = m;
x[5] = n;
x[6] = o;
x[7] = p;
x[8] = q;
x[9] = r;
x[10] = s;
x[11] = t;
x[12] = u;
x[13] = v;
x[14] = w;
x[15] = new Date().getTimezoneOffset() / 60 * -1;
x[16] = window.location.host;
x[17] = h;
var y = x.join("&@");
document.getElementById("csid").value = y.toUpperCase();
document.write("<script type='text/javascript' src='https://h.online-metrix.net/fp/tags.js?org_id=" + g + "&session_id=" + h + "&pageid=1'></script>");
document.write("<noscript><iframe style='width: 100px; height: 100px; border: 0; position: absolute; top: -5000px;' src='https://h.online-metrix.net/tags?org_id=" + g + "&session_id=" + h + "&pageid=1'></iframe></noscript>");


虽然它们可能是合法的支付网关(我不知道,但对我来说看起来很黑),但它们充满了跟踪工具。您可能至少要就此警告客户。

评论


奇怪,我添加了语法提示,但代码仍未突出显示,是否已在security.SE上停用?

– Tobias Kienzler
2015年10月17日在21:08

@Tobias几乎可以肯定,因为仅在一个或两个页面上需要加载每个页面的库是没有意义的。出于相同的原因,MathJax无法在英语和用法上使用。对于Meta可能是个问题,因为可以根据页面内容指定要加载的库。

–安德鲁·利奇(Andrew Leach)
2015年10月20日在6:54

#3 楼

您正在分析的Javascript代码的行为异常,但是作为反欺诈系统的一部分是合理的。

此脚本用于评估客户端计算机的欺诈风险。作为此评估的一部分,它正在检查是否可以将计算机配置为开放的Web代理-这就是为什么脚本试图在各个端口上将WebSockets打开到localhost的原因。我以前没有看过这种特殊的技术,但是我认为它实际上很聪明。 :)它可以避免通过对客户端计算机本身进行扫描来执行侵入性的外部端口扫描!该脚本还从浏览器收集各种识别信息,例如浏览器版本,系统语言和各种配置选项。同样,这对于反欺诈评估是合理的,并且该供应商在使用这种方法时也很常见。

评论


在检查本地计算机的漏洞方面,提供商可能正在做的事情是合理的。但是,他们通过HTTP发送敏感信息并且不支持HTTPS的事实是我唯一需要的危险信号。当有人可以用最少的努力通过网络拦截我的帐户信息时,我不在乎采取了多少安全措施来检出我的机器。

–克里斯·西里菲斯(Chris Cirefice)
15-10-16在18:34



哦,HTTP详细信息绝对是错误的。这部分没有问题。 :)

– duskwuff-非活动状态-
15年10月16日在18:47

“在尝试使用与协议无关的URL和HTTPS之后,发现csid.js无法通过安全连接使用。”-我可能读错了,但并不是说第三方无法收集该身份欺诈保护信息是通过HTTPS发送的,不是吗?

–克里斯·西里菲斯(Chris Cirefice)
15-10-16在18:49



不保证这种情况是否发生,也不是“让客户端计算机自身扫描[/]来评估[欺诈]风险”,这不是一个矛盾的说法吗?例如机器不能简单地编辑JS或其响应,从而使接收者认为一切都很好吗?

– underscore_d
2015年10月18日13:37

@underscore_d正确。但是,对Javascript代码进行混淆是试图使之变得困难(并且我认为我们在不经意间通过在此处将代码拆开来挫败了它)。

– duskwuff-非活动状态-
2015年10月18日在16:46

#4 楼

我只会从另一个角度回答一个问题:


我是过于偏执还是有真正的担忧?


您有正版吗?


http://www.payforasia.com/

之所以无法加载图片,是因为AdBlock(请参见下图)。

其图像的源位于单独的服务器上:

(probably don't want to look at it, to be safe)
http://www.payforasia.com.img.800cdn.com/images/logo.jpg  


800cdn.com在恶意软件域列表中:

https://easylist-downloads.adblockplus.org/malwaredomains_full.txt

公司是中文的,中文部分提到了它在深圳。



评论


愚蠢的是,我没有在控制台上查看Adblock警报,谢谢。

–user5451386
2015年10月18日在13:27

在深圳是否与安全有关?

– underscore_d
15-10-18在13:39

@underscore_d我认为尼尔森只是在确认公司的位置,而不是暗示他们是中国人这一事实对可信赖性有任何影响

–user5451386
2015年10月18日14:02

Google的800cdn的安全浏览诊断非常令人着迷:它们首先说“该网站当前未列为可疑网站”。 -在发布有关从该域提供服务的恶意软件的统计信息列表之前,当您向下滚动时,这些统计信息会急剧加速。话虽如此,我认为作为内容交付网络(?),他们受客户上传的内容的支配,而不是本质上的怀疑。不过,通过协会,我不会急于将我/客户的财务与他们联系起来

– underscore_d
2015年10月18日在14:19

嗯,我不确定Google安全浏览诊断该怎么做。他们对自己的域名的诊断也不太好:)

–尼尔森
2015年10月18日23:58

#5 楼

也许您的客户不是最新的。您可以转到SSL Labs并检查其服务器。如果它们仅允许最新协议,则您的客户端代码可能会失败。 (例如,在我的服务器上,所有Java客户端都会失败,因为我不使用并关心它们!)

否则,我同意非常可疑的做法。您可以联系中国某人以检查他们是否是正常的提供者,以及您是否拥有正确的访问数据?

还可以,不是让你更加偏执,而是在这里得到的任何关于该服务合法或在哪里检查它是否合法的答案可能完全来自那些你问的人。 ;-)

评论


请修改您的帖子以包含这些详细信息

– schroeder♦
15年10月16日在21:43