王海鱼 发表于 3 天前

HTTP请求如何实现跨域以及如何办理碰到的安全问题

各人好,我是 V 哥,HTTP 请求实现跨域,会出现安全问题,下面来聊一聊这个问题。
HTTP 请求实现跨域

一、跨域的概念
跨域是指浏览器从一个域名的网页去请求另一个域名的资源时,由于同源策略的限制而出现的安全机制。同源策略要求协议、域名、端口完全雷同,只要有一个不同,就会产生跨域问题。
二、实现 HTTP 请求跨域的常见方法

[*]CORS(跨域资源共享)

[*]服务器端设置:在服务器端设置相应头,答应指定的源进行跨域访问。

    Access-Control-Allow-Origin: <origin>
    Access-Control-Allow-Methods: <method>[, <method>]*
    Access-Control-Allow-Headers: <header>[, <header>]*


[*] 例如,如果希望答应来自 http://example.com 的请求,可以设置 Access-Control-Allow-Origin: http://example.com。对于允很多种请求方法,可以利用 Access-Control-Allow-Methods: GET, POST, PUT。对于答应的自界说请求头,可以设置 Access-Control-Allow-Headers: Authorization, Content-Type。
[*] 对于预检请求(OPTIONS 请求),服务器需要正确相应并包含相应的答应信息,如上述设置,以便浏览器判断是否答应后续的现实请求(如 POST、PUT 等)。

[*]JSONP(JSON with Padding)


[*]原理:利用 <script> 标签不受同源策略限制的特性,通过动态创建 <script> 标签并插入到 HTML 中,请求一个 JSON 数据。
    <script>
      function handleData(data) {
            // 处理获取到的数据
            console.log(data);
      }
    </script>
    <script src="http://example.com/data?callback=handleData"></script>


[*] 服务器端会将数据包裹在回调函数中返回,如 handleData({ "key": "value" });。
[*] 缺点:只能处置惩罚 GET 请求,而且由于是利用 <script> 标签,存在一定的安全风险,例如可能受到 XSS 攻击。

[*]代理服务器


[*] 思绪:在同源的服务器上设置一个代理接口,让前端请求先到达同源服务器,然后由同源服务器转发请求到目标服务器,再将结果返回给前端。
[*] 实现方式:
可以利用 Node.js 的 http-proxy-middleware 等中间件。
      const express = require('express');
      const { createProxyMiddleware } = require('http-proxy-middleware');
      const app = express();
      app.use('/api', createProxyMiddleware({ target: 'http://example.com', changeOrigin: true }));
      app.listen(3000);

表明:上述 Node.js 代码利用 Express 框架,当请求 /api 路径时,利用 createProxyMiddleware 中间件将请求转发到 http://example.com,changeOrigin 参数会修改请求头中的 Origin 字段,模拟同源请求。

[*]WebSocket


[*]原理:WebSocket 是一种全双工通信协议,其毗连不受同源策略限制。
    const socket = new WebSocket('ws://weige.com/socket');
    socket.onopen = function() {
      console.log('Connection opened');
    };
    socket.onmessage = function(event) {
      console.log('Message from server ', event.data);
    };



[*]表明:通过创建 WebSocket 毗连到 ws://weige.com/socket,可以进行双向通信。onopen 事件在毗连建立时触发,onmessage 事件在收到服务器消息时触发。
三、注意事项


[*]CORS 是最常用和推荐的方式,但需要服务器端的支持。
[*]JSONP 虽然简朴,但功能有限且有安全隐患,仅适用于简朴的 GET 请求。
[*]代理服务器需要额外的服务器资源,而且可能会增加网络延迟。
[*]WebSocket 适合长毗连和及时通信场景,但需要服务器和客户端都支持 WebSocket 协议。
跨域请求中可能会碰到哪些安全问题

一、跨域请求中的常见安全问题

[*] CSRF(跨站请求伪造)

[*]原理:攻击者诱导用户在已登录的状态下访问恶意网站,该恶意网站会主动发起对目标网站的跨域请求,利用用户的登录凭证(如 Cookie)来实行非用户本意的操纵。
[*]示例:假设用户已经登录了银行网站,恶意网站可能包含一个隐蔽的表单,主动提交到银行的转账页面,从而导致用户在不知情的情况下转账。

[*] XSS(跨站脚本攻击)

[*]原理:当利用 JSONP 等跨域技术时,如果没有对返回的数据进行严格的过滤,攻击者可能会插入恶意脚本。
[*]示例:在 JSONP 中,如果服务器返回的数据包含 <script>alert('XSS');</script>,而前端直接将其作为脚本实行,会导致 XSS 攻击。

[*] 信息走漏

[*]情况:如果跨域请求中包含敏感信息,而没有适当的加密和安全机制,可能会导致信息在传输过程中被拦截和走漏。
[*]例如:利用 HTTP 而不是 HTTPS 进行跨域请求,数据在网络上以明文传输,容易被第三方窃取。

二、防范措施

[*]针对 CSRF 的防范

[*]利用 CSRF 令牌:服务器在页面中生成并存储一个 CSRF 令牌,在表单提交或 AJAX 请求时,要求携带该令牌,服务器验证令牌的有用性。

    <form action="/transfer" method="post">
      <input type="hidden" name="csrf_token" value="random_token_here">
      <input type="text" name="amount" value="100">
      <input type="submit" value="Transfer">
    </form>



[*]表明:在表单中添加一个隐蔽的 csrf_token 输入,该令牌是服务器端生成的随机字符串,每次请求时服务器会查抄令牌是否匹配。

[*]针对 XSS 的防范


[*]对返回的数据进行编码:在利用 JSONP 或其他跨域请求获取数据后,对数据进行 HTML 编码,克制直接实行脚本。
    function safeHTML(str) {
      return str.replace(/&/g, "&amp;")
                .replace(/</g, "&lt;")
                .replace(/>/g, "&gt;")
                .replace(/"/g, "&quot;")
                .replace(/'/g, "'");
    }



[*]表明:上述 JavaScript 代码对字符串中的特殊字符进行了转义,将 & 转为 &,< 转为 < 等,这样即使包含恶意脚本,也不会被实行。

[*]信息安全


[*] 利用 HTTPS:确保跨域请求利用 HTTPS 协议,对数据进行加密传输,防止信息走漏。
[*] 限制跨域访问:利用 CORS 时,严格控制 Access-Control-Allow-Origin 的值,只答应信托的源进行跨域访问,克制不必要的源访问敏感信息。
总结



[*]跨域请求会带来多种安全问题,需要从不同角度进行防范。
[*]CSRF 重要是利用用户的登录状态进行恶意操纵,通过 CSRF 令牌可以有用防范。
[*]XSS 多发生在未对数据进行处置惩罚的情况下,编码数据是关键的防护手段。
[*]对于信息安全,要确保利用安全的传输协议并严格控制跨域访问权限。
关注威哥爱编程,全栈开辟你最猛。兄弟,都看到这了,点个小关小注呗,你的支持是V 哥最大的写作动力。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: HTTP请求如何实现跨域以及如何办理碰到的安全问题