Response.Redirect удаляет заголовок реферера - можно ли добавить его обратно?

Я использую Response.Redirect для перенаправления пользователей на другой сервер для загрузки файла, а другой сервер проверяет заголовок, чтобы убедиться, что он пришел с правильного сервера ... однако кажется, что Response.Redirect удаляет заголовки из ответа .

Кто-нибудь знает, как я могу вернуть заголовки? Я пробовал:

Response.AddHeader("Referer", "www.domain.com");

Но получающая страница проверяет ложность, когда я проверяю, установлен ли заголовок реферера.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
0
25 621
12

Ответы 12

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

Вы можете сохранить реферер в сеансе или закодировать его в URL-адресе в качестве параметра запроса. Как и в случае с ReturnUrl при входе в формы.

Server.Transfer вариант?

Однако есть некоторые предостережения, на которые вам нужно будет обратить внимание. НАПРИМЕР. Сохраняет исходный URL, авторизацию и т. д. Подробнее в ссылке.

В этом случае может быть полезно сохранить исходный URL-адрес.

Server.Transfer - это вариант, только если он находится на одном сервере, верно? В этом случае мне нужно перенаправить на другой сервер, поэтому, вероятно, это не сработает :(

Jeeby 28.10.2008 15:41

Заголовок реферера, который получает ваш второй сервер, генерируется браузером, и маловероятно, что вы сможете изменить его каким-либо разумным образом.

Вы пытались добавить реферер к URL-адресу, а затем вместо этого читать его на своем втором сервере?

Response.Redirect("url?Referer = " + Server.UrlEncode(Request.UrlReferrer));

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

Mladen B. 14.10.2019 21:48

Что ж, это зависит от того, что именно делается. Из исходного вопроса немного сложно понять, проблема это или нет. Мало что можно сказать о том, что защищается и почему. Или это вообще проверка безопасности.

Martin Brown 15.10.2019 16:36

Установите файл cookie аутентификации (с хешем с ключом и 5-минутным истечением срока действия), отправьте ответ перенаправления, браузер отправит новый запрос на второй сервер (если это тот же домен) вместе с auth coookie, второй сервер проверяет cookie, гарантирует, что только первый сервер мог установить его, и отправляет контент обратно в браузер.

Это будет противоречить заголовку Referer (sic) определение:

The Referer[sic] request-header field allows the client to specify, for the server's benefit, the address (URI) of the resource from which the Request-URI was obtained (the "referrer", although the header field is misspelled.)

Если вы перенаправляете, это явно не тот случай, чтобы добавить этот заголовок.

Если вам нужна эта информация, попробуйте использовать cookie или какую-либо переменную сеанса, или, что еще лучше, переменную в URL-адресе, как вам уже сказали.

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

Что, если пользователь делает два запроса одновременно? Я знаю, это почти невозможно, но кто знает ...

Leandro López 28.10.2008 17:31

Хороший вопрос. Я подозреваю, что второй запрос перезапишет значение Session ["referrer"], которое я создал, однако мой код уже сохранил первый запрос в таблице БД, поэтому он у меня все еще есть для целей отчетности, но в этом сценарии излишний.

Lazarus 06.11.2008 17:54

Доступен HTML-хак.

<form action = "http://url.goes.here" id = "test" method = "GET"></form>
<script type = "text/javascript">
  document.getElementById("test").submit();
</script>

Если вам нужно запустить это из кода, это тоже можно сделать:

Response.Write( @"<form action='http://url.goes.here' id='test' method='GET'></form>
                  <script type='text/javascript'>
                     document.getElementById('test').submit();
                  </script> ");

Как мог бы заметить Инкель, это вольная интерпретация спецификации Referer [sic]. Но он будет делать то, что вы хотите.

Да, это единственное, что у меня работало как в IE7, так и в FF3.

EMP 04.02.2009 03:48

вам нужно избежать " в вашем C#

Liam 19.09.2016 12:21

+1 к комментарию инкель выше.

Хотя, если вам не важна спецификация и вы просто хотите это сделать, вы можете избежать использования Response.Redirect и вместо этого самостоятельно создавать заголовки ответов.

Response.StatusCode = 302; //temp redirect
Response.Headers.Add("Location", "your/url/here");
Response.Headers.Add("Referer", "something.com");
Response.End();

Это не в моей голове, возможно, вам понадобится еще кое-что в заголовке ответа.

Вот версия предыдущей, которая мне подходит:

default.asp

servername = Lcase(Request.ServerVariables("SERVER_NAME"))
Response.Status = "301 Moved Permanently"
Response.AddHeader "Location", "http://yoursite"
Response.AddHeader "Referer", servername
Response.End()

Я не предлагаю публиковать - большинство веб-сайтов блокируют это. просто используйте javascript document.location = '<%:yourURL%>;';, который автоматически загрузит новую страницу. это хорошо работает для меня, потому что ответ перенаправления не включает реферер.

Я знаю, что это старый, но я наткнулся на него, пытаясь сделать то же самое.

Я не хотел добавлять его в URL-адрес, так как он как бы загрязнял URL-адрес тем, что мне там не нужно. Кроме того, я не хотел, чтобы люди случайно добавляли этот URL в закладки. Поэтому я использовал файлы cookie для добавления своих данных;

string token = vwrApi.GetAuthenticationToken(userId);
Response.Cookies.Add(new HttpCookie("VwrAuthorization", token));
Response.Redirect(returnUrl, true);

Конечно, это зависит от вашей способности изменить место, где целевой сервер ищет информацию, но, по крайней мере, это другой вариант.

Вам нужно будет отправить ответ статуса 307 и установить в заголовке местоположения пункт назначения, на который должен быть перенаправлен пользователь. Это сохранит исходный заголовок referer [sic] нетронутым.

HttpContext.Current.Response.StatusCode = 307;
HttpContext.Current.Response.AddHeader("Location", "http://stackoverflow.com");
HttpContext.Current.Response.End(); 

Это не работает так, как это соответствует вопросу. Перенаправленный запрос не имеет ожидаемой строки реферала (хотя вы это сказали).

Marcel 16.08.2012 16:14

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