CakePHP / yinelenen çift form gönderimleri önlemek için yeteneği var mı?

5 Cevap php

Ben CakePHP'de Security Component formlarına gizli değerler olarak belirteçleri ekleyerek CSRF önlemeye yardımcı olur keşfetti.

Bu bileşen veya bazı diğer bileşen / yardımcı kullanarak yinelenen form gönderimleri önlemek için yine de var idiyse ben merak ediyorum nedir?

Önceki projelerinde, ben göndermek üzerine silinir ardından okumak bir oturumda kaydedilen benzersiz bir karma kullanılır. A aynı karma ve bir hata üretilen olacağını olurdu teslim tekrarladı.

teşekkürler

5 Cevap

Daha önce yaptığım gibi Cake şey aynı tip uygulamak.

, Teslim teslim edilmiş gibi bu formu işaretleri bir oturum değişkeni set üzerinde. (Hile yapmak gerekir birkaç saniye içinde) ondan sonra bir zaman aşımı süresi koymak emin olun. Eğer (ve bu zaman aşımı süresi içinde konum) formu işlerken oturum değişken varsa, o zaman bir Tekrar Gönder'i var, bu nedenle form verilerini kaydetmek yok.

Eğer birden fazla kod yerlerde ekleyerek hakkında endişelenmenize gerek yok bu yüzden, senin modelin yöntemi (..) Kaydet içinde bu yapıyor tavsiye ederim.

There is a feature in CakePHP 2.x in the security component that allows you to choose to either use the same security token till it expires or just once. Place this in your controllers beforeFilter method:

$this->Security->csrfUseOnce = true;

Daha fazla bilgi bulabilirsiniz here

Pasta hakkında biliyorum, ama, bir POST isteği üzerine içerik görüntülemek kendi kendine yönlendirme yapmak değil kalkmayın. Çift sonrası çözülmüş alacak.

Güvenlik bileşeni çalışması, ayrıca, sen de unset hemen yazıdan sonra veriler gerekir:

unset($this->data['yourModel']);

Sadece PRG Pattern .. Çok basit doğru do?! Eh, en azından herkes öyle diyor ama kimse net bir cevap nakleder! Bana arama ve kazma bir hafta sürdü ve daha sonra "Acemi" kendi başına bir şeyler yapmaya karar verdim! İşte (I 2.0.5 kullanıyorum) CakePHP'de bunu yapmak için bir yoludur:

Regardless of code here is the logic in steps:
1- set data
2- validate (do NOT create() yet)
3- write $this->request->data to a session variable
4- redirect to a saveData action

Inside saveData action:
5- read & save the session's variable
6- DELETE session's variable
7- create()
8- save data to model
9- redirect

Here is an example of how your code might look like.
**Attn: "ourController" and "ourModel"

public function add() {
        if ($this->request->is('post')) {
            if (isset($this->request->data)) {
                $this->ourModel->set($this->request->data);
                if ($this->ourModel->validates()) {
                    $this->Session->write('myData', $this->request->data);
                    $this->redirect(array('controller' => 'ourController', 
                                           'action' => 'saveData',
                                           'ourModel' //optional but recommended
                                          )
                                    );
                } else {
                    $this->Session->setFlash('ourModel could not be saved.');
                     }
          }
.....//the rest of add() function
}

Sonra index eylemine tekrar sizi yönlendirir veya mantık sizi nereye götürürse bu işlev için (doğrulama üzerine) yönlendirilmesi gerektiğini!

public function saveData($model) {
        $myData = $this->Session->read('myData');
        $this->Session->delete('myData'); //extremely important
        $this->$model->create();
        if ($this->$model->save($myData)) 
               // or $myData[$model] if you are dealing with multiple models
              {
              $this->Session->setFlash(__($model.' have been saved successfully'));
              $this->redirect(array('controller' => 'ourController',
                                    'action' => 'index'
                                    )
                               );
            } 
        } else{
            $this->Session->setFlash(__($model.' could not be saved'));
        }
        }
    }

Basit bir öz-yönlendirme işe yarayabilir ama çoğu durumda (başka bir form veya dizin görünümüne örneğin) farklı bir görünüme yönlendirmek istiyorum

Ben sadece böyle işlevselliği sunucu tarafı yapmak için (benim durumumda olduğu gibi) bütün bir hafta harcamak zorunda değil bu yüzden bu detaylandırılması başkalarına zamandan tasarruf yardımcı olur umarım!