Отправить форму с ключом формы и через AJAX - PullRequest
3 голосов
/ 09 января 2012

Все, у меня есть следующий класс, чтобы проверить, является ли форма, созданная с помощью HTML, допустимой, а также предотвращает повторную отправку формы, если кто-то делает Ctrl + F5 и т. Д. Вот класс, который делает это:

<?php
class Form_Key
{

protected $oldKey;

public function __construct()
{

    // Ensure we have an available session
    if ( NULL == session_id() )
    {
        session_start();
    }

    // Grab our former key for validation
    if ( isset( $_SESSION['form_key'] ) )
    {
        $this->oldKey = $_SESSION['form_key'];
    }

    // Assign the new key
    $_SESSION['form_key'] = md5( uniqid( mt_rand(), TRUE ) );

}

public function isValid()
{
    return 'POST' == $_SERVER['REQUEST_METHOD']
        && isset( $_POST['form_key'] )
        && '' != trim( $_POST['form_key'] )
        && '' != trim( $this->oldKey )
        && $_POST['form_key'] === $this->oldKey;
}

public function getKey()
{
    return $_SESSION['form_key'];
}

public function getOldKey()
{
    return $this->oldKey;
}

public function render()
{
    return '<input type="hidden" name="form_key" value="' . $_SESSION['form_key'] . '" />';
}

public function __toString()
{
    return $this->render();
}

}  
?>

Тогда у меня есть форма, которая выглядит примерно так:

require "form_key.php";
$form_key = new Form_Key;
<form action="about.php" method="post" name="create_memory" id="create_memory">
<input type="text" value="" id="lamecaptcha" name="lamecaptcha" />
<input type="text" value="" id="person_name" name="person_name" />
<?php echo $form_key; ?>
</form>

На стороне проверки (save_memory.php) я делаю что-то вроде этого:

require "form_key.php";
$form_key = new Form_Key;
if(isset($_POST) && $form_key->isValid()){
    echo "It is ok to submit";
}else{
    echo "Something went wrong";
}

Все это прекрасно работает, если я не отправляю форму через ajax, но если я отправляю форму через AJAX, это всегда дает мне сообщение об ошибке.Вот как я отправляю форму через AJAX:

person_name = $("input#person_name").val();
memory = $("input#memory").val();
form_key = $("input#form_key").val();
var html_memory = $.ajax({
type: "POST",
url: "save_memory.php",
data: "person_name=" + person_name + "&memory=" + memory + "&form_key=" + form_key,
async: false
}).responseText;

alert(html_memory);

Есть идеи, почему это так, и как я могу заставить это работать, отправляя мою форму через AJAX?Заранее большое спасибо!

1 Ответ

1 голос
/ 09 января 2012

Селектор Jquery для ввода ключа недействителен.Вы должны указать для него идентификатор form_key, например:

 return '<input id="form_key" type="hidden" name="form_key" value="' . $_SESSION['form_key'] . '" />';

[EDIT]

Также вам нужно вызвать функцию, которая генерирует ввод:

<?php echo $form_key->render(); ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...