经验整理-28-http及网络安全-100-@

-------------------https http tcp  ip socket  netty  dubbo ribbon feign rest  cdn dns-------------

OSI七层和TCP/IP四层的关系

OSI引入了服务、接口、协议、分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型。
OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP则相反,先有协议和应用再提出了模型,且是参照的OSI模型

OSI是一种理论下的模型,而TCP/IP已被广泛使用,成为网络互联事实上的标准。

总结一下七层
物理层:设备之间比特流的传输,物理接口,电气特性等等。常见的设备有网线,网卡等等。数据单位是比特
数据链路层:成帧,用Mac地址访问媒介,错误检测与修正。数据单位是帧
网络层:提供逻辑地址(IP地址)、选路(选择传输路线)。数据单位是报文
传输层:确定传输的可靠性以及每种协议的端口号,传输前的错误检测,流控。数据单位是TPDU
会话层:对应用会话的管理,同步。确定网络数据是否要经过远程会话 。数据单位是SPDU
表示层:数据的表现形式,特定功能的实现,比如加密压缩等。数据单位是PPDU
应用层:用户接口,无限接近用户。数据单位是APDU
其中应用层、表示层和会话层是为用户提供服务的。传输层、网络层、数据链路层和物理层是为传输数据提供服务的。

?TCP连接需要经过“三次握手”?TCP关闭的时候却是四次握手?(握手是连接,是在传数据前)

三次握手过程理解:
原理:
1)发送端首先发送一个带有SYN(synchronize)标志地数据包给接收方。(嘿,李四,是我,听到了吗?)
2)接收方接收后回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了。(我听到了,你能听到我的吗?)
3)最后,发送方再回传一个带有ACK标志的数据包,代表我知道了,表示’握手‘结束。(好的,我们互相都能听到对方的话,我们的通信可以开始了。)


四次挥手过程理解:
原理:
 1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。(我所有东西都说完了)
 2)第二次挥手:Server收到FIN后,发送一个ACK给Client(需要客户端等待服务端处理完),确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。(我已经全部听到了,但是等等我,我还没说完)
 3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。(好了,我已经说完了)
 4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手(好的,那我们的通信结束l)


(至于HTTP协议,它是TCP协议族中的一种。使用TCP80端口,HTTP是应用层协议,TCP是传输层协议!)

HTTP短连接和HTTP长连接的区别?

HTTP短连接(非持久连接)是指,客户端和服务端进行一次HTTP请求/响应之后,就关闭连接。所以,下一次的HTTP请求/响应操作就需要重新建立连接。
HTTP长连接(持久连接)是指,客户端和服务端建立一次连接之后,可以在这条连接上进行多次请求/响应操作。持久连接可以设置过期时间,也可以不设置。(HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求)

?HTTP和SOCKET连接的区别?

socket则是对TCP/IP协议的封装和应用。TPC/IP协议又是传输层协议,主要解决数据 如何在网络中传输(Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。)
HTTP是应用层协议,主要解决如何包装数据

?java NIO 和阻塞I/O的区别?

 NIO是非阻塞式I/O.工作原理:

  1. 由一个专门的线程来处理所有的 IO 事件,并负责分发
  2. 事件驱动机制:事件到的时候触发,而不是同步的去监视事件。
  3. 线程通讯:线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的。减少无谓的线程切换
    è¿éåå¾çæè¿°

     

有http 请求,为什么还要用rpc(dubbo接口)调用?

http好比普通话,rpc好比团伙内部黑话。讲普通话,好处就是谁都听得懂,谁都会讲。rpc更精简、更加保密、更加可定制。
rpc相对http容器,优势在于封装了“服务发现”,"错误重试"高级特性,使用http调用则缺少了这些特性。

?Dubbo的一些特点?

缺省协议,使用基于netty3.2.2+hessian3.2.1交互。
连接个数:单连接
连接方式:长连接
传输协议:TCP
传输方式:NIO异步传输
序列化:Hessian二进制序列化
适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用dubbo协议传输大文件或超大字符串。
适用场景:常规远程服务方法调用

-------------------http-------------

?无状态和有状态的连接分别有哪些?

无状态:  tcp协议->http->Postman/httpclient、HttpURLConnection/前端ajax请求->rest/feign
有状态:               tcp/ip->scoket->netty(长连接有状态,dubbo的zk和提供者就是基于netty)

?什么是http协议,工作原理?

客户端与服务器之间通讯的超文本传输协议。
Http原理:
① 客户端的浏览器首先要通过网络与服务器建立连接,该连接是通过TCP 来完成的,一般 TCP 连接的端口号是80。 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是 MIME 信息包括请求修饰符、客户机信息和许可内容。
( URLURI的一个子集,URL是具体的资源标识方式,URI是抽象的高层次的
② 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可能的内容。

?请求重定向原理(Location)及实现?
 

答1:原理:浏览器客户端向服务器发送请求1,服务器返回302状态和想要的重定向服务器地址客户端收到响应就会帮忙重定向请求2到新地址.这个过程会有2次请求,所以耗费资源。

答2:服务器核心实现代码:        
resp.setStatus(302);       
 resp.setHeader("Location", "OtherServlet");


?跨域是什么?,怎么解决?

跨域原因产生:在当前域名请求网站中,默认不允许通过ajax请求发送其他域名。
XMLHttpRequest cannot load 跨域问题解决办法
使用nginx转发

?http抓包工具?

fiddler、wireshark

?传递的请求参数如何获取?

获取GET方式参数:
                    request.getQueryString();
获取POST方式参数:
                    request.getInputStream()
最好,都使用统一方便的获取参数的方式:                
                 核心的API:
                request.getParameter("参数名");//根据参数名获取参数值(注意,只能获取一个值的参数)                request.getParameterValue("参数名“);//根据参数名获取参数值(可以获取多个值的参数)
                request.getParameterNames();// 获取所有参数名称列表               

?怎么 防止非法链接(referer)/防盗链?

背景:A网站引用B网站的一张图片连接,所有访问压力都到A站了,B站自已都没压力,盗用性质。


解决:1、java校验referer,是不是在白名单里
2、nginx反向代理也可以解决盗用

                                
-------------------Https与Http-------------

?https与http区别?

 1、https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。
 2、http 是超文本传输协议,信息是明文传输https 则是具有安全性的 ssl 加密传输协议
 3、http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443
 4、http 的连接很简单,是无状态的HTTPS 协议是有状态的,由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接/短连接的意思是指通信双方都不长久的维持对方的任何信息。)

https工作原理?

我们都知道 HTTPS 能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用 HTTPS 协议。
 客户端在使用 HTTPS 方式与 Web 服务器通信时有以下几个步骤,如图所示。
  (1)客户使用 https 的 URL 访问 Web 服务器,要求与 Web 服务器建立 SSL 连接。
  (2)Web 服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
  (3)客户端的浏览器与 Web 服务器开始协商 SSL 连接的安全等级,也就是信息加密的等级。
  (4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
  (5)Web 服务器利用自己的私钥解密出会话密钥。
  (6)Web 服务器利用会话密钥加密与客户端之间的通信。

 

 https优缺点?
 虽然说 HTTPS 有很大的优势,但其相对来说,还是存在不足之处的:
  (1)HTTPS 协议握手阶段比较费时,会使页面的加载时间延长近 50%,增加 10% 到 20% 的耗电;
  (2)HTTPS 连接缓存不如 HTTP 高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;
  (3)SSL 证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。
  (4)SSL 证书通常需要绑定 IP,不能在同一 IP 上绑定多个域名,IPv4 资源不可能支撑这个消耗。
  (5)HTTPS 协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL 证书的信用链体系并不安全,特别是在某些国家可以控制 CA 根证书的情况下,中间人攻击一样可行。

-------------------Web安全(攻击及预防)-------------
1. XSS攻击--跨站脚本注入(Cross-site scripting)
背景:通过对网页注入可执行代码脚本且成功地被浏览器 执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实 施比如SQL注入攻击服务器和数据库、Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨 大的,是web安全的头号大敌
XSS攻击举例1:写个死循环做为传参,搞恶作剧!
while (true) { alert("你关不掉我~");}

解决:
校验是否有执行代码脚本
或把其转换成合法的格式
2.CSRF攻击---跨站请求伪造(Cross-site request forgery)(跨站脚本注入也勉强算CSRF之一,俗称XSRF)
背景:可以用CSRFTester,抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击(模拟http请求攻击)
解决: 实现方法非常简单,首先服务器端要以某种策略生成随机字符串,作为令牌(token) 保存在 Session 里。然后在发出请求的页面,把该令牌以隐藏域一类的形式,与其他信息一并发出。在接收请求的页面,把接收到的信息中的令牌与 Session 中的令牌比较,只有一致的时候才处理请求,否则返回 HTTP 403 拒绝请求或者要求用户重新登陆验证身份
3.上传漏洞(脚本攻击)
背景:攻击者上传了一个可执行文件如木马,病毒,恶意脚本,WebShell等到服务器执行,并最终获得网站控制权限的高危漏洞
解决:客户端的检查虽然对技术较好的攻击者来说可以借助工具绕过.服务器端的检查最好使用白名单过滤的方法,这样能防止大小写等方式的绕过,同时还需对%00截断符进行检测,对HTTP包头的content-type也和上传文件的大小也需要进行检查。
4.SQL注入
背景:比如登录验证功能,用户输密码时,使用:suibian' or '1'='1,结合下面的字符串连接方式的语句就很容易注入,跳过登录。    
原SQL语句拼接为: String sql = "select id from user15 where username='"+user.getUserName()+"' and password='"+user.getPassWord()+"'";   
解决:使用预编译SQL语句 ,使用SQL参数进行参数的传递,最好使用#号入参,因为$还有拼接形式
password=#{}

-------------------DNS解析域名过程-------------
?工作原理?
把域名转换成IP地址,优先读取本地HOST文件,
本地文件没有从当前运营商(电信网管)获取对应IP。

 (本地host文件 C:\Windows\System32\drivers\etc)

?如何把本地映射到外网?

外网映射工具natapp.
登录natapp官网,然后设置临时域名映射和本地真实IP,拿到token
下载natapp工具,带上token运行启动。
然后就可以外网访问到我的本地,做支付回调了

-------------------cookie(保存在浏览器客户端的缓存)-------------

?cookie工作原理?

                1)服务器创建cookie对象,把会话数据存储到cookie对象中
            new Cookie("name","value");
                2)服务器发送cookie信息到浏览器response.addCookie(cookie);(放入response响应里)
                        举例: set-cookie: name=eric (隐藏发送了一个set-cookie名称的响应头)
                3)浏览器得到服务器发送的cookie,然后保存在浏览器端
                4)浏览器在下次访问服务器时,会带着cookie信息
                        举例: cookie: name=eric  (隐藏带着一个叫cookie名称的请求头)
                5)服务器接收到浏览器带来的cookie信息request.getCookies();

-------------------Session(保存在服务端的缓存会话--会依赖cookie存id)-------------

?Session工作原理?

1)浏览器第一次访问服务器,服务器会创建session对象,给session对象分配一个唯一的ID,叫JsessionID,把JsessionID作为Cookie的值发送给浏览器保存。
        HttpSession httpSession = req.getSession(true);//true,如果没有查到会创建新的;默认是false,是不会创建的
        httpSession.setAttribute("userName", "yushengjun");
        String sessionID= UUID.randomUUID().toString();
        Cookie cookie = new Cookie("JSESSIONID", sessionID);//req所有值都会返回给客户端,把session的id存入cookie里
        response.addCookie(cookie);
2)第二次访问的时候,浏览器带着JsessionID的cookie访问服务器            
3)服务器得到JsessionID,在服务器的内存中搜索是否存放对应编号的session对象
                    if(找到){
                        return map.get(sessionID);
                    }
                    Map<String,HttpSession>]

                    <"s001", s1>
                    <"s001,"s2>
5)如果找到对应编号的session对象,直接返回该对象           
6)如果找不到对应编号的session对象,创建新的session对象,继续走1的流程
    
    结论:通过Jsession的cookie值在服务器找session对象!!!!!

?搭建和使用过程中遇到哪些问题?

1、关于同一个服务的集群状态下session共享问题解决 (假如有id,但集群2机器找不到session)
https://blog.csdn.net/Archer_M/article/details/79895707
问题: 集群状态下,登录时,如果使用传统的方式将session记录到本地,那么当访问其他服务器时,无法获取到session,又需要进行登录。 
解决办法:使用redis解决,将 session保存在redis服务器(key,value格式保存),用户登录时,服务器都去redis中进行查询session
2、sesion怎么解决发布版本失效
也用redis,发布版本后还能从redis上获取

发布了39 篇原创文章 · 获赞 0 · 访问量 778

猜你喜欢

转载自blog.csdn.net/qq_15458763/article/details/104140700