Могу ли я использовать динамически создаваемые поля формы с компонентом безопасности в CakePHP 1.3?

Используя CakePHP 1.3, у меня есть (рабочая) форма с динамически создаваемыми полями формы (через Javascript). Все отлично работает, несколько моделей сохраняются через saveAll(), и это просто прекрасно.

Но я получаю черную дыру до 404 всякий раз, когда я включаю компонент безопасности (надеясь получить некоторую автоматическую магическую защиту CSRF).

Я понимаю, что это может быть (скорее всего!) вызвано динамически создаваемыми полями формы, как указано в документах.

Есть ли способ заставить их хорошо играть вместе?


person anonymous coward    schedule 22.09.2010    source источник


Ответы (1)


Ты не можешь получить свой торт и съесть его тоже. (Ча цзин!)

Защита CSRF означает именно то, что разрешено отправлять только определенный список полей формы. Этот список определяется и фиксируется во время создания формы. Вы не можете быть защищены CSRF и динамически изменять поля в форме.

Есть два решения:
Если количество и имена динамически создаваемых полей ограничены, создайте их все в форме и скройте с помощью CSS, а затем покажите с помощью Javascript. Таким образом, вы не создаете поля динамически, а только динамически показываете их.
Если это не сработает, вы можете добавить поля в белый список, используя $disabledFields option (опять же, только если их имена известны заранее) или вообще отключить CSRF с опцией $validatePost.

person deceze♦    schedule 23.09.2010
comment
Вы регулярно используете компонент безопасности? Мне кажется, что это, вероятно, немного излишество в самом общем случае. Особенно во время разработки. Считаете ли вы разумным создать приложение без него, а затем просто включить его в рабочую среду? - person Travis Leleu; 23.09.2010
comment
Итак, для классического хэша для сеанса поместите хэш в форму, проверьте соответствие хэша сеансу в сообщении формы - если я хочу немного более слабую безопасность, чем та, которую Cake обеспечивает по умолчанию - мне нужно возиться с сеансом и сделать это самостоятельно . Правильно? Спасибо! - person anonymous coward; 23.09.2010
comment
@Travis Я бы сказал, что если нет причин не использовать его, вам следует его использовать. Если это действительно вызывает больше проблем, чем решает, это не является абсолютно необходимым. Это зависит от того, насколько высокий уровень безопасности вам нужен в вашем приложении, аспект CSRF без случайных POST-сообщений от незнакомцев может иметь решающее значение для вашего приложения. Аспект без возни с полями формы может быть в основном воспроизведен тщательным кодированием и использованием опции $fieldlist для Model::save(). SecurityComponent удобен для быстрой настройки базовой HTTP-аутентификации, когда вам это нужно. - person deceze♦; 24.09.2010
comment
@anon Да, должно быть достаточно легко воспроизвести себя, если идти по этому пути проще, чем смягчить SecurityComponent. - person deceze♦; 24.09.2010
comment
еще раз спасибо за справочную информацию. Я просто помню, как пробовал его, когда был новичком в Cake, и помню, что у меня были проблемы, которые решались путем его отключения. Я должен дать ему шанс еще раз. - person Travis Leleu; 24.09.2010