PHP güvenlik: 'Nonce' veya 'benzersiz form anahtar' sorunu

0 Cevap php

Ben bir formu doğrulamak için benzersiz anahtarlar oluşturmak için (bir blog öğretici alınan) bu sınıfı kullanın:

class formKey {
    //Here we store the generated form key
    private $formKey;

    //Here we store the old form key
    private $old_formKey;

    //The constructor stores the form key (if one excists) in our class variable
    function __construct() {
        //We need the previous key so we store it
        if(isset($_SESSION['form_key'])) {
            $this->old_formKey = $_SESSION['form_key'];
        }
    }

    //Function to generate the form key
    private function generateKey() {
        //Get the IP-address of the user
        $ip = $_SERVER['REMOTE_ADDR'];

        //We use mt_rand() instead of rand() because it is better for generating random numbers.
        //We use 'true' to get a longer string.
        $uniqid = uniqid(mt_rand(), true);

        //Return the hash
        return md5($ip . $uniqid);
    }

    //Function to output the form key
    public function outputKey() {
        //Generate the key and store it inside the class
        $this->formKey = $this->generateKey();
        //Store the form key in the session
        $_SESSION['form_key'] = $this->formKey;

        //Output the form key
        // echo "<input type='hidden' name='form_key' id='form_key' value='".$this->formKey."' />";
        return $this->formKey;
    }

    //Function that validated the form key POST data
    public function validate() {
        //We use the old formKey and not the new generated version
        if($_POST['form_key'] == $this->old_formKey) {
            //The key is valid, return true.
            return true;
        }
        else {
            //The key is invalid, return false.
            return false;
        }
    }
}

$formKey = new formKey();: web sitemde her şey yalak index.php ilk, bu yüzden index.php bu koymak gider

Sonra, her formda ben bu koyun: <?php $formKey->outputKey(); ?>

<input type="hidden" name="form_key" id="form_key" value="7bd8496ea1518e1850c24cf2de8ded23" />: bu üretir

Sonra sadece if(!isset($_POST['form_key']) || !$formKey->validate()) için kontrol edebilirsiniz

Ben iki sorun var. Birincisi: Ben, yalnızca oluşturulan son tuşa doğrular kendisin sayfa başına birden fazla formu kullanabilirsiniz olamaz.

İkincisi: index.php, yeni bir anahtar oluşturur ama formunu içeren sayfaları does't çünkü her şeyi formu doğrulamak için ajax kullanmak eğer yalak ilk index.php, ilk kez doğrular gider ama nedeniyle ikinci kez değil, bu yüzden yenileme Form anahtar güncellenen değil ..

Belki SİZ işe almak için kodu / sınıf değiştirme / güncelleme yapabilirsiniz .. ben birkaç şey denedim ama işe alınamıyor? Teşekkürler!

0 Cevap