transfers etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
transfers etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

23 Ocak 2022 Pazar

Tek Seferlik URI Nasıl Oluşturulur

 

  URI amaçı yeni bir kaynak oluşturmaksa aşağıdakilerden birine dayalı bir belirteç oluşturmamız gerekir. 

Bir sıra numarası veya bir zaman damgası ile rastgele bir sayının birleşimi ile. Bir veya birden fazla kaynağı değiştirmek amaç ise ayrıca varlık etiketlerini ve jetondaki bu kaynak tanımlayıcılar ile birlikte URI kodlamalıyız.

Banka hesabı transfer örneğinde; Transferde bulunmak için sunucunun iki bankanın hesaplarında mevcut durumunun bir işlevi olan URI sağlaması gerekir. Böyle bir URI oluşturabilen kaynak;



# Request

GET /transfer-token?from=urn:example:org:account:1&

   to=urn:example:org:account:2 HTTP/1.1 > Koşullu bir istekte bulunmak için bir URI alma isteği;

Host: www.example.org

# Response

HTTP/1.1 200 OK

Cache-Control: no-cache

Link: <http://www.example.org/transfers;t=e6e3c89d4dfe7f3a818734a6237ccfc5>;

      rel="http://www.example.org/rel/transfer" > Koşullu URI

<accounts>> Kaynakların mevcut durumu..

   <account>

      <id>urn:example:org:account:1</id>

      <balance>200.00</balance>

   </account>

   <account>

      <id>urn:example:org:account:2</id>

      <balance>100.00</balance>

   </account>

</accounts

İstekteki kaynaklar jeton dağıtma makinesi gibidir. Müşteri aktarıma dahil olan hesaplar ve sunucular, Transferi başlatmak için URI ile bir bağlantı döndürür. Sunucu ayrıca hesapların mevcut durumunuda içerir.

Müşteri bağlantıyı kullanma kararını geri gönderilen alana dayandırmalıdır. Bu bağlantı yanlızca hesabın mevcut durumu için geçerli  kaynaktır.

Böyle bir URI oluşturmanın bir kaç yolu vardır. Aşağıdaki URI jeton içerir değeri ise rastgele bir sayının birleştirilmesinin bir MD5 karması olan geçerli tarih- iki banka hesabının zaman değeri ve varlık etiketleri:

http://www.example.org/transfers;t=e6e3c89d4dfe7f3a818734a6237ccfc5


URI kurcalanmasının önlenmesi için URI dijital imzalarıda dahil etmeyin düşünebilirsiniz. Sunucunun daha sonra doğrulama için bu belirteci depolaması gerekmez. Çünkü kaynakların mevcut varlık etikletlerinden jetondan karmalar uyuşmuyorsa sunucu istemci tarafından kullanılan URI artık geçerli olmadığı sonucuna varabilir. Böyle biri zaman belirteçlerine nonce denir. Nonce bir kez kullanılan sayı anlamına gelir.



Yeniden oynatma saldırılarını tespit etmek için tek seferlik URI kullanabilirsiniz. Tekrar saldırıları kötü niyetli bir varlığın isteklerini yakalamak için gizlice dinlenmesi ve yeniden bir gerçek müşteri gibi görünen sponsorlar ve tekrar istekleridir.

Bu tür amaçlar için tek seferlik URI ler kullanırken belirtecin kötü niyetli varlığın tahmin edilmemesi için gelecekteki simge değerleri rastgele oluşturulur.



URI amacı POST kullanarak yeni bir kaynak oluşturmaksa, jetonu oluşturun tarih ve saat değerine ve rastgele bir sayıya dayandırın. Tek seferlik URI yeni bir adres kaynağı oluşturmak için verilebilir. Bu URI deki belirteç bir MD5 karmasıdır. Bu ise rastgele bir sayı ve geçerli saat içerir.


# Request
GET /user/smith/address-token HTTP/1.1 > Bir kaynak oluşturmak için koşullu istekte bulunmak üzere URI alma isteği
Host: www.example.org

# Response
HTTP/1.1 204 No Content
Cache-Control: no-cache
Link: <http://www.example.org/user/smith;t=360e22a55267f0a525b1d49ddc9eed71>;
rel="http://www.example.org/rel/transfer" > Koşullu URI


Bu durumda URI sağlamak için herhangi bir girdi sağlamaya gerek yoktur. Bunu doğrulamak için URI daha önceden kullanılmamışsa sunucunun bir işlem günlüğünde tutması gerekir. Ne zaman istemci POST kullanarak URI oluşturmak için gönderir, öncesinde belirteç sunucudaki bir işlem günlüğünde mevcuttur. Değilse, isteği işleyin.

Web Uygulamaları söz konusu olduğunda belirteci gizli olarak da kodlayabilirisiniz. HTML formlarındaki form alanlarında. 

27 Aralık 2021 Pazartesi

POST isteklerini Koşullu Yapma

PUT veya DELETE den farklı olarak yapılan bir kaynağa gönderilen POST isteğinin sonucu, herhangi bir istek URI deki kaynağa yapılan değişiklikler sunucuda yeni bir kaynak oluşturabilir. Yanıt kodu 201 veya sonucu farklı bir URI ile tanımlanayabilirsiniz. Yanıt kodu 303. Bu durumda müşterinin bir temsili olmayacak ve şartlı yerel olarak depolanan üstbilgiler dahil. Bu tür POST isteklerini yapmak için bağlantıların nasıl kullanılacağını gösterir. POST  istekleri koşullu veya yanıtsız hale getirmek için bu tarifi uygulayabiliriz. 

Müşteri tarafından sunulması için POST u sunucunun yinelemeleri algılayabileceği ve önleyebileceği şekilde uygulamak istiyoruz.

İstemcilerin her POST isteği için bir bağlantı aracılığıyla sunucu tarafından sağlanan tek seferlik bir URI oluşturmak için  bir jeton içerir. POST isteğinin yalnızca bir kullanım için geçerli olan sunucu. Kullanılan tüm jetonları bir sunucu işlem günlüğünde saklanır. 

İstemci bir POST isteği gönderdiğinde jetonun işlemde mevcut olup olmadığını doğrulayın. Varsa yanıt kodu 403 döndürün. Neden bodyde olduğunu açıklayın. Eğer mevcut değilse dönme isteğine 201 oluşturun yada 303 ile bağlı olarak işlemi sonuçlandırın. Ayrıca belirteci işlem günlüğünde saklayın.

Sunucunun belirli bir miktar transfer etmesi gereken banka havalesi uygulaması olduğunu düşünelim.  Bir hesaptan diğer bir hesaba para aktarımı. Sunucu bir denetleyici kaynağı kullanarak bu transferi uygulayın.

# Request

POST /transfersİki banka hesabının kaynağına müşteri mevcut durum olduğunu düşündüğü şeye dayanarak bir POST isteği gönderir. 

Host: example.org

Content-Type: application/xml;charset=UTF-8

<transfer>

   <source>urn:example:org:account:1</source>

<target>urn:example:org:account:2</target>

<currency>USD</currency>
   <amount>100.00</amount>
   <note>Testing transfer</note>
</transfer>

# Response
HTTP/1.1 201 Created> Sunucu istemcinin isteğini şuanki duruma dayanıp dayanmadığını hesap kaynalarına göre doğurlayamıyor.

Content-Type: application/xml;charset=UTF-8
Location: http://www.example.org/transactions/1
Content-Location: http://www.example.org/transactions/1

<transfer xmlns:atom="http://www.w3.org/2005/Atom">
   <source>urn:example:org:account:1</source>
   <target>urn:example:org:account:2</target>
   <atom:link href="http://www.example.org/transactions/1" rel="self"/>
   <currency>USD</currency>
   <amount>100.00</amount>
   <note>Testing transfer</note>
</transfer>

Bu örnekte; http://www.example.org/trans tarafından tanımlanan kaynak ters bir denetçi kaynağıdır. Bu örnekteki POST isteğinin sonucu şu şekildedir. iki hesap kaynağının değiştirilmesi ve  yeni bir kaynağın oluşturulaması. Bunu yapmak için istek koşulu olarak; sunucu değerin bir işlev olarak belirteç kullanması gerekir. iki hesap kaynağının mevcut durumu bulabilmek için.  Sunucu aşağıdaki yaratılan URI kullanabilir.

http://www.example.org/transfers;t=e6e3c89d4dfe7f3a818734a6237ccfc5

Değiştirilmesi istenen iki kaynaktan; http://www.example.org/transfers  aksine bu URI bir işlev olarak bir belirteç içerir.  İstemci bir aktarım talebinde bulunmak için URI kullanabilir. Sunucu, URI deki belirtecin hala şuanki duruma karşılıl geldiğini doğrulayabilir. Bir hesap aktarımı oluşturmaya devam etmeden önce hesap kaynaklarını doğrulamak gerekir.

# Request
POST /transfer;t=e6e3c89d4dfe7f3a818734a6237ccfc5 HTTP/1.1 > İstemci geçerli veriyi temel alan bir URI ile koşullu bir POST isteği gönderir. Ancak bu gönderim sadece iki banka hesabı kaynağı olduğu sürece.

Host: example.org
Content-Type: application/xml;charset=UTF-8

<transfer>
   <source>urn:example:org:account:1</source>
   <target>urn:example:org:account:2</target>
   <currency>USD</currency>
   <amount>100.00</amount>
   <note>Testing transfer</note>

</transfer>

# Response

HTTP/1.1 201 Created > Sunucu, istemcinin isteğinin şuanki durumuna dayanıp dayanmadığının kontrolünü yapması ve hesap kaynaklarınında kontrolünün yapması sonrasında.

Content-Type: application/xml;charset=UTF-8
Location: http://www.example.org/transactions/1
Content-Location: http://www.example.org/transactions/1
<transfer xmlns:atom="http://www.w3.org/2005/Atom">

   <source>urn:example:org:account:1</source>
   <target>urn:example:org:account:2</target>
   <atom:link href="http://www.example.org/transactions/1" rel="self"/>
   <currency>USD</currency>
   <amount>100.00</amount>
   <note>Testing transfer</note>
</transfer>



Sunucudaki, jetonun sunucunun işlem günlüğü.

# Request
POST /transfer;t=e6e3c89d4dfe7f3a818734a6237ccfc5 HTTP/1.1 > İstemci koşullu bir POST isteği gönderir.
Host: example.org
Content-Type: application/xml;charset=UTF-8

<transfer>
   <source>urn:example:org:account:1</source>
   <target>urn:example:org:account:2</target>
   <currency>USD</currency>
   <amount>100.00</amount>
   <note>Testing transfer</note>

</transfer>

# Response
HTTP/1.1 403 Forbidden > Sunucu bir çakışma algıdı.
Content-Type: application/xml;charset=UTF-8
Date: Sat, 17 Oct 2019 20:16:18 GMT

<error xmlns:atom="http://www.w3.org/2005/Atom">
   <message xml:lang="en">Transfer already created.</message>
</error>


Bu sefer, sunucu, belirtecin önceden kaydedilmiş olup olmadığını görmek için işlem günlüğünü kontrol eder. Kullanılmış kopya oluşturmak yerine 403 döndürür. Bu teknikte POST tam olarak bir  kez çağrıldı.