Настраиваемая кнопка, безопасная для CSRF, связанная с методом Apex

Я ищу способ выполнения кода Apex с помощью пользовательской кнопки, добавленной к объекту Opportunity, таким образом, чтобы защитить пользователя от CSRF.

Текущий подход исходит из вопроса Пользовательская кнопка или ссылка на страницу Visualforce с пользовательским контроллером. По существу:

  1. Существует пользовательская кнопка возможности с источником контента, установленным на «Страница Visualforce».
  2. Содержимое этой кнопки настроено на страницу Visualforce, которая использует Opportunity для стандартного контроллера, имеет введенный класс вершины расширения и действие для метода в этом классе.
  3. Метод действия возвращает PageReference на другую пользовательскую страницу Visualforce. , включая добавление параметра с идентификатором возможности.
  4. Эта вторая настраиваемая страница Visualforce выполняет основную часть фактической работы, включая вызовы веб-сервисов и выполнение операций DML перед перенаправлением пользователя обратно к возможностям.

Проблема с этим подходом заключается в том, что вторая пользовательская страница Visualforce извлекается через HTTP GET, извлекает параметры из строки запроса и выполняет операции обновления/вставки DML без защиты CSRF. Это обнаруживается сканером исходного кода безопасности Force.com.

Я должен добавить, что этот апекс-код развертывается как управляемый, так и неуправляемый пакет, поэтому требуется дополнительная работа по перенаправлению на целевую страницу Visualforce с использованием PageReference. Это гарантирует, что при необходимости будет добавлен префикс пространства имен.

Как избежать проблемы с CSRF?

Я не хочу добавлять форму на вторую страницу visualforce с кнопкой, которую они должны нажать, чтобы начать процесс (и, следовательно, получить защиту ViewStateCSRF в постбэке). С точки зрения пользователей, они уже нажали кнопку для выполнения операции.

Я уже задавал этот вопрос на форуме разработчиков, но не нашел решения - Подделка межсайтовых запросов (CSRF/XSRF), безопасное действие пользовательской кнопки

Возможно, мне стоит попробовать переместить код из контроллера для второй страницы визуальной силы и вместо этого использовать расширение для контроллера стенда?

Я мог бы переключиться на обратный вызов Javascript для веб-службы Apex (как предложено в Вызов метода apex с помощью пользовательской кнопкии Как вызвать метод APEX с помощью пользовательской кнопки), но это кажется немного запутанным, и я не уверен, что просто открою еще один ряд проблем безопасности с веб-службой.

7
задан Community 23 May 2017 в 11:53
поделиться