2015年5月31日星期日

一次成功又失败的面试

       昨天去一个公司面试,做的事情侣移动应用。面试官太能说了,他说起话来可以持续很久的时间,听得我好累,对我这样反应比较慢的人来说好痛苦。
       他先问了我:"xxxxx学院是本科吧?",我说是的(高考考不好害死人啊...),接着说对我简历上的项目很有兴趣(其实那个东西很水,做得很烂,我参与的程度很低,简历实在没得写,哎),和他扯了几句,估计他也没听懂究竟是什么。
       接着他说要的是主程序,我就心虚了,我这种水货,怎么当主程序啊?! 然后他就开始balabala扯公司的前景和产品啥的,听得我一愣一愣的,然后就问我期待工资多少。其实我不太会谈工资,招聘网站上写的xx-xx,我直接说了个y,当然是比xx要少的,他就问我:"你觉得自己值这个价吗?"。我心里咯噔一下,这又是要鄙视我的啊(之前被鄙视太多了,还有直接给个3K的,应届生也不能只给3K啊。)。我竟无言以对,也没说出来个123,他竟然也没说什么,吓我一跳。接着说产品什么什么的,我跟着有一搭没一搭的扯着,最好搞了半天,他表示很看好我,问了我两次有没有其他面试我晕死啊,我几乎什么都没说,他一个技术问题也没问,如果我是面试官的话,根本看不出来自己的价值,肯定直接让我get out office了。看不出来是我在出卖劳动力还是他在销售产品。这公司肯定急缺人手,但是也不能这样玩吧,只看简历能看出来什么东西,难道是我的屌丝气质吸引了他?!这对公司和个人都是很不负责的事情。因为程序这种工作,还是要看看过去的代码,只看简历是没有用的,仅仅凭一个小时,看简历嘴上说说,怎么看出来一个人能不能做事情,这也太草率了。
       这次面试对我来说是成功的,因为我的求职目的达到了,同时也是失败的。因为我可能根本无力升任这个工作,真是纠结,不知道到底去不去,哈哈,可能我就是个矛盾体吧,很少自信,不过做事情的能力还算可以,真是撑死胆大的,饿死胆小的。

2015年5月25日星期一

为什么要有同源策略

   同源策略,是一个在Web应用安全中的一个重要的模型,它定义了两个站点之间是否可以执行彼此的脚本,比如A站不能通过脚本访问B站的cookie,不然会用户的信息毫无安全性可言了。
我们学会了如何解析URL,就好理解同源策略了,它的定义是:如果两个页面拥有相同的协议(protocol),端口(如果指定),和主机,那么这两个页面就属于同一个源(origin)。那么两个在URL中:
scheme://[login[:password]@](host_name|host_address)[:port][/hierarchical/path/to/resource[?search_string][#fragment_id]]
scheme,host_name,port就决定了是否同源。具体实例可以参考MDN
那么为什么要有同源策略,没有的话怎么样,这篇文章里说,如果没有同源策略的话,你的个人信息容易被获取到,但是没说如何获取,在不同的浏览器Tab中,总无法读取另一个页面的DOM吧,简单的方法是使用iframe,我们看一个简单的例子,使用本地文本one.html作为一个含有敏感信息的网站:

one.html:
<input type="text" value="myuser" id="user" /> <br> <input type="password" value="123456" id="pwd" />
通过iframe.html读取它的信息,并把iframe隐藏掉:
<!DOCTYPE html> <html lang="en"> <head> <title>fream</title> <style> iframe { display: none; width: 1000px; height: 500px; } </style> <meta charset="UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <script> window.onload = function () { var iframe_one = document.getElementById('one-iframe'); var iframe_one_document = iframe_one.contentWindow.document; alert(iframe_one_document.getElementById('user').value + ' with password: ' + iframe_one_document.getElementById('pwd').value); } </script> <iframe id="one-iframe" src="./one.html" /> </body> </html>
这样就很容易得到有用的信息了,如果不同的域之间可以随意获取DOM对象数据的话,那么随便造很多网站就能得到其他网站的信息了,那样就无所谓安全了。 出于这样的考虑,有了同源策略,在同一个域下的脚本才能进行DOM操作,想要进行跨域操作的话,常见的是使用CORS或者JSONP,那将是另一个主题了。 如何绕过同源策略,更是一个有意思的安全问题,以后再深入学习吧。 参考: 1.同源策略——浏览器的安全卫士 2.JavaScript 的同源策略

2015年5月24日星期日

解析URL

  URL,就是我们天天使用的网址,英文全称叫做uniform resource locator,你可以把它理解成互联网上每个页面独一无二的名字。其实也不全是页面了,比如一些FTP下载资源,或者网页上的mailto链接,都是使用URL表示的。其实URL就相当于互联网字典上的索引,这些资源本来是一个个的孤岛,被一些工具(比如搜索引擎)整合后,使得互联网得以连接,所有的links加起来,就是我们看到的互联网了
URL的语法如下:
scheme://[login[:password]@](host_name|host_address)[:port][/hierarchical/path/to/resource[?search_string][#fragment_id]]
一个一个看:
  scheme,不是那个满屏幕小括号的编程语言,而是方案的意思,其实我认为可以理解成打开一个互联网资源的方式,比如http和ftp就是不同的方式,常用的scheme包括http,https,ftp,mailto,javascript,file(一般是打开本地浏览器可以打开的资源时使用的),chrome(Chrome浏览器特有的,一般用于插件)。scheme名称后加一个冒号,标准写法是在':'前只能出现[a-z][A-Z][0-1]+-.这些字符的,但是很多浏览器对于额外的字符也能够解释,比如下面这样的HTML代码,对于Chrome也是可以解析的:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>scheme</title>
</head>
<body>
    <a href="http:

www.baidu.com">baidu</a>
<a href="javascript	:alert(1);">javascript alert()</a>
</body>
</html>
& # 0 9 ;(合起来)在HTML中是TAB的转移字符,可以在free-formatter中转义回来。
不过对于Firefox第二个弹窗代码就没法使用了,它解释成了file:///Users/zookeep/Desktop/web/javascript:alert%281%29;一个本地文件的相对路径地址.

对于Safarier,会把第一个URL解释成http:%0A%0A//www.baidu.com其中的换行符变成了line feed就无法打开百度了。

对于scheme,我们试试file一个本地可执行文件hello.exe,发现它没法执行文件而是把它下载下来了,看来file方法只能打开浏览器可以识别的格式的文件,比如html,PDF等。

scheme后面跟了两个反斜杠//,如果不写的话,又会怎么样:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>without //</title>
</head>
<body>
    <a href="http:baidu.com">baidu</a>
    <a href="./http:baidu.com">baidu</a>
</body>
</html>
第一个没有指定目录,会被解释成和http://baidu.com一样的URL,而加上./(表示当前目录),则会被解释成一个本地的目录.
如果我们省略掉scheme的话,只用//filename的话又会怎样:

Chrome下 //filename 会打开本地文件 
Safair 则没反应
IE 会转到http://hello

下面是[login[:password]@]用户的认证信息,这个其实现在用处不大,几乎没人会让用户这样验证,都是表单验证了。
不过这个认证信息选项会让一些URL看起来很邪恶,我们以后再看。

接下来是主机名或者主机IP地址,比如localhost,或者一个域名google.com或者一个IP:http://74.125.130.99(同样是Google).不过这些常规的写法大家都明白,那么一些猥琐的写法可以是这样的:
http://0x7f.1
http://017700000001
同样都是localhost的表示,第一个是把点分十进制第一个127写成16进制,其他三个组成一个数字,第二个是把127.0.0.1每一个十进制都转为8进制然后加个0表示八进制的IP。 对于Google地址 74.125.130.99我们也可以这样写: >>> a = '74.125.130.99' >>> map(hex, map(int, a.split('.'))) ['0x4a', '0x7d', '0x82', '0x63'] >>> '.'.join(map(hex, map(int, a.split('.')))) '0x4a.0x7d.0x82.0x63' 或者: >>> '.'.join(map(oct, map(int, a.split('.')))) '0112.0175.0202.0143' 对于端口号倒是没什么可以玩的,记住常用的http是80, https是443就行了。 下一个是路径和资源比如/home/user/index.html这样的文件,不过现在很多都不显示文件的后缀了,因为都是动态网站了... 下一个是查询字符串,这个就很有用了,比如使用taobao的时候你输入的查询内容就会被填充到query中, 比如taobao.com/search?q=html就能在taobao找到你要的宝贝了... 下一个是片段ID,这个可是个好东西,不过注意它和服务器可是没有交互的,只是会在当前页面找到一片内容,由浏览器跳到那里去, 更多的内容可以参考 这里。 好了,我们基本上看完了URL的基本解析方式,那么如下的URL到底会把你带到哪里: http://qq.com&location=12306.com@evil.net http://a@b@c.com http://www.sina.com&id=123@0300.0250.01.01 ok,看第一个,这不就是qq嘛,好了,你把它输入Chrome一看,跑到了evil.net什么鸟玩意... 第二个,也许会是a@b@c.com,进去看看再说,不过Chrome把我们带到了c.com 第三个,估计是sina网吧...好吧,它把我带到了我的路由器登录页上.这是什么乱七八糟的?! 其实,URL的解释是没错的,不过我们忽视了登录信息罢了,[login[:password]@]: 第一个URL中,qq.com&location=12306都被当做了你访问evil.net的用户名了 同样的a@b也被当成c.com的认证消息了, 第三个也是一样,只不过把域名换成了一个IP地址,更加难以看出真实的hosts是谁.如果再用HTML转义一下,估计就没人能看清楚了,哈哈... 不过我发现,万能的Chrome还是可以在你的地址栏中高亮出真实的网址:
关于URL的解析我们算是搞明白了。

2015年5月20日星期三

涂鸦一个favicon

今天看这篇文章时候,看到示例代码在终端的结果如下:

GET / HTTP/1.1
Host: localhost:9999
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: csrftoken=sBvCVUzotPqq7jaeE52zOK3caXkMldSD


GET /favicon.ico HTTP/1.1
Host: localhost:9999
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36
Accept: */*
Referer: http://localhost:9999/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: csrftoken=sBvCVUzotPqq7jaeE52zOK3caXkMldSD
我明明只是请求了根目录,Chrome却把/favicon.ico也一起请求过来了,不过没有设置favicon,就是空的。于是在tree house里看看如何设计一个favicon,发现一个有意思的web应用--X-Icon, 可以随意画画,画出来一个favicon,我也画一个玩玩:
新建一个HTML,代码如下,并把下载来下的favicon.ico放到一个目录下,打开的时候就有自己的网页图标了:
<link href="favicon.ico" rel="shortcut icon"/ >
这个宝贝还是挺好玩的,不过还是我随便画的图片更好玩一点,哈哈。

听声音判断性格

1.喜欢用质疑语气说话的人,往往比较强势。
2.说话语速快而且皱眉的人,往往耐性较差。
3.说话有气无力,让人觉得总想要休息一下的人,往往不是很自信,或者在思考。
4.说话时总是笑着的人,未必真的高兴。
5.胖的人一般比较好说话。(他们的声音一般比较粗,细声细气的人不好说话)
6.声音娘的男人不好说话。

PS:个人经验,未必靠谱。

2015年5月11日星期一

骇客交锋里的代码(code in blackhat)

       一直以来,对黑阔电影的里的代码比较感兴趣,最新新出了一部叫做<骇客交锋>的电影。 王力宏,汤唯和一个歪果仁(我不很了解)主演的,听电影的名字应该还不错。不过,票房和口碑貌似不怎么样,屏幕里的代码和命令倒是可以看看(据说:谷歌的工程主管,被称为“信息安全公主”的帕里萨·塔布瑞兹评价本片是她所见过的“最为准确的有关信息安全的电影”~),本着无聊加学习的心态,来看看这部电影里的代码:

1.貌似是C语言或者C++,看起来还像那么回事:

2.ssh登录远程主机,嗯:

3.cat命令得到文件内容,不过autorun.inf和mssvc就不太科学了,Unix系统下应该失效的吧:

4.陈小姐拽的两句术语还挺专业的:
  Your network is sitting behind deep packet inspection intrusion protection.

5.ls命令列出目录下文件:

6.WRT和onion router,挺专业:

7.who命令查看登录者:

8.whois查询IP网段和所有人,不过这个IP是个假的,而且显示也不太专业~:

9.write向其他终端写入字符,sdksdk这名字不错:

10.GNG加密

11.社会工程欺骗--下载的PDF原来是个keyboard-logger,不过,貌似是个文档啊,officer看都不看...




12.贴出来一个401未授权认证的静态网页就是IP地址了?401的页面应该是动态加载的吧(我只见过404是写死的)而且明明指的是ACCESS嘛,没看懂怎么回事...


13.mount命令挂载移动硬盘:


14.貌似Python的代码,不过==写成了=,二层if中也没加:另外返回值都是空的:



        总的来看还不错,不过硬伤也有。比起来其他黑客电影里,啪啪啪一通键盘,就关灯了(又可以继续啪啪啪了,嘿嘿),还是算可以的。从硬件到电路的特效做得也不错,不过电影本身不知道为什么这么不给力,哎,真为王力宏难过...

  PS:我们的解放军叔叔的普通话也太不正宗了...

2015年5月5日星期二

数据库基本概念

      一直以来对数据库都不太熟悉,在公司设计到的表也大多是一张或者两张,关联也很少做。 所以一直都不大懂数据库,SQL语句也只会最简单的。现在需要好好把基础概念搞清楚。

 一、数据库表 如果一个Excel文件是一个数据的话,那么一个Sheet就是一张表,一个数据库中可以有多张表,不过数据库中叫做Table。


 二、字段 Excel的一个Sheet中有行和列,数据库表中也有。第一行一般是字段的集合,剩下的每一行表示每一条记录,每一列表示这个字段的所有值。字段就是用于描述一个Table的属性的最小单位,如人口表中的姓名,年龄等等。


 三、键 和一本汉语字典类似,我们总希望快速地找到一个汉字的说明,一般使用拼音去找,这里的拼音就是键。不过拼音不能当成主键,因为有同音字,而主键是不能有重复的。每个表最好都有主键,如果没有的话,最好有一个唯一标识每条记录的字段。如IP定位库中,经常使用的是将每个点分十进制转为32位无符号整数所表示的数字,也能当做主键使用,可以减少一个字段的使用,减少空间占用。

 外键:如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外关键字。由此可见,外关键字表示了两个关系之间的联系。以另一个关系的外关键字作主关键字的表被称为主表,具有此外关键字的表被称为主表的从表。外关键字又称作外键。外键经常用来关联两张表使用。

 四、记录 记录,如果看Excel的话,就是每一行的数据,记录都是按照行(或者条)计数的。

 五、视图 视图也叫做虚表,即不是一个实际存在的表。一般情况下,是将几张表关联起来得到的一个数据集合,交给用户使用。如果更改视图中的数据,那么原始表中的数据也会修改,所以使用最好是只读的,这样不仅可以隐藏真实的表结构,而且根据业务定制视图函数,不用每次都去关联,更加灵活。

六、关系
     两张表的关系,在数据库中的Table,不像Excel中的Sheet,一般情况下,可能表和表之间都有些联系。两两之间的关系有三种:

 1.一对一的关系:
       比如领结婚证登记的时候,两个人都要登记,如果分成两个表,分别表示男女的话。
那么最简单的可以用两个字段就能描述婚姻关系了,自己的身份证+配偶的身份证。如果一方的删除,另一方的一定也要删除。正常情况下,不允许出现其它的情况。

2.一对多的关系:
       最经典的就是学生和班级的例子,班级有班级号码1,2,3等等,学生有学号0000-9999,学生表中还有班级号表示属于哪个班级的字段。这就是一个一对多的关系,一个班级对应多个学生,而一个学生只能对应一个班级。

3.多对多的关系:
        比较好的例子是公交车和公交站,一个公交站上可能有好几路公交车,一个公交车对应了很多个公交站。用公交车的路数找公交站,能找到很多个,同样,使用公交站牌号找公交车也能找到很多个。一般多对多的关系比较复杂,还是尽可能设计成一对多或者一对一的关系。

七、数据库设计的简单原则:

   0)每个表表示单一的主题,比如建立动物的数据库的表,最好不要设计成这样的字段。
   海洋 陆地 哺乳动物 非哺乳动物 因为他们的主题不是单一的,以至于难以给它起个名字。
   1)最好给每个表加一个主键,而且加上约束,比如在0-MAX_INT之间的数字。
   2)主键的值最好是不能修改的值,也最好不要更改主键的值。
   3)字段名字不用缩写,比如xsh,很难想出来他是学生号的意思,即便用拼音也要全拼。
   4)数据库中每个字段有唯一的名字,除非有关联的情况,不然最好在整个数据库中仅出现一次,
     比如每个表中最好不要都起一个ID作为主键名字,加上些描述性单词。
   5)最好给一些字段加上约束,避免出现错误的情况,比如性别,限定为男女,或者01,其他值都是非法的。
   6)每个字段最好只有一个部分,避免多部分字段。比如一个国内电话号码的字段,最好分开设计为两个字段:城市区号和电话号码。这样不仅方便查找,也方便更新。
   7)每个字段只有一个值,避免多值字段。比如学生选修课程这个业务,避免设计成一张表,包含课程号,加上N个选修的学生名字。这样难以查询和维护,这是一个多对多的关系,可以拆成三个表,一个课程表(主要包括课程号,课程描述),一个学生表(主要包括学生号,学生选课号),一个学生选课表(主要包括学生号,课程号)。这样就把多对多的化解掉了,方便查找和更改。
   8)减少关联表中的重复字段,有些字段可以通过两个表关联表得到,那么他们不应当作为表的自段,可以得到一个视图或者临时表,但是没必要设计成基表的字段。这样会使得表的结构臃肿。