Avatar
😀

Organizations

  • 常见web服务攻击和防御手段 XSS跨站脚本攻击 XSS (Cross-Site Scripting),跨站脚本攻击,因为缩写和 CSS重叠,所以只能叫 XSS。 XSS 的原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗 用户信息或其他侵犯用户安全隐私的目的。 反射型XSS:一般是通过给别人发送带有恶意脚本代码参数的 URL,当URL被打开时特有的恶意代码参数被HTML解析执行。 防御手段: 前端渲染数据都要从后端来 尽量不要从URL、document.referrer、document.forms等这些api获取数据并直接渲染 尽量不要使用 eval, new Function(),document.write(),document.writeln()等这些可以直接执行字符串的方法 如果必须要用的话也需要对传入的字符串进行转义 前端渲染的时候也需要对字符串做转义编码 持久性XSS:一般是通过留言、评论等这些可以和后端交互的功能将带有脚本的内容存到后端数据库的,当用户查询评论的时候就可能被查询出来渲染并执行 防御手段: CSP:本质上也就是设置白名单的方式: 设置 HTTP Header 中的 Content-Security-Policy 只允许加载本站资源: Content-Security-Policy: default-src ‘self’ 只允许加载 HTTPS 协议图片: Content-Security-Policy: img-src https://* 允许加载任何来源框架: Content-Security-Policy: child-src ’none' 设置 meta 标签的方式 转义字符:转义用户输入的引号、尖括号、斜杆 HttpOnly Cookie:设置cookie时将属性设置成HttpOnly就可以避免cookie被恶意js获取
    Created Mon, 04 Nov 2019 16:50:00 +0800
  • go get拉取私有库报错 http拉取问题(>=1.6) go get github.com/sjatsh/transfo # cd .; git clone -- https://github.com/sjatsh/transfo /Users/jane/go/src/github.com/sjatsh/transfo Cloning into '/Users/jane/go/src/github.com/sjatsh/transfo'... fatal: could not read Username for 'https://github.com': terminal prompts disabled package github.com/sjatsh/transfo: exit status 128 我们刚开始学习golang的时候我们需要go get拉取某个私有库的时候经常就会遇到类似的问题,这个问题的关键在于 terminal prompts disabled 这个错误信息,问题是由于http拉取私有仓库时需要用户名密码,但是git却没有提示输入用户名密码,直接看源码: 参见源码97行: go/get.go at release-branch.go1.6 · golang/go · GitHub func runGet(cmd *base.Command, args []string) { // 这段代码默认设置 GIT_TERMINAL_PROMPT = 0 if os.Getenv("GIT_TERMINAL_PROMPT") == "" { os.Setenv("GIT_TERMINAL_PROMPT", "0") } } os.Setenv("GIT_TERMINAL_PROMPT", "0") 这行标识关闭git命令行提示 ,也就导致了上面提到的terminal prompts disabled错误。
    Created Tue, 29 Oct 2019 14:24:30 +0800
  • 简介 Rabin-Karp字符串快速查找算法和FNV hash算法是golang中strings包中字符串查所用到的具体算法,算法的核心就在于循环hash,而 FNV则是散列方法的具体算法实现。 算法思想 Rabin-Karp算法思想: 假设待匹配字符串长度M,目标字符串长度N(N>M) 首先计算待匹配字符串hash,计算目标字符串前M个字符hash 比较前两个hash值,比较次数N-M+1 若hash不相等,继续计算目标字符串下一个长度为M的hash并继续循环比较 若hash相等则再次判断字符串是否相等已确保正确性 FNV hash: 将字符串看作是字符串长度的整数,这个数的进制是一个质数。计算出来结果之后,按照哈希的范围求余数得到结果。 其中不同机制对应质数分别是: 32 bit FNV_prime = 224 + 28 + 0x93 = 16777619 64 bit FNV_prime = 240 + 28 + 0xb3 = 1099511628211 128 bit FNV_prime = 288 + 28 + 0x3b = 309485009821345068724781371 256 bit FNV_prime = 2168 + 28 + 0x63 = 374144419156711147060143317175368453031918731002211 512 bit FNV_prime = 2344 + 28 + 0x57 = 35835915874844867368919076489095108449946327955754392558399825615420669938882575 126094039892345713852759 1024 bit FNV_prime = 2680 + 28 + 0x8d = 50164565101131186554345988110352789550307653454047907443030175238311120551081474 51509157692220295382716162651878526895249385292291816524375083746691371804094271 873160484737966720260389217684476157468082573 以上这几个数都是质数(哈希的理论基石,质数分辨定理),简单地说就是:n个不同的质数可以“分辨”的连续整数的个数和他们的乘积相等。“分辨”就是指这些连续的整数不可能有完全相同的余数序列。证明详见
    Created Thu, 26 Sep 2019 12:01:30 +0800
  • 什么是平滑重启 当线上代码需要更新时,我们平时一般的做法需要先关闭服务然后再重启服务. 这时线上可能存在大量正在处理的请求, 这时如果我们直接关闭服务会造成请求全部 中断, 影响用户体验; 在重启重新提供服务之前, 新请求进来也会502. 这时就出现两个需要解决的问题: 老服务正在处理的请求必须处理完才能退出(优雅退出) 新进来的请求需要正常处理,服务不能中断(平滑重启) 本文主要结合linux和Golang中相关实现来介绍如何选型与实践过程. 优雅退出 在实现优雅重启之前首先需要解决的一个问题是如何优雅退出: 我们知道在go 1.8.x后,golang在http里加入了shutdown方法,用来控制优雅退出。 社区里不少http graceful动态重启,平滑重启的库,大多是基于http.shutdown做的。 http shutdown 源码分析 先来看下http shutdown的主方法实现逻辑。用atomic来做退出标记的状态,然后关闭各种的资源,然后一直阻塞的等待无空闲连接,每500ms轮询一次。 var shutdownPollInterval = 500 * time.Millisecond func (srv *Server) Shutdown(ctx context.Context) error { // 标记退出的状态 atomic.StoreInt32(&srv.inShutdown, 1) srv.mu.Lock() // 关闭listen fd,新连接无法建立。 lnerr := srv.closeListenersLocked() // 把server.go的done chan给close掉,通知等待的worekr退出 srv.closeDoneChanLocked() // 执行回调方法,我们可以注册shutdown的回调方法 for _, f := range srv.onShutdown { go f() } // 每500ms来检查下,是否没有空闲的连接了,或者监听上游传递的ctx上下文。 ticker := time.NewTicker(shutdownPollInterval) defer ticker.
    Created Tue, 17 Sep 2019 21:38:00 +0800
  • 第一颗人造卫星的发射成功,直接导致了冷战时期美俄两国的太空竞赛

     1957年苏联发射了人类第一颗人造卫星"Sputnik"。

     在Sputnik进入太空之后的60年间,人造卫星在科学、军事和民生等各个方面都获得了极其广泛的应用,对人类通讯方式带来了颠覆性的影响,揭开并深化了冷战,催生了互联网, 进而彻底改变了人们认识自我、观看世界的方式。

    Created Tue, 09 Oct 2018 00:00:00 +0800
  • Git与SVN的比较

    原理上

    • Git直接记录文件快照,SVN每次提交记录哪些文件更新更新了哪些行
    • Git有本地仓库,SVN没有本地仓库
    • Git大多数是本地操作,SVN大多数操作需要联网

    操作上

    • Git先提交到本地仓库然后推送到远程仓库,SVN直接推送到远程仓库
    • Git有各种"反悔"指令,SVN没有
    • Git有真正的branch,而SVN只是工作空间的副本
    Created Tue, 21 Aug 2018 17:30:00 +0800
  • TCP重传机制

    TCP确认机制属于累积确认,接收端给发送端的Ack确认只会确认最后一个连续的包,SeqNum和Ack是以字节数为单位,所以ack的时候,不能跳着确认,只能确认最大的连续收到的包, 不然发送端就以为之前的都收到了

    Created Mon, 20 Aug 2018 01:20:00 +0800
  • TCP头格式

    需要注意的几点:

    • TCP包没有IP地址,那是IP层的事。只有源端口和目标端口。
    • 一个TCP连接需要四个元组来表示是同一个连接(src_ip, src_port, dst_ip, dst_port)准确说是五元组,还有一个是协议。但因为这里只是说TCP协议,所以,这里我只说四元组。
    • Sequence Number是包的序号,用来解决网络包乱序(reordering)问题。
    • Acknowledgement Number就是ACK——用于确认收到,用来解决不丢包的问题。
    • Window又叫Advertised-Window,也就是著名的滑动窗口(Sliding Window),用于解决流控
    • TCP Flag,包类型,用于控制TCP状态机
    Created Sun, 19 Aug 2018 23:20:00 +0800
  • 算法原理

    思路是开一个数组,其下标表示1到n个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中。
    首先初始化,将数组前m个元素置1,表示第一个组合为前m个数。然后从左到右扫描数组元素值的"10"组合,找到第一个"10"组合后将其变为 “01"组合,同时将其左边的所有"1"全部移动到数组的最左端。当第一个"1"移动到数组的m-n的位置,即n个"1"全部移动到最右端时,就得到了最后一个组合。

    Created Sun, 19 Aug 2018 02:00:00 +0800
  • 算法原理

    快速排序是图灵奖得主C.R.A. Hoare与1960年提出的一种 划分交换排序,它采用了一种分治策略。
    分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

    Created Sun, 19 Aug 2018 01:30:00 +0800
Next