3d işlemlerinde sunucu tarafında hash değeri üretilip bankaya post edilir. aynı şekilde bankada size mdstatus ve response değeriyle birlikte bir hash gönderir.
est sanalposlar için mdstatus değerinin 1-2-3-4 olması ödemenin alındığını değil 3d işleminin başarılı olduğunu gösterir. ödemenin alınma değeri ise response değerinin 'Approved' olması ile belirlenir. if lerinizde tüm bunların kontrolünü yaptıktan sonra hemen siparişinizi onaylatırsanız dediğiniz şekilde açık oluşur. ama bankanız bunların yanında birde hash parametlereleri ve hash gönderir. Kendi sunucu tarafında oluşturduğunuz hash ile sunucu tarafından gelen hash parametlerinden yola çıkarak hashi tekrar oluşturup gerekli hash kontrolunu yaptıktan sonra onaylatırsanız ilgili açık ortadan kalkar. Şunu unutmayın, javascript, jquery vb. client tabanlı yöntemle yapacağınız tüm kontroller aşılabilir. Çünkü bunlar ziyaretçinin bilgisayarında yorumlanır. Siz güvenlikle ilgili tüm işlemleri sunucu tarafında yani php ile yapmalısınız.
Eğer EST destekli bankalardan biri ile çalışıyorsanız aşağıdaki örnekteki gibi bir yöntemle hash kontrolü yapabilirsiniz.
//hash kontrol
$storekey = 'storekeydeğeriniz'
$hashparams = $_POST["HASHPARAMS"];
$hashparamsval = $_POST["HASHPARAMSVAL"];
$hashparam = $_POST["HASH"];
$paramsval="";
$index1=0;
$index2=0;
while($index1 < strlen($hashparams))
{
$index2 = strpos($hashparams,":",$index1);
$vl = $_POST[substr($hashparams,$index1,$index2- $index1)];
if($vl == null)
$vl = "";
$paramsval = $paramsval . $vl;
$index1 = $index2 + 1;
}
$hashval = $paramsval.$storekey;
$hash = base64_encode(pack('H*',sha1($hashval)));
//
if($paramsval != $hashparamsval || $hashparam != $hash)
{
echo "Hash Geçerli Değil !";
exit;
}
Hocam teşekkür ederim şuan deneme fırsatım yok en kısa zamanda deneyeceğim.
Bizzat böyle bir açığı kapattım rahatsız edici bir sorun bankadan gelen dönüş ile Tamper Data isimli mozilla eklentisi ile değiştirilebilip başarısız olan ödemeyi başarılıya çeviriyorlar tabi sadece Tumper Data değil başka programlarda var.
Ben bu sorunu şu şekilde çözdüm bankaya CURL ile geri dönüş yapmak açığı malesef kapatmıyor.
Ödeme başarısızsa eğer gelen değerleri kontrol ettirdim ben mdStatus == 1 & procreturncode == 00 gibi gibi hemen ardından ise ödeme başarısıza banka bize birden fazla POST değerleri gönderiyor başarısız dönüşte olan bu POST değerleri başarılı dönüşte kesinlikle yok ve bunları birbirleri ile kıyaslarak açığı kapatmış oluyoruz. Detaylı anlatamadım akşam eve geçtiğimde eğer sorununuzu çözemezseniz yardımcı olurum.
Hocam yönteminiz çok iyi bunu başarılı ve başarısız ödemeleri karşılaştırak yapabilirim sanırım hem bunu hem de tekrar curl gönderip doğrulamasını yapacağım önlem olarak.
Yanlış hatırlıyorsam düzeltin lütfen ama ben bu konuda bir açık göremedim.
EST için örnek verecek olursam; mdStatus değerinin 1 olması ödemenin başarıyla yapıldığını göstermiyor. mdStatus 1-2-3-4 değerlerinden birine eşit olması, bankaya ödeme için bir xml request gönderebilirsiniz demek. 1. adım bir nevi ön parametre kontrolü. Asıl ödeme 2. adımda yapılan xml request sonucuna bağlı. O da sunucu tarafında olan müşterilerinizin göremediği bölüm. Limitin yetersiz olması ya da ödemenin başarıyla tahsil edilmesi vs. durumların hepsi bu istek sonrası dönen cevaba göre belli oluyor. Siz de veritabanı tarafındaki güncellemelerinizi bu 2. istek sonucuna göre yapmalısınız.
Hocam zaten hepsini kontrol ediyorum. Ancak mdStatus ü 1 yapan dönen kodu da değiştirir sonuçta bir güvenlik açığı mevcut.