• 26-02-2014, 21:38:15
    #10
    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;
    }
  • 27-02-2014, 13:29:09
    #11
    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.
  • 27-02-2014, 13:30:39
    #12
    BR9 adlı üyeden alıntı: mesajı görüntüle
    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 bu şekilde açığı kapatmış oluyoruz. Detaylı anlatamadım akşam eve geçtiğimde eğer sorununuzu çözemezseniz yardımcı olurum.
    Hocam o yazdiginiz eklentiyi konuda editleseniz guzel olur bence

    GT-N7100 cihazımdan Tapatalk kullanılarak gönderildi
  • 27-02-2014, 13:35:04
    #13
    KnoXviLLe adlı üyeden alıntı: mesajı görüntüle
    Hocam o yazdiginiz eklentiyi konuda editleseniz guzel olur bence

    GT-N7100 cihazımdan Tapatalk kullanılarak gönderildi
    Evet açığı nasıl kapatacağınıza dahir eklentiyi sizlere sunacağım hocam şuanda erişemiyorum ve şirkette olduğum için kısıtlı bir durumdayım. Akşam eve geçer geçmez iletiyorum zaten basit ve 1 satırlık if komutunda herşey
  • 27-02-2014, 14:38:31
    #14
    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.
  • 27-02-2014, 15:10:33
    #15
    yasarkemaldag adlı üyeden alıntı: mesajı görüntüle
    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.

    BR9 adlı üyeden alıntı: mesajı görüntüle
    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.

    mtn adlı üyeden alıntı: mesajı görüntüle
    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.
  • 27-02-2014, 15:29:41
    #16
    Elumre adlı üyeden alıntı: mesajı görüntüle
    Hocam zaten hepsini kontrol ediyorum. Ancak mdStatus ü 1 yapan dönen kodu da değiştirir sonuçta bir güvenlik açığı mevcut.
    Onu yapan bunu da yapar gibi bir mantık yok hocam.

    mdStatus sadece bankaya provizyon göndermek ya da göndermemek için 3D işlemini kontrol eden bir ön kontroldür. Evet müdahale edilebilir. Ama asıl önemli olan mdStatus geçildikten sonra bankaya gönderilen provizyonun cevabıdır. Bunu kodlarınıza erişim yetkisi olmayan biri -siz açık oluşturmadıkça- geçemez.

    EST için 2011 senesine ait dökümanlara bakarak kontrol ettim. Değişiklikler olabilir ama mantık aynıdır diye tahmin ediyorum.


    Siz de en sonra $result değişkeniyle dönen değerler içerisinden işlemin başarıyla tamamlanıp tamamlanmadığını kontrol edebilirsiniz. XMLi oluşturan değerlerin elle değiştirilse bile banka tarafında da kontrol olduğu için, $result değişkeni içe


    if($mdStatus =="1" || $mdStatus == "2" || $mdStatus == "3" || $mdStatus == "4")
    { 	
    	echo "<h5>3D Islemi Basarili</h5><br/>";
    
    	// XML request sablonu
    	$request= "DATA=<?xml version=\"1.0\" encoding=\"ISO-8859-9\"?>".
    	"<CC5Request>".
    	"<Name>{NAME}</Name>".
    	"<Password>{PASSWORD}</Password>".
    	"<ClientId>{CLIENTID}</ClientId>".
    	"<IPAddress>{IP}</IPAddress>".
    	"<Email>{EMAIL}</Email>".
    	"<Mode>P</Mode>".
    	"<OrderId>{OID}</OrderId>".
    	"<GroupId></GroupId>".
    	"<TransId></TransId>".
    	"<UserId></UserId>".
    	"<Type>{TYPE}</Type>".
    	"<Number>{MD}</Number>".
    	"<Expires></Expires>".
    	"<Cvv2Val></Cvv2Val>".
    	"<Total>{TUTAR}</Total>".
    	"<Currency>949</Currency>".
    	"<Taksit>{TAKSIT}</Taksit>".
    	"<PayerTxnId>{XID}</PayerTxnId>".
    	"<PayerSecurityLevel>{ECI}</PayerSecurityLevel>".
    	"<PayerAuthenticationCode>{CAVV}</PayerAuthenticationCode>".
    	"<CardholderPresentCode>13</CardholderPresentCode>".
    	"<BillTo>".
    	"<Name></Name>".
    	"<Street1></Street1>".
    	"<Street2></Street2>".
    	"<Street3></Street3>".
    	"<City></City>".
    	"<StateProv></StateProv>".
    	"<PostalCode></PostalCode>".
    	"<Country></Country>".
    	"<Company></Company>".
    	"<TelVoice></TelVoice>".
    	"</BillTo>".
    	"<ShipTo>".
    	"<Name></Name>".
    	"<Street1></Street1>".
    	"<Street2></Street2>".
    	"<Street3></Street3>".
    	"<City></City>".
    	"<StateProv></StateProv>".
    	"<PostalCode></PostalCode>".
    	"<Country></Country>".
    	"</ShipTo>".
    	"<Extra></Extra>".
    	"</CC5Request>";
    
    
          $request=str_replace("{NAME}",$name,$request);
    
    
          $request=str_replace("{PASSWORD}",$password,$request);
          $request=str_replace("{CLIENTID}",$clientid,$request);
          $request=str_replace("{IP}",$lip,$request);
          $request=str_replace("{OID}",$oid,$request);
          $request=str_replace("{TYPE}",$type,$request);
          $request=str_replace("{XID}",$xid,$request);
          $request=str_replace("{ECI}",$eci,$request);
          $request=str_replace("{CAVV}",$cavv,$request);
          $request=str_replace("{MD}",$md,$request);
          $request=str_replace("{TUTAR}",$tutar,$request);
          $request=str_replace("{TAKSIT}",$taksit,$request);
    
    
         
    
    	// Sanal pos adresine baglanti kurulmasi
    	
            $url = "https://<sunucu_adresi>/<apiserver_path>";  //TEST
    
    		$ch = curl_init();    // initialize curl handle
    		
    		curl_setopt($ch, CURLOPT_URL,$url); // set url to post to
    		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,1);
    		curl_setopt($ch, CURLOPT_SSLVERSION, 3);
    		
    		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
    		
    		curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable
    		curl_setopt($ch, CURLOPT_TIMEOUT, 90); // times out after 90s
    		curl_setopt($ch, CURLOPT_POSTFIELDS, $request); // add POST fields
    
    
    
            // Buraya mdStatusa göre bir kontrol koymalisiniz.
            // 3d Secure işleminin sonucu mdStatus 1,2,3,4 ise başarılı 5,6,7,8,9,0 başarısızdır
            // 3d Decure işleminin sonucu başarısız ise işlemi provizyona göndermeyiniz (XML göndermeyiniz).
    
    		$result = curl_exec($ch); // run the whole process
    //echo htmlspecialchars($result);
    echo "<br>";
    
           if (curl_errno($ch)) {
               print curl_error($ch);
           } else {
               curl_close($ch);
           }
    }