2013-10-20 6 views
1

Я довольно новичок в обеспечении безопасности в Интернете. Мне было интересно, что будет правильным способом использовать токены в запросах в javascript, чтобы снова защитить CSRF. Может ли кто-нибудь показать мне образец кода? Я знаю, как правильно это сделать для форм с кнопкой отправки.Избегайте CSRF Javascript

dataType: "text", 
      url: '/username.php', 
data: 'username=' + $('#username').val() + '&Rand=' + (Math.random()*10000), 
      type: 'GET', 

Это образец кода из моего сценария. Он просто ищет имя пользователя и возвращает его, если он принят или нет. Как отправить токен через Javascript и проверить его на username.php? Спасибо

+0

Вам нужно сгенерировать маркерную сторону сервера и сохранить его, иначе вам нечего сравнивать с формой-submit. – jeroen

ответ

0

Если вы знаете, как это сделать на формах с кнопкой отправки, это не так. Генерация маркера должна выполняться на сервере и храниться независимо от того, что.

Даже если вы используете Javascript, вы используете PHP для вывода этой страницы, содержащей код javascript, правильно?

Так очень быстрый пример кода может быть ниже:

Этот код файла PHP, который выводит ваш JavaScript:

<? 
$token = md5(mt_rand() . session_id()); 
$_SESSION['token:'.$token] = true; 
?> 

Ваш JavaScript:

dataType: "text", 
     url: '/username.php', 
data: 'username=' + $('#username').val() + '&token=' + '<?=$token?>', 
     type: 'GET', 

Ваш username.php :

if ($_SESSION["token:".$_POST["token"]] == true){ 
    exit(); 
} else { 
    unset($_SESSION["token:".$_POST["token"]]); 
} 

Остерегайтесь, приведенный выше пример имеет некоторые проблемы, такие как «токен будет обновляться при одновременном открытии одной и той же страницы», а что нет. Таким образом, это не готовый код для использования в производстве. [UPDATE] Я обновил код, чтобы решить проблему «токен будет возобновлен ...».

Но у вас есть идея.

Создайте токен на сервере, используйте токен в своем javascript, а затем оцените его в своем username.php.

P.S. Если ваш javascript является внешним файлом скрипта, просто загрузите его как глобальную переменную на свою страницу, загружающую javascript, и используйте переменную во внешнем файле javascript.

+0

что вы подразумеваете под маркером, будет возобновлено, когда вы откроете одно и то же несколько раз? спасибо, кстати, для его очистки –

+0

Например, если я открою страницу с помощью javascript в нескольких браузерах (я буду называть их 'browserA' и' browserB'), '$ _SESSION ['token'] 'хранит только токен для' browserB', так как он перезаписывает токен для 'browserA'. Теперь в этой ситуации, если 'browserA' выполняет' username.php', проверка токена завершится неудачно. Этот примерный код очень низок для реального использования в этом смысле ... поэтому будьте осторожны, когда вы это реализуете. – ashiina

+0

Что было бы альтернативой этому? –

Смежные вопросы