Go语言基础

分号 : 如果希望将两个或多个语句放在同一行,必须用分号分隔;一般情况下,不需要分号。

Go程序是通过包来组织的,包名为main的是一个可独立运行的包,编译后产生可执行文件。main包的main函数是程序的入口,是个没有参数也没有返回值的函数。

可以使用GOPATH环境变量或是使用相对路径来import自定义的package。Go约定如下:
1. 在import中,可以使用相对路径如./../来引用自定义包;
2. 如果没有使用相对路径,那么Go会去$GOPATH/src/目录查找。
继续阅读

白帽子讲web安全-3.服务器端安全 摘记

注入攻击

注入攻击的本质是把用户输入的数据当作代码执行。有两个关键条件,第一个是用户能够控制输入;第二个是原本要执行的代码拼接了用户输入的数据。

正确防御SQL注入

  • 使用预编译语句。防御SQL注入的最佳方式,通过预编译语句,绑定变量。因为预编译语句的执行方式是命令与数据分离的:先传输SQL语句,再发送参数值。
  • 使用存储过程。但存储过程也可能会被注入。应该尽量避免在存储过程里使用动态SQL语句。
  • 检查数据类型。
  • 使用安全函数。

从数据库自身角度,应该使用最小权限原则,为不同的应用分配不同的帐号和权限,尽量避免使用root账户。

其他注入

  • 标记注入。比如对XML注入特殊的标记,使只有一个元素的变成有两个元素等,篡改了XML的原有意义;CRLF注入,对于以CRLF为分界符的约定或协议,注入CRLF,使协议解析器误认为协议提前结束等。
  • 代码注入。比如Java里的脚本引擎,通过注入代码来执行恶意操作。对于脚本语言要特别注意。

注入小结

在对抗注入攻击时,只需牢记“数据与代码分离原则”,在“拼接”处进行安全检查,就能避免此类问题。


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

白帽子讲web安全-2.客户端安全 摘记

浏览器安全

同源策略

同源策略(Same Origin Policy)是一种约定,是浏览器最核心也是最基础的安全功能。
可以说web是构建在同源策略的基础之上的,浏览器只是针对同源策略的一种实现。

浏览器的同源策略,限制了来自不同源的document或脚本,对当前document读取或设置某些属性。

影响“源”的因素有:host(域名或ip)、子域名、端口、协议。

对于当前页面来说,页面内存放JavaScript文件的域并不重要,重要的是加载JavaScript的页面所在的域是什么。

在浏览器中,<script> <img> <iframe> <link>等标签都可以跨域加载资源,而不受同源策略限制。这些带“src”属性的标签每次加载时,浏览器发起一次GET请求。
不同于XMLHttpRequest,通过src属性加载的资源,浏览器限制了JavaScript的权限,使其不能读、写返回的内容。

Flash 主要是通过目标网站提供的crossdomain.xml文件来判断是否允许当前“源”的Flash跨域访问目标资源。
继续阅读

白帽子讲web安全-1.安全世界观 摘记

一些词汇

exploit: 黑客使用的漏洞利用代码。

黑客精神: open, free, share .

安全世界观

黑帽子、白帽子

白帽子: 指那些精通安全技术,工作在反黑客领域的专家们。
黑帽子: 指利用黑客技术造成破坏,甚至进行网络犯罪的群体。

对于黑帽子,只要找到系统的一个弱点,就可以达到入侵系统的目的;对于白帽子来说,必须找到系统的所有弱点,不能有遗漏,才能保证系统不会出现问题。

从对待问题的角度,黑帽子为了完成一次入侵,需要利用各种不同漏洞的组合来达到目的,是在不断组合问题;而白帽子在设计解决方案时,如果只看到各种问题组合后产生的效果,就会把事情变复杂,难以细致入微地解决根本问题,所以白帽子必然是在不断地分解问题,再对分解后的问题逐个予以解决。

安全的本质

被划分出来的具有不同信任级别的区域,称之为信任域,划分两个不同信任域之间的边界,称为信任边界。

数据从高等级的信任域流向低等级的信任域,是不需要经过安全检查的;数据从低等级的信任域流向高等级的信任域,则需要经过信任边界的安全检查。

安全问题的本质是信任的问题。

一切的安全方案设计的基础,都是建立在信任关系上的。 我们必须相信一些东西,必须有一些最基本的假设,安全方案才能得以建立;如果我们否定一切,安全方案就会如无源之水,无根之本,也无法完成。

一旦我们作为决策依据的条件被打破、被绕过,那么就会导致安全假设的前提条件不再可靠,变成一个伪命题。
把握住信任条件的度,使其恰到好处,正是设计安全方案的难点所在,也是安全这门学问的艺术魅力所在。
继续阅读

struts2 漏洞 和 缓存攻击

本文主要讲我对漏洞的探索和探索过程中发现的一个可以进行缓存攻击的坑。

问题

struts2 的漏洞在网上已经够热闹了,各个技术站点都是头条显示,微博上也有大佬转发。

这个漏洞的危害行在于允许执行远程命令,直接攻击服务器,危害无穷;根源在于struts2框架把用户输入的数据当作命令执行了,这也是一切注入估计的根源。

今天旁边的同事soul在调试官方给出的可攻击的demo,想看看到底是怎么攻击;我好奇的是既然攻击可以远程启动一个子进程的话,那么那些输入的java代码应该会被编译,然后再执行,如果是这样的话,这框架不会是对每个输入都进行动态编译吧,这会很影响性能的,所以我想看看struts2到底是怎么处理的,就看我同事调试。
继续阅读

编程珠玑 笔记

《编程珠玑》这本书无需多说,他的价值不在于这里摘录的只言片语,而在于阅读过程中思维上的学习,在解答习题时思维上的锻炼过程。

第一部分 基础

第一章 开篇

准确的问题描述:输入、输出、约束。在尝试解决问题之前,先将已知条件组织成一种更客观、更易用的形式。

确定用户的真实需求是程序设计的根本。

对小问题的仔细分析有时可以得到明显的实际益处。

简单的设计。法国作家兼飞机设计师 Antoine de Saint-Exupery:设计者确定其设计已经达到了完美的标准不是不能再增加任何东西,而是不能再减少任何东西。

第二章 啊哈!算法

Martin Gardner:看起来很困难的问题也可以有一个简单的、意想不到的答案。

优秀程序员都有点懒:他们坐下来等待灵机一动的出现而不急于使用最开始的想法编程。当然,这必须通过在适当时候开始写代码来加以平衡。真正的技能就在于对这个适当时候的把握,这只能来源于解决问题和反思答案说获得的经验。

第三章 数据决定程序结构

恰当的数据视图实际上决定了程序的结构。

将数据从控制结构中分离会获得许多好处。

能用小程序实现的,就不要编写大程序。

发明家悖论:更一般性的问题也许更容易解决。

程序员在节省空间方面无计可施时,将自己从代码中解脱出来,退回起点并集中心力研究数据,常常能有奇效。(数据的)表示形式上程序设计的根本。

退回起点进行思考时的几条原则:

  • 使用数组重新编写重复代码。冗长的相似代码常常可以使用最简单的数据结构–数组来更好地表述。
  • 封装复杂结构。
  • 尽可能使用高级工具。
  • 从数据得出程序的结构。通过使用恰当的数据结构来替代复杂的代码,从数据可以得出程序的结构。万变不离其宗:在动手编写代码之前,优秀的程序员会彻底理解输入、输出和中间数据结构,并围绕这些结构创建程序。

继续阅读

iframe cookie p3p

问题

参与一个客户端产品的开发,这个产品有几个模块的开发方式是这样的,C++代码调用浏览器组件加载本地一个html页面,这个页面主要是展现一些边框、条幅,为的是跟C++开发的模块的风格看起来像,这个页面的主要内容是通过iframe调用别的web服务器的页面的。

今天一个模块的出问题了,经过定位,问题是这样的:iframe引入的页面设置了一个cookie,但后续的js请求数据时却没有发送这个cookie,而服务器会检查这个cookie,所以验证失败,在客户端表现为没响应。

问题缘由

IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification) 协议默认阻止第三方无隐私安全声明的cookie。

在默认情况下IE会自动禁用第三方站点(不同域的站点)的cookie, 也就是在请求第三方站点的某url时在HTTP header里不发送它们的cookie。

在这个客户端产品里,浏览器组件首先加载的是本地的html页面,然后用iframe加载web服务器的一个页面,那么web服务器的页面所在的域与于本地的页面所在的域是不同的,就存在跨域了,所以浏览器组件阻止发送cookie。

继续阅读

wget 备忘

今天要从github下个库很慢,突然来了这个命令:ssh coderbee@coderbee.net 'wget https://github.com/sbt/sbt-assembly/archive/master.zip && cat master.zip' > master.zip,把vps当作下载中转站了,速度还行。

下完后觉得wget还是很nice的,以前也用来下载过一些api文档,多学习点。

wget介绍

wget 是非交互式(可以在后台运行)的网络下载工具,支持的协议有HTTP、HTTPS、FTP。

wget 可以解析并获取HTML、XHTML和CSS页面里的链接,创建远程web页面的本地版本,完全重建原始页面的目录结构。可以命令wget转换已下载文件里的链接指向本地文件,用于离线浏览。

wget的健壮性可用于慢速或不稳定的网络连接;如果下载由于网络问题失败,wget会重试直到文件下载成功。还支持断点下载,如果服务器支持的话。

使用方式: wget [option]... [URL]...
继续阅读