黑客入门必须脚本

好吧,还是直接翻译一个真实的故事,标题就是《黑客不会浪费自己的生命超过90秒》:

Project: https://github.com/NARKOZ/hacker-scripts

xxx: 是这样的,我们的构建工程师已经离职到了另外一家公司。那哥们儿天天就生活在机器的终端里,你知道的,这种家伙喜欢用Vim编辑文件、用Dot创建图表、用Markdown创建wiki帖子……如果任何东西需要他超过90秒,他就会写一个脚本。

xxx: 因此,我们来这里看看他留下的“遗产”。

xxx: 然后,你将会喜欢上这些的。

xxx: 甩我的贱人一巴掌.sh(译者注:smack my bitch up是一首被英国禁掉的歌曲) - 发送一个信息文本“晚点在工作”给他的妻子,并自动从一个数组中随机挑选一个理由。这个脚本在cron job中运行,这个脚本将在九点之后依然有SSH-session的时候触发。

xxx: Kumar的屁眼.sh - 从邮箱的inbox中扫描来自kumar(客户的DBA)的邮件。搜寻“help”、“trouble”、“sorry”等之类的关键词。如果关键词被找到,脚本将会SSH进去客户的服务器,回滚stage数据库到最新的备份。然后送一个回复给Kumar说,“不要着急,兄弟,下次要小心”。

xxx: 宿醉.sh - 另外一个cron job被设定在一个特别的日期。会发送标题为“感觉不舒服/在家工作”之类的邮件,并从一个预定义的数组里随机挑选一个原因。这个脚本将会在早上8点45没有交互式的session时被触发。

xxx: 去他妈的咖啡.sh - 这个脚本等了足足17秒,然后打开一个telnet session到我们的咖啡机(我们完全不知道我们的咖啡机是联网的,运行在linux下,并开放一个socket端口),然后发送一些命令比如sys brew,然后这些命令就会制作一个中杯的拿铁咖啡,再等24秒把咖啡倾倒入杯子里,而这个时长刚好是这家伙从座位走到咖啡机的时间。

xxx: 好可怕呀,我将会把这些都保留着。

阅读笔记:OReilly 《AngularJS: up and running》

AngularJS存在的意义

  • 传统的HTML+jQuery/Javascript框架开发的前端逻辑是放在Javascript脚本里,HTML只有展示元素的作用。

  • AngularJS可以把前端逻辑放在HTML中,通过阅读HTML直接可以得到内在的前端业务逻辑

AngularJS的基本MVC架构

  • Model

    • 是前端框架所使用到的数据
    • 数据一般来自于后台的服务
  • View

    • 是用户看到的UI
    • 用户通过View与前端程序交互
  • Controller

    • 业务逻辑放在这里
    • 是一个呈现层(Presentation Layer),用来驱动View(UI Layer)的展示与变化
    • 某些实现把这个称为viewmodel,或者representer

Angular的特点:

  1. Data-driven

    • 通过data-binding实现
    • data在服务器端和客户端双向自由流动,并且自我呈现,不需要人为干预
  2. Declarative

    • 与declarative相对应的是imperative paradigm
    • declarative的模式不需要详细定义每个step的细节
    • declarative在HTML中声明所需要的逻辑,实现由angular的内部去实现
    • 示例:

      <tabs>
          <tab title="Home">Some content here</tab>
          <tab title="Profile">
              <input type="text"
                  datepicker
                  ng-model="startDate"/>
          </tab>
      </tabs>
      
  3. Separate your concerns

    • 使用MVC或者MVC-like结构去重新定义前端的设计

      • 涉及数据部分?放在model里
      • 涉及UI部分?放在view里
      • 涉及业务逻辑部分?放在controller里
    • Angular的MVC架构并不是纯粹意义的MVC,Angular的Controller并不直接与View交互

  4. Dependency Injection

    • AngularJS完整地支持DI
    • DI是一个Java中非常常见的设计模式:
      • 通过接口约束依赖的的controller或者service的规格
      • 在服务的调用端,不需要通过new关键词或者function去实例化所依赖的对象
  5. Extensible

    • AngularJS通过提供builtin的directives去实现它的行为
    • 这些指令集(directive)是放在HTML标签声明
    • 后台的Javascript脚本通过阅读和翻译directive,去生成可以在浏览器执行的代码
    • 用户可以提供自己的directive扩展
  6. Test first, test again, keep testing

    • controller, services, directives, views, routes均被设计的容易测试
    • fast test runner: Karma
    • Protractor, WebDriver based UI testing runner

Read More

CSS跨站攻击原理与防护

参考:

https://www.linshunghuang.com/papers/css.pdf

基础知识

  1. 一个展示在用户面前的页面是由多个不同内部的文档片段组成的:

    • Script
    • CSS
    • IMG
  2. 浏览器的基本功能:

    • 浏览器是用来渲染(Render)页面的
    • 浏览器解析首页的HTML后,根据需要拉取所需的页面片段
    • 浏览器负责图片展示
    • 浏览器负责拉取script
    • 浏览器负责执行script
  3. 浏览器的安全措施:

    • 浏览器在沙盒之中运行script
    • 浏览器限制script有限访问本地计算机资源
    • 浏览器限制script有限访问本地环境信息
    • 浏览器通过同源策略控制script访问从网络上拉取的内容
      • 比如不能访问和操作不同源(Cross Origin)的图片
      • 比如不能访问和操作不同源(Cross Origin)的CSS
      • 比如不能访问和操作不同源(Cross Origin)的Cookie
      • 比如不能访问和操作不同源的API(如果要访问,需要API支持CORS)

CSS入门

  1. CSS(Cascading stylesheet)是W3C标准化的一种文档类型,用来定义HTML静态页面的外观(Appearance),而
    Javascript一般默认用来定义静态页面的行为(Behaviour)

  2. 为了以后的扩展的考虑,CSS规范强制要求了对CSS的解析采用error-tolerant。

    • 浏览器不能解析CSS时会自动跳过CSS Directive(指令)
    • 浏览器会继续执行后面可以理解的部分(directive)
    • 设计师对这种规则的利用包括:
      • 在最新的页面中使用最新的CSS技术
      • 如果旧的浏览器不能识别这种新的css directive,将会自动忽略(gracefully degrade)
  3. CSS解析系统存在的漏洞

    • 从CSS文档传进来的内容不一定全部都是合法的css directive, 比如有可能是一个HTML文档
    • 从CSS文档传进来的非法的内容也有可能被CSS Interpreter尝试解析
      • CSS文档里的内容可能是有害的脚本,会窃取宿主页面所包含的敏感信息
      • 某些宿主的页面可能需要登陆才能展示,但是隐藏在CSS中的有害的脚本可能会立即获得敏感信息即使在没有登录的前提下
        • 原因是这些页面在发起request时,已经在cookie中携带了敏感信息

原因分析

  • 首先这是一个CSS Specification的bug,因为ERROR-Tolarant Parsing的要求,导致解析器必须能够处理不能识别的css directive
  • 解析器允许一个从外部导入的文档(CSS)去覆盖(Override)一个跨源文档内的内容
    • 解析器应该在上下文中要求安全的跨源确认之后再去处理CSS

安全防护

  • 使用更加严厉的跨源内容处理规则
    • 被firefox,chrome,opera采用

To be continued