分类 Web 相关 下的文章

Unicode 字符集 和 UTF 编码

  1. Unicode 是字符集, 类似ASCII 码有127字符, Unicode 已经包含17个planes, 每个plane包含65536个代码点(code point)
  2. UTF 是Unicode字符集的编码, 就是Unicode 字符集在磁盘的表示, 参考这篇很不错的文章 十分钟搞清字符集和字符编码
  3. Windows 和 Java 默认使用 UTF-16, Web 默认使用 UTF-8
  4. UTF-8 兼容ASCII
  5. 非英文域名 即 IDNs 要使用 Punycode 去转. 尽管你的URL的域名部分是 新华网.中国 或 %E6%96%B0%E5%8D%8E%E7%BD%91.%E4%B8%AD%E5%9B%BD (encodeURI("新华网.中国")的结果) 在去到DNS 解析的时候, 都是翻译为 Punycode 去做DNS 查询的
  6. Unicode 要区分 字符, codepoint, UTF 编码后的值 如 : 田 的codepoint 是30000 (0x7530), UTF-8 编码后是: E794B0 (使用 encodeURI("田") 得到)

JavaScript 数字 字符 转换

  1. 数字进制转换
    (10).toString(8) //10进制到8进制
    (077).toString() //8进制到10进制
    (0x11).toString(8) //16进制到8进制
    (0x11).toString(10) //16进制到10进制
    (0x11).toString(2) //16进制到2进制
    (0x11).toString(3) //16进制到3进制

    3进制转换为16进制
    parseInt("122", 3).toString(16); 先要转换为10进制, 然后再通过10进制转换为16进制

  2. 字符-数字 转换
    String.charCodeAt()
    String.fromCharCode()
    String.prototype.charAt()
    String.fromCodePoint()
    String.prototype.codePointAt()

浏览器 同源策略

  1. 3个关键点 scheme, host, port in URL. IE 浏览器有一点点特殊: https://en.wikipedia.org/wiki/Same-origin_policy
  2. Same Origin Policy 只是禁止读取返回的信息, 并不禁止发送请求, 所以其实请求已发出,浏览器以及收到,只是发现不符合这个策略而终止. prelight 可以通过2步, 来避免发出真正的请求. 也就是有的文档提到的 禁止读, 不禁止写.
  3. 正因为不禁止发出请求, 所以同源策略不能阻止 CSRF 和 clickjacking;
  4. 尽管有同源策略,不同的网站还是可以通过link 相互关联, 跨站使用img, CSS, Javascript, 常见适用同源策略的是AJAX 请求,iframe 等;
  5. 尽管通过同源策略限制了 AJAX, 但是有些时候要需要跨站资源共享, 所以就有了 CSRS (Cross Site Resource Sharing)相关的http header;
  6. 同源策略的内容
  7. IE 浏览器的特殊之处: a: trust zone 里面的可以任意跨域, b: 端口号 不用来区分跨域. 这些都是非标准
  8. 可以通过 document.domain="company.com" 来让多个子domain之间或子domain 与父domain 之间实现跨域(同时端口号被设置为null);
  9. 如何绕过同源策略 详细文档
  10. CSRS
  11. JSONP
  12. window.postMessage Cross-document messaging
  13. 同一个主域下如果协议和端口一样, 可以通过设置 window.domain 来处理(只能从长到短)
  14. WebSocket
  15. window.name 传递
  16. 如何避免跨站写?
  17. CSRF token
  18. 如何防止跨站读?
  19. 使你的资源不可被嵌入(img, CSS, JavaScript): 更改资源 Content-Type, 使用动态CSRF token;
  20. 跨站的请求不能定制 HTTP header, 不跨站的则可以.

HTML 编码

URL 编码

URL使用%编码,即 %后边跟该字符对应的 UTF-8 编码后的16进制值, 每2个前面加一个%, 不是codepoint.
如 encodeURI("新华网.中国") = %E6%96%B0%E5%8D%8E%E7%BD%91.%E4%B8%AD%E5%9B%BD
如 %65bay.com = ebay.com

JavaScript 使用 escape(), encodeURI(),encodeURIComponent(). escape() 方法已经被废弃

  1. 协议或schema 是固定的那么些协议
  2. 主机名 只能是白名单(字符数字和-)里面的
  3. path 浏览器一般使用UTF-8 去解码
  4. query 参数 一般使用html的Content-Type去解码
  5. anchor 一般使用UTF-8 ? 还是用 Content-Type 去解码?

HTML 内容编码

HTML 文档里可以出现2种编码

  1. <, >, &, ', ", 空格, 这些HTML 标签使用的的编码, 可以使用 %gt; %lt; %nsbsp; 来编码;
  2. 另外可以用Unicode的进制编码 %#xH; (16进制), %#DD (10进制)编码

JavaScript: 这个问答有2个非常好的答案 HTML-encoding in JavaScript/jQuery
Java 版本:

import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
String escaped = escapeHtml4(source);

JavaScript 内容编码

  1. 某些控制字符 \t, \r \n \b \v \f
  2. 8进制3位数字 \145 : e \060 :10进制0
  3. 16进制2位数 \x65 \x30
  4. Unicode 4位数 \u0065 \u7530 \u0061lert(1) 这种能用在字符串之外的位置, 其它则不可

CSS 编码

  1. CSS 属性中可以使用十进制, 十六进制表示
  2. CSS 兼容HTML中的进制表示法.