Hocam uzun uzun yazmak yerine çok kısa bir örnek vermek istiyorum.
1. Sipariş
* Ürün 1 : sakız
* Ürün 2 : çikolata
Not: Ödendi.
OrderId ve PaymentId ürünler ve sipariş completed ödendi sorunsuz. (OrderId ve PaymentId ilişkili ürünler ve ödeme durumu başarılıya geçti.)
2. Sipariş
* Ürün 1 : iphone
* Ürün 2 : Samsung
Not: Ödenmedi.
Manipüle için 2. Siparişin Order bilgisi veriliyor ve 1. siparişin Payment bilgisi veriliyor. Fakat Wc_Order WooCommerce Tarafında OrderId ile Payment bilgisine erişiyor 1. siparişin bakıyor daha önce ödenmiş ve teslim edilmiş veritabanında kayıtlara geçmiş Bunu sadece OrderId ile içerde ilişkili sorguda tespit edebilir. Ve Daha önce ödenip teslim edilmiş olarak işlendiği için ödenmemiş sipariş durumu bekleyen olmadığı için orada Order Modeli Sorguda ödenmemiş bir sipariş olmadığı daha önce ödendiği için sorgudan veri null döner ve Order Modeli Null olduğu için Weepay tarafında Order değişkeni null olacak ve teslim işleminde Order işlemleri sağlanmayacak bilmem anlatabildimmi.
örneğinizden gidecek olursak
1. sipariş
Ürün 1: Sakız
Woocommerce in oluşturduğu order id: 15
Weepayin oluşturduğu woocommerce in bilmediği id: 12345
Durum: Ödendi
2. sipariş
Ürün 1: İphone
Woocommerce in oluşturduğu order id: 16
Weepay oluşturuyor ama kullanmayacağız
Durum Ödenmedi
Önceki ödemeden weepayin oluşturduğu 12345 i aldık ve bununla birlikte woocommerce in oluşturduğu 16 ödenmeyen değeri aldık post ettik. Kodlara göre weepay in oluşturduğu 12345 i weepayin apisinden sorguladı ve ödemenin yapıldığını gördü success oldu bu kısım geçti. wc_order ile 16 idli sipariş üzerinde işlem yapılacağını belirtti. 12345 ödendiği için wc_order fonksiyonu ile payment complete denildi ve ödeme başarılı işaretlendi. yani wc_order weepaye özel order id ile payment id yi karşılaştırsın vs. gibi bir şey yapamaz yapamamalı.
Mevcut kodlamada bulunan GetOrderData fonksiyonu, Weepay'a bağlanarak sipariş bilgisini çekiyor. %90 ihtimalle, o veride sipariş ID'si de bulunuyor.
Gelen veride sipariş ID'si orderId değişkeninde olduğunu varsayalım. Aşağıdaki örnek kod gibi bir kontrol aşaması olması gerekir (13. Satırda fonksiyon çalıştırılmakta.):
$siparisidkontrol = $Result->data->orderId;
if ($siparisidkontrol != $orderId) {
throw new \Exception("Sipariş ID uyuşmuyor.");
}
Eğer burada sipariş ID'si dönmüyorsa, belirttiğiniz gibi hash ile kontrol edilmesi gerekirdi.
Weepay'den gelen verilerde aşağıdaki bilgiler hash olarak gelmeli ve sistemde aynı hash bilgileriyle hash kodu oluşturulup uyuşup uyuşmadığı kontrol edilmelidir:
Mevcut kodlamada bulunan GetOrderData fonksiyonu, Weepay'a bağlanarak sipariş bilgisini çekiyor. %90 ihtimalle, o veride sipariş ID'si de bulunuyor.
Gelen veride sipariş ID'si orderId değişkeninde olduğunu varsayalım. Aşağıdaki örnek kod gibi bir kontrol aşaması olması gerekir (13. Satırda fonksiyon çalıştırılmakta.):
$siparisidkontrol = $Result->data->orderId;
if ($siparisidkontrol != $orderId) {
throw new \Exception("Sipariş ID uyuşmuyor.");
}
Eğer burada sipariş ID'si dönmüyorsa, belirttiğiniz gibi hash ile kontrol edilmesi gerekirdi.
Weepay'den gelen verilerde aşağıdaki bilgiler hash olarak gelmeli ve sistemde aynı hash bilgileriyle hash kodu oluşturulup uyuşup uyuşmadığı kontrol edilmelidir:
weepay_payment_bayi_id
weepay_payment_bayi_api
weepay_payment_bayi_secret
orderId
paymentId
haklısınız hocam öyle bir kontrol olmalı ama yok veya direkt weepaye bağlanarak oradan orderId almalı ama onu da yapmıyor. weepayde hash olmadığı için hocam öyle bir kontrol yok.
Eşleştirme muhtemelen weepay üzerinde yapılıyordur. Mantıken payment id oluşturulurken weepay ürün fiyat gibi temel bilgileri alır. Woo yapısını bilmiyorum fakat ödeme adımında sipariş oluşuyor ve ödeme bekleniyor konumunda kalıyorsa weepay onu da alıyordur muhtemelen.
sonuç olarak weepay e bir order_id veya cart_id gönderiyorsunuz weepay tarafında bu eşleşme yapılmazsa durum otomatik olarak false döner, adamlar bu kontrolü neden 3. taraf yazılımlara bıraksınlar ki?
Bu bahsettiğimiz mantık haricinde bir güvenlik açığı oluşturur mu ondan emin değilim
Eşleştirme muhtemelen weepay üzerinde yapılıyordur. Mantıken payment id oluşturulurken weepay ürün fiyat gibi temel bilgileri alır. Woo yapısını bilmiyorum fakat ödeme adımında sipariş oluşuyor ve ödeme bekleniyor konumunda kalıyorsa weepay onu da alıyordur muhtemelen.
sonuç olarak weepay e bir order_id veya cart_id gönderiyorsunuz weepay tarafında bu eşleşme yapılmazsa durum otomatik olarak false döner, adamlar bu kontrolü neden 3. taraf yazılımlara bıraksınlar ki?
Bu bahsettiğimiz mantık haricinde bir güvenlik açığı oluşturur mu ondan emin değilim
Weepay taraflı bir zarar bulunmamakta zaten.
Sadece site sahibine ödenmeyen siparişi ödendi gösterebilirsiniz Weepay'da ödenmediği belli olacaktır.
Burada ki sayfada request body içerisinde orderid ve paymentid gönderilmeli diyor, payment id değeri ile bu kontrol sağlanıyorsa evet güvenlik açığı mevcut. Siz öyle diyince kodları inceleyip bakayım dedim tekrardan
Burada ki sayfada request body içerisinde orderid ve paymentid gönderilmeli diyor, payment id değeri ile bu kontrol sağlanıyorsa evet güvenlik açığı mevcut. Siz öyle diyince kodları inceleyip bakayım dedim tekrardan
dediğiniz gibi payment id ve order id birlikte gönderilirse istekte weepay kontrolünü sağlıyor heralde ama bu woocommerce eklentisinde sadece payment id gönderiyor ve gelen cevapta ki order id yi karşılaştırmıyor ya da onu kullanmıyor siparişi teslim etmek için
Bir sisteme weepay sanal pos kodlarken woocommerce eklentilerinden kopya çekeyim dedim entegrasyon açıklamaları yeterli gelmeyince ama şunu fark ettim.
Callback kısmında hash kontrolü yok weepayde, ödemeyi onların tarafında oluşturulan id ile doğruluyoruz. Woocommerce kodlarında paymentId yi post ile çekip doğrulamışlar ama orderId yi de hiç doğrulamadan post içinden alıp eğer ödeme gerçekleştiyse başarılı yapıyorlar.
yani şu şekilde şöyle bir açık oluşabilir diye düşündüm. 200 tllik ürün aldım ve callback kısmında post içinde ki değerleri kopyaladım sadece orderId yi 5000 liralık siparişimin idsi olarak değiştirdim postu tekrar gönderdim o üründe ben ödeme yapmadan tamamlanmış olacak.
çünkü arkaplanda sadece paymentId yi kontrol ederek ödenmiş mi diye kontrol ediyor, o paymentId de ki orderId yi çekmiyor veya karşılaştırmıyor.
hash tarzı bir kontrol olmadığı için order id değişseydi hash uyuşmayacaktı.
GetOrderData fonksiyonuna paymentId yanına birde orderId eklenerek apiye istek gönderse düzelir sanırım ya da kodlar içinde apiden gelen order id ile işlemlere devam etse.
eğer ben gözümden bir yer kaçırdıysam ya da açık yoksa konuyu sileceğim