前言
HTML(超文本标记语言——HyperText Markup Language)是构成Web世界的基石。它描述并定义了一个网页的内容。其他除HTML以外的技术则通常用来描述一个网页的表现/展示效果(CSS)或功能(JavaScript)。
内联元素和块元素的特点
- block(块)元素的特点
①总是在新行上开始; ②高度,行高以及外边距和内边距都可控制; ③宽度是它的容器的100%,除非设定一个宽度。 ④它可以容纳内联元素和其他块元素
- inline元素的特点:
①和其他元素都在一行上; ②高,行高及外边距和内边距不可改变; ③宽度就是它的文字或图片的宽度,不可改变 ④内联元素只能容纳文本或者其他内联元素
CSS (Cascading Style Sheets)
JavaScript
- Web 设计模式 MVC 和 MVVM
jQuery 写的代码常常直接用 dom 来和 data 打交道,需要「手动地」更新页面。反之 MVC 和 MVVM 通常把数据存储在 model 这个 layer 上,通过一定的绑定机制实施更有效率的页面渲染和更新(V和M 是双向的关联即双向绑定,可以随时更换掉V、M)
Node.js-基于 Chrome v8 引擎实现了一个跨平台 JavaScript 运行环境
能不能把浏览器 DOM API 换成用户操作系统的 API?这样 JS 看起来就更像一门「真正的语言」,即可以在用户本地环境而不只是在浏览器中运行。
- Node.js 只是一个运行环境,类似于 Java 的 JVM,最重要的还是 JavaScript 本身。
参考资源
1、CSS 是层叠样式表(Cascading Style Sheets)的缩写,它是用来定义你的 HTML 的展现形式的一种语言。比如让你的 HTML 里的文字显示不同字体,一个元素显示不同的高度。
2、模板引擎:复用重复的模板,减少代码量,提高可维护性 https://github.com/pugjs/pug
3、CSS 处理器:嵌套的风格让作用域更清晰,尽可能地只用标准的 CSS 属性然后让 CSS 处理器帮你兼容其它浏览器。https://github.com/postcss/postcss;
现成的插件https://github.com/postcss/postcss/blob/master/docs/plugins.md
4、HTML+CSS 小结:用模板引擎、CSS 处理器可以让你更好地写 HTML/CSS
- 实战 SSH 端口转发
#本地转发: ssh -L <local port>:<remote host>:<remote port> <SSH hostname> #远程转发: ssh -R <local port>:<remote host>:<remote port> <SSH hostname> #动态转发: ssh -D <local port> <SSH Server>
- shadowsocks + 一台海外 VPS + Chrome(SwitchyOmega)/Firefox(AutoProxy)
有了海外 VPS,你就可以登上去部署 shadowsocks 服务端了,然后在本机部署上 shadowsocks 客户端,一条翻墙的梯子就初步打通了。
- 零基础如何学习 Web 安全?
安全问题都体现在“输入输出”上,一切的安全问题都存在于“数据流”的整个过程中。 1. 如果Linux的Bash环境把“特殊数据”当做指令执行时,就产生了OS命令执行的安全问题,; 2. 如果SQL解析引擎把“特殊数据”当做指令执行时,就产生SQL注入这样的安全问题, 3. 如果nginx把“特殊数据”当做指令执行时,可能会产生远程溢出、DoS等各种安全问题 4. 如果在Web开发框架或Web应用层中没处理好,把“特殊数据”当做指令执行时,可能会产生远程命令执行的安全问题,这段“特殊数据”可能长得如下这般:eval($_REQUEST['x']); 5. 如果在Web前端层中没处理好,浏览器的JS引擎把“特殊数据”当做指令执行时,可能会产生XSS跨站脚本的安全问题,这段“特殊数据”可能长得如下这般:'"><script>alert(/cos is my hero./)</script>
- knownsec
- RD_Checklist
- freebuf
- Hacker News
- arch_design_evolution
- cookiehacker
- Knownsec_RD_Checklist
- 我的渗透利器
- safeshare
- 黑科技之无障碍访问 Google
- Style Guide for Python Code
- WechatSogou
- 个可配置的、分布式的爬虫框架
- rfc1180(TCP/IP概览)
- http://jiaxin.im/ search Python 项目
- Web Scraper 是谷歌 Chrome 浏览器插件,可自动化提取网页数据
- JavaScript 实例
- HTML5_video#Browser_support
- HTML5_Audio#Supported_audio_coding_formats
- 浅谈javascript函数劫持
- eval()
- JavaScript
- HTTP
- http://evilcos.me/
- Web2.0 Hacking
- anehta
- [hook.js]通用Javascript函数钩子
- 鬼仔’s Blog
- Anehta
- anehta github
- Anehta – 高级XSS攻击技术.ppt
- anehta/source
- axis
- 螺螺的blog
- Ph4nt0m
- anehta.js
//// Hook Library
//////////////////////////////////////////////////
anehta.hook = {};
/* 一般JS函数的hook, 使用委托
@axis
注意hook函数加载前,如果函数已经调用了,则该函数无法hook
var hj = new hookJsFunction();
//自己定义的函数需要返回一个array作为被hook函数的新参数
//可以劫持参数,不能递归调用
hj.hook("被hook的函数名", "保存原函数的变量", "你的函数名");
hi.unhook("被hook的函数名", "保存原函数的变量");
//可以递归注入函数,不能劫持参数
hj.injectFn("被inject的函数名", "保存原函数的变量", "你的函数名");
*/
anehta.hook.hookFunction = function (){
//alert("hookjsfunc");
// 保存原函数;还是需要作为参数指定一个,
//否则多次hook后会丢失之前保存的原函数
//var RealFuncAfterHooked;
return {
hook: function(funcNameHooked, RealFuncAfterHooked, hookFunc){
try {
setTimeout(function(){
//alert("hook before: "+window[funcNameHooked]);
// 保存原函数
window[RealFuncAfterHooked] = window[funcNameHooked];
//window[funcNameHooked] = window[hookFunc];
// 参数个数可以根据需要进行调整
window[funcNameHooked] = function (param1,param2,param3,param4,param5,param6,param7){
// 劫持参数
var newParam = new Array();
// 先执行注入的函数; 需要返回被劫持后的参数,作为新参数传入原函数
newParam = window[hookFunc](param1, param2, param3, param4, param5, param6, param7);
//alert("newParam= "+newParam);
// 再执行原函数
window[RealFuncAfterHooked](newParam[0], newParam[1], newParam[2], newParam[3],
newParam[4], newParam[5], newParam[6]);
// 不注入参数,直接执行原函数;
//window[RealFuncAfterHooked](param1,param2,param3,param4,param5,param6,param7);
}
//alert("hook after: "+window[funcNameHooked]);
},
10);
return true;
} catch (e){
return false;
}
},
unhook: function(funcNameHooked, RealFuncAfterHooked){
try {
setTimeout(function(){
//alert("unhook before: "+window[funcNameHooked]);
window[funcNameHooked] = function (param1,param2,param3,param4,param5,param6,param7){
window[RealFuncAfterHooked](param1,param2,param3,param4,param5,param6,param7); // 执行原函数;
}
//alert("unhook after: "+window[funcNameHooked]);
},
10);
return true;
} catch (e){
return false;
}
},
injectFn: function(funcNameInjected, RealFuncAfterInjected, injectFunc){
try {
setTimeout(function(){
// 保存原函数
window[RealFuncAfterInjected] = window[funcNameInjected];
// 参数个数可以根据需要进行调整
window[funcNameInjected] = function (param1,param2,param3,param4,param5,param6,param7){
// 先执行注入的函数
window[injectFunc](param1, param2, param3, param4, param5, param6, param7);
// 再执行原函数
window[RealFuncAfterInjected](param1,param2,param3,param4,param5,param6,param7);
}
},
10);
return true;
} catch (e){
return false;
}
}
};
};
// 初始化hook
var anehtaHook = new anehta.hook.hookFunction();
/*
* Name: hookSubmit
* Args:
* o - specified form object
* e.g.
* <form onkeydown="javascript: hookSubmit(this);" ..>
*
* If the form uses javascript to call submit method for submitting, you should install a hook on the form.
*/
anehta.hook.hookSubmit = function(o, injectFuncCallBack) {
//alert();
if (o.hooked == undefined) {
o.hooked = true;
o._submit = o.submit;
o.submit = function() {
//alert("submit hooked!");
// hook函数的功能作为第二个参数在这里调用
injectFuncCallBack();
o.onsubmit();
}
}
}
// hook 指定表单的提交
anehta.hook.hookForm = function(f){
if (typeof f == "undefined"){
return false;
}
window.anehtaHookForm = function(){
anehta.logger.logForm(f);
//anehta.core.freeze(200);
}
anehta.dom.bindEvent(f, "submit", "anehtaHookForm");
}
// 找出页面上所有表单并hook之
anehta.hook.hookAllForms = function(){
var allforms = document.getElementsByTagName("form");
for(i=0; i<allforms.length; i++){
anehta.hook.hookForm(allforms[i]);
}
}
附
在操作过程或者文章有问题的话欢迎在 原文 里提问或指正。