Хеш (или состояние) генерируется вами для каждого запроса к веб-службе (Facebook) и сохраняется в сеансе на вашем сервере.Этот хеш отправляется с просьбой в Facebook с вашего сайта.Facebook отправляет точно такой же хэш обратно в качестве параметра в ответе.
Все, что вам нужно сделать, это проверить, соответствует ли хэш, сгенерированный перед запросом, ответом в ответе.
MyWebsite | Facebook
---------------+-----------------
|
Generate $hash |
Store $hash |
|
$hash
----------------------->
|
$hash
<-----------------------
|
Check $hash |
Это предотвращаетCSRF, потому что хэш отличается для каждого запроса.Очевидно, что если вы используете одну и ту же строку для каждого запроса, любой, кто знает (или догадывается), сможет подделать ответ.
Как только запрос будет завершен, проверьте хэш из сеанса и хэш вответ оба совпадают.Если они не совпадают, это может быть поддельный ответ.После проверки удалите значение из сеанса, так как оно вам больше не понадобится.
В общих случаях (не только в реализации Facebook) часто целесообразно также хранить тайм-аут для хэша.Это предотвратит использование / использование хэша неполного запроса позднее.Не существует единого времени, подходящего для всех приложений и случаев, но в случае вторичного запроса / действия, подобного этому, 30 с -1 минута подойдут.