Это странно, мне было интересно, может ли кто-нибудь пролить свет на то, почему это произошло.
По сути, я вырывался из головы, пытаясь протестировать JSONP, чтобы реализовать веб-службу JSON, которую могут использовать другие сайты. Я занимаюсь разработкой на localhost - в частности, на встроенном веб-сервере Visual Studio 2008 и Visual Studio 2008.
Итак, в качестве тестового запуска JSONP с 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'})
В итоге я устанавливаю точку останова на сервере и получаю ее как на первом «отладчике»; статус в клиентском скрипте, а также на сервере. URL-адрес JSONP действительно вызывается после загрузки страницы. Отлично работает.
Проблема, с которой я столкнулся, заключалась в том, что обратный вызов никогда не выполнялся. Я тестировал это как в IE8, так и в Firefox 3.5. Ни один из них не будет вызывать обратный вызов. Уловка (ошибка) тоже так и не была достигнута. Вообще ничего не произошло!
Я застрял на этом неделю и даже протестировал HTTP-запрос с ручным вводом в Telnet на указанном порту, чтобы убедиться, что сервер возвращает формат ...
callbackfn({abc : 'def'})
.. и это.
Затем меня осенило, что, если я изменю имя хоста с localhost на localhost с помощью глобализатора ('.'), То есть http://localhost.:41559/ вместо http://localhost:41559/ (да, добавив точку для любого имени хоста допустимо, для DNS это то же самое, что global::
для пространств имен C #). И тогда это сработало! Internet Explorer и Firefox 3.5, наконец, показали мне предупреждающее сообщение, когда я просто добавил точку.
Это заставляет меня задуматься, что здесь происходит? Почему поздняя генерация тегов сценариев работает с именем хоста в Интернете, а не с обычным localhost? Или это правильный вопрос?
Очевидно, это реализовано из соображений безопасности, но что они пытаются обезопасить? И, заставив его работать с точкой, я только что обнаружил брешь в этой функции безопасности?
Между прочим, мой файл hosts, хотя и изменен для других хостов, не имеет ничего особенного с 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);
}
}