Основная проблема в вашем коде заключается в том, что params[:referer]
может быть установлено вашим пользователем (или злоумышленником, подделывающим ссылку для вашего пользователя) на произвольное значение, добавив ?referer=https://malicious.site
к URL-адресу. Затем вы будете перенаправлены на это, что является уязвимостью открытого перенаправления.
Вы также можете утверждать, что заголовок referer
технически вводится пользователем, и вы будете перенаправлять на него, но я бы сказал, что в большинстве случаев и современные браузеры, что, вероятно, было бы приемлемым риском, потому что у злоумышленника на самом деле нет способа использовать его (но это может зависеть от конкретных обстоятельств).
Одно решение, которое сразу приходит на ум в подобных случаях будет сеансом, но, с одной стороны, это api отдыха, если я правильно понимаю, поэтому сеанса нет, а с другой стороны, он все равно не будет защищен от злоумышленника, связывающегося с вашей конечной точкой #new
из вредоносный домен.
Я думаю, вам следует проверить домен перед перенаправлением на него. Если есть общий шаблон (например, если все они являются поддоменами yourdomain.com), проверьте это. Или вы можете попросить своих пользователей сначала зарегистрировать свои домены, прежде чем вы перенаправляете на него (например, посмотрите, как работает OAuth2, вы должны сначала зарегистрировать свой домен приложения, прежде чем пользователь сможет перенаправиться туда с помощью токена).
Если ваш пользователь может просто прийти откуда угодно на #new
, и вы хотите отправить его обратно, откуда бы он ни пришел - это, на мой взгляд, не очень хорошее требование, вам, вероятно, не следует этого делать, или вам следует тщательно оценить риск и сознательно принять его если хотите по какой-то причине. В большинстве случаев есть более безопасное решение.