将数据从HTTPS页面发送到localhost服务器

时间:2015-07-08 22:54:56

标签: javascript c# http ssl https

我想知道从浏览器中加载的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();
    }

2 个答案:

答案 0 :(得分:0)

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

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

或者您可以在localhost服务器中创建代理服务器(https://targetdomain.comhttp://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://包含到应用程序中的情况相同。