Autor Zpráva
Fastman
Profil
Dobrý den,

mám problém, potřebuji zabezpečit systém pro platební bránu, který při úspěšné/neúspěšné transakci redirectuje na stránky webu s tím, že veškeré informace jsou v URL ($_GET) - (není to můj výmysl, prostě to tak mají) - a problém je, že tyto informace může běžný uživatel zneužít ve svůj prospěch. Co mi poradila přímo podpora od platební brány, tak prý mám udělat tohle:

"jakmile Vás kontaktujeme backend voláním na pozadí, tzv. confirm (data jsou podepsána, autenticitu volání ověříte porovnáním podpisu i např. podle naší IP adresy) můžete poskytnou službu zákazníkovi".

Jednoduchým řešením vidím v porovnání IP adresy odkud redirect přišel a pokud se bude shodovat s jejich IP, tak to projde v opačném případě zamítne. Hledal jsem tuto funkci na internetu, ale bohužel jsem nic nenašel.

Děkuji všem za odpovědi.
Keeehi
Profil
$_SERVER["REMOTE_ADDR"]

Fastman:
jakmile Vás kontaktujeme backend voláním na pozadí, tzv. confirm (data jsou podepsána, autenticitu volání ověříte porovnáním podpisu i např. podle naší IP adresy) můžete poskytnou službu zákazníkovi
Ty důležité části jsem tam vyznačil.
Backend volání - to bude úplně jiný http požadavek než to přesměrování zpět. I když zdá se to trochu nestandardní, většinou si platební bránu na pozadí kontaktuješ sám a nečekáš, až tě ona kontaktuje sama.
Data jsou podepsaná - to bude mnohem bezpečnější než ověřování pomocí IP adresy

O jakou platební bránu jde? Ať se tu nebavíme jen teoreticky.
Fastman
Profil
Jde přesně o platební bránu pays.cz. Podle jejich dokumentace myslí nejspíš toto:

Data2Hash = PaymentOrderID + MerchantOrderNumber + PaymentOrderStatusID + CurrencyID + Amount + CurrencyBaseUnits
Hash = MD5HMACEncode(Data2Hash, Password)

Při odesílání zákazníka na jejich platební bránu používám odkaz ve stylu:
paymentorder?Merchant=34xxx&Shop=53xxx&Amount=2000&Currency=CZK&MerchantOrderNumber=xxxx&Email=xxxx@xxxx

Zákazník zaplatí a Já dostávám zpětně tyto údaje:
PaymentOrderID=2804xxxx&MerchantOrderNumber=xxxx&PaymentOrderStatusID=3&CurrencyID=CZK&Amount=2000&CurrencyBaseUnits=100&PaymentOrderStatusDescription=Testovací+platba+provedena&hash=ef3173d263f5b13734a7bd1e304cfc92

Jak ale můžete vidět (z čeho se skládá Data2Hash), tak jak můžu zjistit PaymentOrderID, když ho získám až potom co zákazník zaplatí? Konkrétně mám problém v tom, že když zákazník vytvoří objednávku, tak se požadované údaje z paymentorder uloží do databáze, jenže zákazník by to mohl obejít tak, že rovnou vloží tento řetězec do URL a služba se mu aktivuje aniž by musel platit. Já chápu, že díky tomu hash bych tu provedenou akci ze strany zákazníka mohl zatrhnout, že se neshoduje hash, jenže jak zjistím ten PaymentOrderID, to je otázka.

PaymentOrderID - Identifikátor platby na straně platební brány Pays. (např. pro účely reklamací apod.)
M4n
Profil *
Neznám teda pays.cz, ale uživatel by neměl přenášet ověřovací data. Už z toho důvodu, že po zaplacení už nemusí proces z jakéhokoliv důvodu dokončit. Klasický 3D secure terminál odešle potvrzení obchodníkovi na stanovenou adresu paralelně a nezávisle – s privátními identifikátory a prostřednictvím HTTPS.
Keeehi
Profil
Fastman:
Já tedy žádný problém s ověřením nevidím.
<?php
$Data2Hash = $_GET["PaymentOrderID"] . $_GET["MerchantOrderNumber"] . $_GET["PaymentOrderStatusID"] . $_GET["CurrencyID"] . $_GET["Amount"] . $_GET["CurrencyBaseUnits"];
$Hash = MD5HMACEncode($Data2Hash, 'secret');

if($_GET["hash"] === $Hash) {
    // platba úspěšná
} else {
    // tohle je podvodník
}

M4n:
Už z toho důvodu, že po zaplacení už nemusí proces z jakéhokoliv důvodu dokončit.
S tím souhlasím. Ovšem pravdou je že ne všichni to tak mají. A nejde jen o menší projekty. Implementoval jsem třeba bránu ČSOB a i když se v jejím podání posílají data o objednávce dopředu, ještě před samotným přesměrováním zákazníka na platební bránu, tak po zaplacení je vyžadováno úspěšné přesměrování zpět. Můj eshop je notifikován tímto přesměrováním. A funguje to vlastně stejně jak u pays.cz, také dostanu data a jejich podpis.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: