Проверьте вредоносный 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-инъекций и межсайтовый скриптинг. Я действительно не слышал о "злонамеренных перенаправлениях".