Это странно, мне было интересно, может ли кто-нибудь пролить свет на то, почему это произошло.
В принципе, я вытягивал свои волосы, пытаясь проверить JSONP, поэтому я могу реализовать веб-сервис JSON, который могут использовать другие сайты. Я занимаюсь разработкой на локальном хосте - в частности, Visual Studio 2008 и встроенным веб-сервером Visual Studio 2008.
Итак, как тестовый запуск JSONP w/jQuery, я реализовал следующее:
$().ready(function() {
debugger;
try {
$.getJSON("<%= new Uri(Request.Url, "/").ToString() %>XssTest?callback=?", function(data) {
alert(data.abc);
});
} catch (err) {
alert(err);
}
});
И на сервере..
<%= Request["callback"] %>({abc : 'def'})
Итак, что происходит, я установил точку останова на сервере, и я получаю точку останова как на первом "отладчике"; statment на стороне клиента script, а также на сервере. URL-адрес JSONP действительно вызывается после загрузки страницы. Это отлично работает.
Проблема, с которой я столкнулась, заключалась в том, что обратный вызов никогда не будет выполняться. Я тестировал это как в IE8, так и в Firefox 3.5. Ни один из них не будет ссылаться на обратный вызов. Уловка (ошибка) так и не была достигнута. Ничего не произошло!
Я застрял на этом в течение недели и даже тестировал с помощью HTTP-запроса с ручной клавиатурой в Telnet на указанном порту, чтобы убедиться, что сервер возвращает формат...
callbackfn({abc : 'def'})
.. и это.
Тогда меня осенило, что если я изменю имя хоста от localhost на localhost с помощью глобализатора ('.'), то есть http://localhost.:41559/ вместо http://localhost:41559/ (да, добавление точки в любое имя хоста является законным, это DNS, что global::
относится к пространствам имен С#), И тогда это сработало! Internet Explorer и Firefox 3.5 наконец-то показали мне предупреждение, когда я просто добавил точку.
Итак, это заставляет меня задуматься, что здесь происходит? Почему поздняя работа по созданию тегов script работает с именем интернет-хоста, а не с обычным локальным хостом? Или это правильный вопрос?
Ясно, что это реализовано по соображениям безопасности, но что они пытаются защитить? И, заставив его работать с точкой, я просто обнаружил дыру в безопасности этой функции безопасности?
Кстати, файл моих хостов, измененный для других хостов, не имеет ничего общего с localhost; по умолчанию 127.0.0.1/:: 1 все еще на месте без переопределений ниже.
ПОСЛЕДУЮЩИЙ: Я прошел мимо этого для локальных целей разработки, добавив:
127.0.0.1 local.mysite.com
.. в мой файл hosts, а затем добавив следующий код в мой global.asax:
protected void Application_BeginRequest(object sender, EventArgs e)
{
if (Request.Headers["Host"].Split(':')[0] == "localhost")
{
Response.Redirect(
Request.Url.Scheme
+ "://"
+ "local.mysite.com"
+ ":" + Request.Url.Port.ToString()
+ Request.Url.PathAndQuery
, true);
}
}