Проверьте вредоносный URL перенаправления в ASP.NET

Я слышал о сайтах, использующих другой сайт для перенаправления пользователей либо на их собственный сайт, либо чтобы скрыться за другим сайтом. В моем коде я перенаправляю в несколько мест, например, оставляю комментарий (проще использовать URL-адрес возврата, а затем вычислить страницу, используя данные).

Как я могу проверить, является ли обратный URL моим собственным URL? Я думаю, что я использую абсолютные пути, поэтому я могу легко проверить, является ли первый символ '/', но тогда я потеряю относительную гибкость. Это также не позволяет мне делать http://mysite.com/blah в URL перенаправления. Я мог бы исправить URL-адрес, добавив mysite + string, но мне нужно выяснить, является ли string относительным или уже является URL-адресом mysite.com.

Какой самый простой способ убедиться, что я перенаправляю только на свой сайт?

3 ответа

Решение

Как насчет того, если redirectUrl содержит "://" (который включает в себя http://, https://, ftp:// и т. Д.), То он также должен начинаться с " http://mysite.com/". Если он не содержит ": //", то он относительный и не должен быть проблемой. Что-то вроде этого:

if (!(redirectUrl.Contains("://") ^ redirectUrl.IndexOf("http://mysite.com") == 0))
{
    Response.Redirect(redirectUrl);
}

Я не думал об этом раньше, но как насчет использования зашифрованной версии URL в параметре строки запроса?

В качестве альтернативы, вы можете хранить список фактических URL-адресов в каком-то постоянном хранилище (возможно, в течение нескольких часов), а в строке запроса просто включить индекс в постоянное хранилище URL-адресов. Поскольку вы будете единственным кодом, управляющим этим постоянным серверным хранилищем, худшее, что может сделать злоумышленник, это перенаправить на другой действительный URL-адрес.

Это кажется странным вопросом, и это не должно беспокоить, если вы полностью контролируете процесс перенаправления. Если по какой-то причине вы разрешаете активному участию пользователя в перенаправлении (как в коде ниже)

Response.Redirect(someUserInput);

Тогда, да, пользователь может отправить ваш код тому, кто знает, где. Но если все, что вы когда-либо делаете,

Response.Redirect("/somepage.aspx")

Тогда эти перенаправления всегда будут на вашем сайте.

Как я уже сказал, это кажется странным вопросом. С точки зрения пользовательского ввода более важными являются, как правило, атаки SQL-инъекций и межсайтовый скриптинг. Я действительно не слышал о "злонамеренных перенаправлениях".

Другие вопросы по тегам