从HTTPS页面发送数据到本地主机服务器

Sending data from an HTTPS page to a localhost server

本文关键字:主机 主机服务 服务器 数据 HTTPS      更新时间:2023-09-26

我想知道从浏览器中加载的HTTPS网页发送数据到运行在本地主机上的服务器的最佳方式是什么。目前,我有一个解决方案,工作与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上看到了另一个问题,它有一个很好的答案(接受的一个),这需要你将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();
    }

基本上,你不能这样做。因为它是黑客。

但是,如果你可以修改客户端的hosts文件,那么将localhost路由到'yourdomain.com'并生成SSL证书到'yourdomain.com'。

或者您可以在本地主机服务器上设置代理服务器(https://targetdomain.com到http://localhost)

无法获得localhost的证书,因为主机名localhost不属于您自己。但是如果你拥有example.com,你可以获得一个foo.example.com的证书,并且foo.example.com解析的IP也无关紧要。因此,Spotify和其他公司使用的常见解决方案是为自己的主机名提供证书,但DNS条目指向127.0.0.1。

但是大多数人都不知道这只有在用户不使用web代理的情况下才有效。当使用代理时,该名称只会在代理上解析,因此它实际上意味着它试图从代理的视图连接到本地主机,即代理本身。

总结:使用本地主机上的资源将不能完全工作。从安全的角度来看,您的web应用程序无法控制本地主机上真正运行的内容,因此通过将来自本地主机的任何内容包含到您的页面中来信任它是一个坏主意。这与将来自用户系统的file://包含到应用程序中是一样的。