我想知道从浏览器中加载的HTTPS网页向运行在localhost上的服务器发送数据的最佳方法是什么。目前我有一个适用于HTTP和HTTPS页面的解决方案,但是对于HTTPS页面,浏览器将输出Mixed Content
警告(应该如此)。这可以通过更改浏览器设置来绕过,但我宁愿没有用户这样做。这是我通过书签在浏览器中加载的javascript(不确定这是否是最好的方法,但它的浏览器独立):
function sendLocalPOST(player, song) {
var url = "http://localhost:13337/";
$.ajax({
type: "POST",
crossdomain: true,
contentType: "application/json; charset=utf-8",
url: url,
dataType: "json",
data: { 'player': player, 'song': song },
success: function (data) {
}
});
}
以下是C#服务器代码的一些重要摘录:
public WebAppHandler()
{
// Other non-important stuff
listener = new HttpListener();
listener.Prefixes.Add("http://localhost:13337/");
}
public void pollForSongChanges()
{
try
{
listener.Start();
}
catch (HttpListenerException)
{
return;
}
while (listener.IsListening)
{
var context = listener.GetContext();
ProcessRequest(context);
}
listener.Close();
}
public void start()
{
pr = new Thread(new ThreadStart(pollForSongChanges));
pr.Start();
}
我在stackoverflow上看到的另一个question有一个很好的答案(接受的答案),需要你将SSL证书绑定到你的应用程序,但这是否意味着我必须得到一个真正的可信任的SSL本地主机服务器的证书,以使其在其他计算机上开箱即用?
也许我说这一切都错了,只是想知道是否有更好的方法。谢谢你的回答。
@AlexeiLevenkov,你的意思是这样的:
function postToIframe(data) {
var url = "http://localhost:13337/";
var target = "npiframe";
$('body').append('<form action="' + url + '" method="post" target="' + target + '" id="postToIframe"></form>');
$.each(data, function (n, v) {
$('#postToIframe').append('<input type="hidden" name="' + n + '" value="' + v + '" />');
});
$('#postToIframe').submit().remove();
}
答案 0 :(得分:0)
基本上,你不能这样做。因为它是黑客攻击。
但是,如果你可以修改客户端的hosts文件,那么将localhost路由到'yourdomain.com'并生成ssl证书到'yourdomain.com'。
或者您可以在localhost服务器中创建代理服务器(https://targetdomain.com到http://localhost)。
答案 1 :(得分:0)
无法获取localhost的证书,因为主机名localhost不属于您自己。但是如果您拥有example.com,则可以获得foo.example.com的证书,并且无论哪个IP foo.example.com解析也无关紧要。 因此,Spotify和其他人使用的常见解决方法是拥有自己主机名的证书,但DNS条目指向127.0.0.1。
但是大多数人都没有意识到只有在用户不使用Web代理的情况下才有效。使用代理时,名称只会在代理处解析,因此它实际上意味着它尝试从代理视图(即代理本身)连接到localhost。
总结:使用localhost中的资源将无法完全运行。从安全角度来看,您的Web应用程序无法控制localhost上真正运行的内容,因此无论如何,通过将任何内容包含在您的页面中来信任来自localhost的任何内容都是一个坏主意。这与将用户系统中的file://
包含到应用程序中的情况相同。