# 1. 跨域问题

  • JSONP:
    • 动态插入 script 标签,通过 script 标签引入一个 js 文件,这个 js 文件载入成功后会执行我们在 url 参数中指定的函数,并且会把我们需要的 json 数据作为参数传入。
    • 由于同源策略的限制,XmlHttpRequest 只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过 script 标签实现跨域请求,然后在服务端输出 JSON 数据并执行回调函数,从而解决了跨域的数据请求。
    • 优点是兼容性好,简单易用,支持浏览器与服务器双向通信。缺点是只支持 GET 请求。
  • CORS:
    • 服务器端对于 CORS 的支持,主要就是通过设置 Access-Control-Allow-Origin 来进行的。如果浏览器检测到相应的设置,就可以允许 Ajax 进行跨域访问。

# 2. TCP 三次握手、四次挥手过程

  • 三次握手:
    1. 发送端首先发送一个带 SYN 标志的数据包给对方。
    2. 接收端收到后,回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。
    3. 最后,发送端再回传一个带 ACK 标志的数据包,代表"握手"结束。

      注意

      若在握手过程中某个阶段莫名中断,TCP 协议会再次以相同的顺序发送相同的数据包。握手过程中使用了 TCP 的标志:SYN 和 ACK。

  • 四次挥手:
    1. 主动关闭方发送一个 FIN,用来关闭主动方到被动关闭方的数据传送,但此时主动关闭方还可以接受数据。
    2. 被动关闭方收到 FIN 包后,发送一个 ACK 给对方,确认序号为收到序号 +1。
    3. 被动关闭方发送一个 FIN,用来关闭被动关闭方到主动关闭方的数据传送。
    4. 主动关闭方收到 FIN 后,发送一个 ACK 给被动关闭方,确认序号为收到序号 +1,至此,完成四次挥手。

# 3. 常见 web 安全及防范

  • sql 注入原理:就是通过把 SQL 命令插入到 Web 表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的 SQL 命令。
  • 防范:
    1. 要对用户的输入进行校验。
    2. 不要使用动态拼装 SQL,可使用参数化的 SQL 或者直接使用存储过程进行数据查询存取。
    3. 不要使用管理员权限的数据库连接。
    4. 不要把机密信息明文存放。 ……
  • XSS 原理: Xss 攻击指的是攻击者往 Web 页面里插入恶意 html 标签或者 javascript 代码。
  • 防范:
    1. 输入的地方对特殊字符做好过滤。
    2. 需要通过 js 动态写入 html 时,要加以 encode 避免标签暴露出来。
    3. 避免直接在 cookie 中泄露隐私信息。
    4. 将 cookie 与系统 ip 绑定来降低 cookie 泄露后的风险。
    5. 客户端如果不需对 cookie 操作,可在 Set-Cookie 末尾加入 HttpOnly。
    6. 尽量采用 POST 而非 GET 提交表单。
  • CSRF 原理: XSS 是获取信息,不需要提前知道其他用户页面的代码和数据包。CSRF 是代替用户完成指定的动作,需要知道其他用户页面的代码和数据包。
    • 完成一次 CSRF 攻击所需要的步骤:
      1. 登录受信任网站 A,并在本地生成 Cookie。
      2. 在不登出 A 的情况下,访问危险网站 B。
  • 防范:
    1. 客户端页面增加伪随机数。
    2. 通过 token 校验等验证码的方法。

# 5. HTTP 和 HTTPS

  • HTTP 协议通常承载于 TCP 协议之上,在 HTTP 和 TCP 之间添加一个安全协议层 (SSL 或 TSL),这个时候,就成了我们常说的 HTTPS。

  • HTTP 默认端口号为 80, HTTPS 默认端口号为 443。

  • 为什么 HTTPS 安全?

    • 因为网络请求需要中间有很多的服务器路由器转发,中间节点都可能篡改信息。如果使用 HTTPS,秘钥在你和终点站才有。https 之所以比 http 安全,是因为它利用 ssl/tsl 协议传输。它包含证书,卸载,流量转发,负载均衡,页面适配,浏览器适配,refer 传递等。保障了传输过程的安全性。

# 6. 一个页面从输入 URL 到页面加载显示完成

  1. 当发送一个 URL 请求时,不管这个 URL 是 Web 页面的 URL 还是 Web 页面上每个资源的 URL,浏览器都会开启一个线程来处理这个请求,同时在远程 DNS 服务器上启动一个 DNS 查询,这能使浏览器获得请求对应的 IP 地址。
  2. 浏览器与远程 Web 服务器通过 TCP 三次握手协商来建立一个 TCP/IP 连接。该握手包括一个同步报文,一个同步 - 应答报文和一个应答报文,这三个报文在浏览器和服务器之间传递。该握手首先由客户端尝试建立起通信,而后服务器应答并接受客户端的请求,最后由客户端发出该请求已经被接受的报文。
  3. 一旦 TCP/IP 连接建立,浏览器会通过该连接向远程服务器发送 HTTP 的 GET 请求。远程服务器找到资源并使用 HTTP 响应返回该资源,值为 200 的 HTTP 响应状态表示一个正确的响应。
  4. 此时,Web 服务器提供资源服务,客户端开始下载资源。
  • 浏览器会解析 HTML 生成 DOM Tree,其次会根据 CSS 生成 CSS Rule Tree,而 javascript 又可以根据 DOM API 操作 DOM。

# 7. GET 和 POST 的区别

  • GET:一般用于信息获取,使用 URL 传递参数,对所发送信息的数量也有限制,一般在 2000 个字符。
  • POST:一般用于修改服务器上的资源,对所发送的信息没有限制。
  • GET 方式需要使用 Request.QueryString 来取得变量的值,POST 方式通过 Request.Form 来获取变量的值
    GET 通过地址栏传值,POST 通过提交表单来传值。
    • 以下情况使用 POST 请求:
      1. 无法使用缓存文件(更新服务器上的文件或数据库)
      2. 向服务器发送大量数据 (POST 没有数据量限制)
      3. 发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠

# 8. HTTP 状态码

  1. 100 Continue 继续,一般在发送 post 请求时,已发送了 http header 之后服务端将返回此信息,表示确认,之后发送具体参数信息。
  2. 200 OK 正常返回信息。
  3. 201 Created 请求成功并且服务器创建了新的资源。
  4. 202 Accepted 服务器已接受请求,但尚未处理。
  5. 301 Moved Permanently 请求的网页已永久移动到新位置。
  6. 302 Found 临时性重定向。
  7. 303 SeeOther 临时性重定向,且总是使用 GET 请求新的 URI。
  8. 304 Not Modified 自从上次请求后,请求的网页未修改过。
  9. 400 BadRequest 服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。
  10. 401 Unauthorized 请求未授权。
  11. 403 Forbidden 禁止访问。
  12. 404 NotFound 找不到与 URI 相匹配的资源。
  13. 500 InternalServer Error 服务器端错误。
  14. 503 ServiceUnavailable 服务器端暂时无法处理请求(可能是过载或维护)。