【问题标题】:Does a XMLHTTP POST request to an HTTPS address use any encryption?对 HTTPS 地址的 XMLHTTP POST 请求是否使用任何加密?
【发布时间】:2019-01-15 04:19:03
【问题描述】:

如果我们使用javascript的http请求功能:

var request = new XMLHttpRequest();

到 https 地址,这是否会使用任何类型的加密,或者 MITM 是否能够看到我们发送的所有数据?

例子:

function createAuthToken(baseRestURL, callback) {
    var APIPath = "account/api/session";
    var CORSPath = "https://cors-anywhere.herokuapp.com/";
    var completeRestURL = CORSPath + baseRestURL + APIPath;
    console.log("REST API URL: " + completeRestURL);

    var method = "POST";
    var postData = "{\"tokenId\": \"" + document.getElementById('api_key').value + "\",\"secret\": \"" + document.getElementById('secret').value + "\",\"loginMode\": 1,\"applicationType\": 35}";
    var async = true;
    var request = new XMLHttpRequest();
    request.onreadystatechange = function() {
        if (request.readyState == 4 && (request.status == 200 || request.status == 201)) {
            console.log("ONLOAD");
            var status = request.status; // HTTP response status, e.g., 200 for "200 OK"
            console.log(status);
            var response = JSON.parse(request.responseText);
            console.log(response.session_token);       
            return callback(response.session_token);

        }

    }
    request.open(method, completRestURL, async);
    request.setRequestHeader("Content-Type", "application/json");
    request.setRequestHeader("Accept", "application/json");
    request.send(postData);

后续问题:如果没有,有没有办法在我们的客户端 JavaScript 中包含安全的加密?我的想法是在将请求发送到服务器之前使用网站的公钥加密请求,但我找不到其他人尝试客户端加密。

粗略的例子:

var CryptoJS = require("crypto-js");
var stackOverflowKey = "30 82 01 0a 02 82 01..."
var postData = "{\"tokenId\": \"" + document.getElementById('api_key').value + "\",\"secret\": \"" + document.getElementById('secret').value + "\",\"loginMode\": 1,\"applicationType\": 35}";
var encryptedPostData = cryptoJS.hmacSHA256(postData, stackOverflowKey)

//let's skip the callback and request headers as they are the same as above

var request = new XMLHttpRequest();
request.open();
request.send(encryptedPostData);

我没有学习计算机科学,也无法在网上找到任何关于此的信息。这样做的普遍接受的方法是什么?

【问题讨论】:

  • 是的,任何对 HTTPS 资源的请求(现代浏览器不会拒绝)都可以指望被端到端加密。

标签: javascript https xmlhttprequest cryptojs


【解决方案1】:

XMLHttpRequest 中的 HTTP 和 XML 部分一样,只是一个遗留的命名方案。由于所使用的请求不仅可以包含 http 协议 url,而且可以接收的不仅仅是 XML 响应体。

例如,最初的 W3C 工作草案通过以下方式介绍了 XMLHttpRequest 对象:

https://www.w3.org/TR/2006/WD-XMLHttpRequest-20060927/#introduction

对象的名称是 XMLHttpRequest 以与 web 兼容 因为否则没有多大意义。它支持运输 除了 XML 之外的其他数据格式,一些实现支持 HTTP 以外的其他协议(该功能不在 不过这个规范)并且 API 也支持发送数据。

注意“一些实现”,因为这是 2006 年的工作草案,所以不是每个人都在使用相同的实现。

XMLHttpRequest 的当前 whatwg 规范对名称有这样的说法:

https://xhr.spec.whatwg.org/#introduction

XMLHttpRequest 这个名称是历史性的,与其无关 功能。

只要使用的浏览器按照规范实现 XMLHttpRequest,请求/响应将被浏览器正常处理,即为 https 加密。

【讨论】:

  • 这是否意味着在我发出诸如示例之类的POST请求时,我的浏览器为我实现了与服务器建立SSL连接的整个过程?
  • @JesseRezaKhorasanee 是的,所有这些都是为您处理的,因为没有低级 api 来访问这种精细的控制,即没有用于设置 SSL 握手、连接等的 api。
猜你喜欢
  • 2019-06-25
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 2012-04-20
  • 2020-04-21
  • 2012-10-04
相关资源
最近更新 更多