FeCodeGuide
                                
                                 FeCodeGuide copied to clipboard
                                
                                    FeCodeGuide copied to clipboard
                            
                            
                            
                        front-end code guide
FeCodeGuide
前端开发编码规范
总结自己的前端开发编码规范,包括 html 、css 、js、前端安全.
##0x00 介绍
每个人都肯能有一套自己的写代码风格,每个团队也可能为了统一都有自己的团队使用的代码规范, ##0x01 html规范 1.语法
- 
使用两个空格为一次缩进(Tab)。嵌套的节点应该缩进。 
- 
在属性上,使用双引号,不要使用单引号。 
- 
不要在自动闭合标签结尾处使用斜线 - HTML5 规范 指出他们是可选的。 
- 
不要忽略可选的关闭标签。 
2.使用html5 doctype 	
<!DOCTYPE html>
3.指定网站的语言
    <html lang="zh-CN"> 	
       <!-- ... --> 	
    </html>
4.使用UTF-8编码
5.IE兼容模式
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
6.正确引入css,js文件
<!-- External CSS -->	 	
<link rel="stylesheet" href="code-guide.css">
<!--  CSS --> 
<style> 		
/* ... */ 	
</style>
<!-- JavaScript --> 	
<script src="code-guide.js"></script>
7. 按顺序书写html属性
HTML 属性应该按照特定的顺序出现以保证易读性。
class 	
id, name 	
data-* 	
src, for, type, href 	
title, alt 	
aria-*, role 	
Classes 是为高可复用组件设计的,所以他们处在第一位。Ids 更加具体而且应该尽量少使用(例如, 页内书签),所以他们处在第二位。
8.可以不必为Boolean属性取值
<input type="checkbox" value="1" checked="chencked">
可以写成
<input type="checkbox" value="1" checked>
9.尽量减少标签数量 编写 HTML 代码时,尽量避免多余的父元素。很多时候,这需要迭代和重构来实现。请看下面的案例:
<!-- 不推荐 -->
<span class="avatar">
  <img src="...">
</span>
<!-- 推荐 -->
<img class="avatar" src="...">
10.标签嵌套规范
.a 块元素可以包含内联元素或某些块元素, 但内联元素却不能包含块元素, 它只能包含其它的内联元素;
<div><h1></h1><p></p></div> --- 对
<a href="#"><span></span></a> --- 对
<span><div></div></span> --- 错
.b 块级元素不能放在<p>里面;
<p><ol><li></li></ol></p> --- 错
<p><div></div></p> --- 错
.c 有几个特殊的块级元素只能包含内嵌元素, 不能再包含块级元素, 这几个特殊的标签是;
h1, h2, h3, h4, h5, h6, p, dt
.d <li> 内可以包含 <div> 标签;
.e 块级元素与块级元素并列, 内嵌元素与内嵌元素并列;
<div><h2></h2><p></p></div> --- 对
<div><a href="#"></a><span></span></div> --- 对
<div><h2></h2><span></span></div> --- 错
11.对页面中的每一个html模块使用注释包裹
<!-- content --> 	
 <div class="container"> 		
 ... 	
  </div> 	
 <!-- content end -->
12.修改了别人的代码最好添加注释
##0x02 css规范指南
1.语法
- 
使用四个空格缩进(Tab)。 
- 
使用组合选择器时,保持每个独立的选择器占用一行。 
- 
为了代码的易读性,在每个声明的左括号前增加一个空格。 
- 
声明块的右括号应该另起一行。 
- 
每条声明 : 后应该插入一个空格。 
- 
每条声明应该只占用一行来保证错误报告更加准确。 
- 
所有声明应该以分号结尾。虽然最后一条声明后的分号是可选的,但是如果没有他,你的代码会更容易出错。 
- 
逗号分隔的取值,都应该在逗号之后增加一个空格。 
- 
不要在颜色值 rgb()和rgba()中增加空格,并且不要带有取值前面不必要的0(比如,使用.5替代0.5)。
- 
所有的十六进制值都应该使用小写字母,例如 #fff。因为小写字母有更多样的外形,在浏览文档时,他们能够更轻松的被区分开来。
- 
尽可能使用短的十六进制数值,例如使用 #fff 替代 #ffffff。
- 
为选择器中得属性取值添加引号,例如 input[type="text"]。 他们只在某些情况下可有可无,所以都使用引号可以增加一致性。
- 
不要为 0 指明单位,比如使用 margin: 0;代替margin: 0px;。
举个例子:
    .selector,
    .selector-secondary,
    .selector[type="text"] {
      padding: 15px;
      margin: 0 0 15px;
      background-color: rgba(0,0,0,.5);
      box-shadow: 0 1px 2px #ccc, inset 0 1px 0 #fff;
    }
2.声明顺序
相关的属性声明应该以下面的顺序分组处理:
Positioning
Box model 盒模型
Typographic 排版
Visual 外观
Positioning 处在第一位,因为他可以使一个元素脱离正常文本流,并且覆盖盒模型相关的样式。盒模型紧跟其后,因为他决定了一个组件的大小和位置。
其他属性只在组件 内部 起作用或者不会对前面两种情况的结果产生影响,所以他们排在后面。
这里推荐一个网站给大家,http://csscomb.com/online/
可以在线格式化你的css代码,还有插件哦。
    .declaration-order {
      /* Positioning */
      position: absolute;
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      z-index: 100;
    
      /* Box-model */
      display: block;
      float: right;
      width: 100px;
      height: 100px;
    
      /* Typography */
      font: normal 13px "Helvetica Neue", sans-serif;
      line-height: 1.5;
      color: #333;
      text-align: center;
    
      /* Visual */
      background-color: #f5f5f5;
      border: 1px solid #e5e5e5;
      border-radius: 3px;
    
      /* Misc */
      opacity: 1;
    }
3.媒体查询位置
尽量将媒体查询的位置靠近他们相关的规则。不要将他们一起放到一个独立的样式文件中,或者丢在文档的最底部。这样做只会让大家以后更容易忘记他们。这里是一个典型的案例。
    .element { ... }
    .element-avatar { ... }
    .element-selected { ... }
    
    @media (min-width: 480px) {
      .element { ...}
      .element-avatar { ... }
      .element-selected { ... }
    }
4.不要使用 @import
5.前缀属性
当使用厂商前缀属性时,通过缩进使取值垂直对齐以便多行编辑。
    .selector {
      -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.15);
              box-shadow: 0 1px 2px rgba(0,0,0,.15);
    }
6.单条声明的声明块
在一个声明块中只包含一条声明的情况下,为了易读性和快速编辑可以考虑移除其中的换行。所有包含多条声明的声明块应该分为多行。
    /* Single declarations on one line */
    .span1 { width: 60px; }
    .span2 { width: 140px; }
    .span3 { width: 220px; }
    
    /* Multiple declarations, one per line */
    .sprite {
      display: inline-block;
      width: 16px;
      height: 15px;
      background-image: url(../img/sprite.png);
    }
    .icon           { background-position: 0 0; }
    .icon-home      { background-position: 0 -20px; }
    .icon-account   { background-position: 0 -40px; }
7.属性简写
坚持限制属性取值简写的使用,属性简写需要你必须显式设置所有取值。常见的属性简写滥用包括:
padding
margin
font
background
border
border-radius
大多数情况下,我们并不需要设置属性简写中包含的所有值。例如,HTML 头部只设置上下的 margin,所以如果需要,只设置这两个值。过度使用属性简写往往会导致更混乱的代码,其中包含不必要的重写和意想不到的副作用。
    /* 坏习惯 */
    .element {
      margin: 0 0 10px;
      background: red;
      background: url("image.jpg");
      border-radius: 3px 3px 0 0;
    }
    /* 好习惯 */
    .element {
      margin-bottom: 10px;
      background-color: red;
      background-image: url("image.jpg");
      border-top-left-radius: 3px;
      border-top-right-radius: 3px;
    }
8.代码注释
代码是由人来编写和维护的。保证你的代码是描述性的,包含好的注释,并且容易被他人理解。好的代码注释传达上下文和目标。不要简单地重申组件或者 class 名称。每个注释块之间最好空一行。
    /* 不好的习惯 */
    /* Modal header */
    .modal-header {
      ...
    }
    
    /* 好的规范 */
    /* Wrapping element for .modal-title and .modal-close */
    .modal-header {
      ...
    }
9.Class 命名
保持 Class 命名为全小写,可以使用短划线(不要使用下划线和 camelCase 命名)。短划线应该作为相关类的自然间断。(例如,.btn 和 .btn-danger)。 避免过度使用简写。.btn 可以很好地描述 button,但是 .s 不能代表任何元素。 Class 的命名应该尽量短,也要尽量明确。 使用有意义的名称;使用结构化或者作用目标相关,而不是抽象的名称。 命名时使用最近的父节点或者父 class 作为前缀。 使用 .js-* classes 来表示行为(相对于样式),但是不要在 CSS 中包含这些 classes。
/* 不好的规范 */
    .t { ... }
    .red { ... }
    .header { ... }
/* 好的规范 */
    .tweet { ... }
    .important { ... }
    .tweet-header { ... }
10.选择器
使用 classes 而不是通用元素标签来优化渲染性能。 避免在经常出现的组件中使用一些属性选择器 (例如,[class^="..."])。浏览器性能会受到这些情况的影响。 减少选择器的长度,每个组合选择器选择器的条目应该尽量控制在 3 个以内。 只在必要的情况下使用后代选择器 (例如,没有使用带前缀 classes 的情况).
/* 不好的习惯 */
    span { ... }
    .page-container #stream .stream-item .tweet .tweet-header .username { ... }
    .avatar { ... }
/* 好的规范 */
    .avatar { ... }
    .tweet-header .username { ... }
    .tweet .avatar { ... }
11.CSS文件头部声明 @charset
为了避免 HTML 和 CSS 文件编码不同时造成中文解析乱码,造成的不必要的麻烦,CSS 文件头部统一加上文件对应的编码,例如文件编码为 UTF-8 时:
@charset "utf-8";
/* 开始书写样式 */
需要注意的是:
@charset 前面不能有任何字符。
@charset 必须出现在 CSS 文件的最开始。
注:在使用 SASS 时如果不指定 @charset 也可能造成乱码。
##0x03 JavaScript规范指南
1.缩进
每一行的层级有四个空格缩进(用Sublime配置一个table键为四个空格)。
2.行的长度
每行的长度不超过80个字符,如果一行多余80个字符,应该在一个运算符后换行,并且下一行增加两级缩进(也就是8个空格)
3.原始值
字符串应该使用双引号且保持一行,避免在字符串中使用斜线另起一行。
// 好的写法
var name = "gothic"
// 不好的写法
var name = 'gothic'
数字应该使用十进制整数,科学计数法表示整数,十六进制整数,或者十进制浮点小数,小数点前后应当至少保留一位数字,避免使用八进制直接量
特殊值null除了下述情况下应当避免使用:
- 用来初始化一个变量,这个变量可能被赋值为一个对象。
- 用来和一个已经初始化的变量比较,这个变量可以是也可以不是一个对象。
- 当函数的参数期望是对象时,被用作参数传入。
- 当函数的返回值期望是对象时,被用作返回值传出。
// 好的写法
var person = null;
// 好的写法 
function getPerson() {
	if (condition) {
	return new Person("gothic");
	} else {
	return null;
	}
}
// 不好的写法
var person;
if (person != null) {
	doSomething();
}
避免使用特殊值 undefined。判断一个变量是否定义应该使用typeof操作符
// 好的写法
if (typeof variable == "undefined") {
	// do something
}  
4.运算符间距
二元运算符前后必须使用一个空格来保持表达式的整洁。操作符包括赋值运算符和逻辑运算符。
//好的写法
var found = (values[i] === item);
//好的写法
if (found && (count > 10)) {
	process(i)
}
//不好的写法,没有空格
var found = (values[i]===item);
5.括号间距
当使用括号时,紧接左括号之后和紧接右括号之前不应该有空格。
// 好的写法
var found = (values[i] === item);
// 好的写法
if (found && (count >10)) {
	doSomething();
}
// 不好的写法,左括号之后有空格
var found = ( values[i] === item);
//不好的写法,右括号之前有额外的空格
if (found && (count > 10) ) {
	doSomething();
}
6.对象直接量
对象直接量应该使用如下格式:
- 起始左花括号应当通表达式保持同一行。
- 每个属性的名值对应当保持一个缩进,第一个属性应当在左起花括号后另起一行。
- 每个属性的名值对应当使用不含引号的属性名,其后紧跟一个冒号,而后是值。
- 倘若属性值是函数类型,函数体应当在属性名之下另起一行,而且其前后均应保留一个空行。
- 一组相关的属性前后可以插入空行以提升代码的可读性。
- 结束的右花括号应当独占一行。
// 好的写法
var object = {
	key: value1,
	key2: value2,
	function() {
	//doSomething()
	},
	key3: value3
};
// 不好的写法:不恰当的缩进
var object = {
				key1: value1,
				key2: value2,
};
当对象字面量作为函数时,如果值是变量,起始花括号应当同函数名再同一行。所有其余先前列出的规则同样适合。
7.注释
适当的注释有利于别人理解你的代码,一般以下情况应当使用注释。
- 代码晦涩难懂
- 可能被误认为错误的代码
- 必要但并不明显的针对特定浏览器的代码
- 对于对象,方法或者属性,生成文档是必要的
(1)单行注释
单行注释也有多种使用方式
- 独占一行,用来解释下一行代码。
- 在代码的尾部的注释,用来解释他之前的代码。
- 多行,用来注释掉一个代码块。
// 好的写法
if (condition) {
	// 如果代码执行到这里,则表明通过了所有的安全性检查
	allowed();
}
// 不好的写法:注释之前没有空行
if (condition) {
	// 如果代码执行到这里,则表明通过了所有的安全性检查
	allowed();
}
// 不好的写法:这里应当使用多行注释
// 啊啊啊啊啊啊啊啊
// 么么么么么
// 么么么么么么么么啦啦啦啦啦拉了拉了
// lllllllllll
if (condition) {
	
	// 如果代码执行到这里,则表明通过了所有的安全性检查
	allowed();
}
对于代码尾行注释的情况,应该确保代码结尾同注释之间至少一个缩进。
// 好的写法
var result = something + somethingElse;    // somethingElse will never be null
// 不好的写法:代码和注释间没有足够的空格
var result = something + somethingElse;// somethingElse will never be null
注释一个代码块时在连续多行使用单行注释是唯一可以接受的情况,多行注释不应该在这种情况下使用 // 好的写法 // if (condition) { // doSomething(); // thenDoSomethingElse(); }
(2)多行注释
多行文字适合在代码需要更多文字去解释的时候使用,每个多行注释都至少有如下三行:
首行仅仅包括/*释开始,该行不应当有其他文字。
接下来的行以*开头并保持左对齐,这些行可以有文字描述。
最后一行以*/开头并同先前行保持对齐,也不应当有其他文字。
多行注释的首行应当保持同他描述的相同层次的缩进。后续的每行应当有同样层次的缩进并附加一个空格。每一个多行代码之前应当预留一个空行。
// 好的写法
if (condition) {
	/*
	 * 如果代码执行到这里
	 * 说明通过了所有的安全性检测
	 */
	allowed();
}
// 不好的写法:注释之前无空行
if (condition) {
	/*
	 * 如果代码执行到这里
	 * 说明通过了所有的安全性检测
	 */
	allowed();
}
// 不好的写法:星号后面没有空格
if (condition) {
	
	/*
	 *如果代码执行到这里
	 *说明通过了所有的安全性检测
	 */
	allowed();
}
(3)注释说明
注释有时候也可以用来给一段代码添加额外的信息,比如:
TODO:说明代码还未完成。应当保函下一步要做的事情。
HACK:表明代码实现走了一个捷径。应当包含为何使用hack的原因。这也可能表明该问题可能会有更好的解决办法
XXXX: 说明代码是有问题的并应当尽快修复
FIXME: 说明代码任何可能的改动都需要评审
这些声明可在一行也可在多行注释里使用
// 好的写法
// TODO:我希望找到一种更块的方式
doSomething();
8.变量声明
所有的变量声明在使用前应该事先定义,变量定义应当放在函数开头,使用一个var表达式每行一个变量。除了首行,所有行都应该都多一层缩进。初始化的变量应当在未初始化变量之前。
// 好的写法
var count = 10,
	name = "gothic",
	found = false,
	empty;
// 不好的写法:多个定义在一行
var count = 10,name = "gothic",
	found = false,empty;
9.函数声明
函数应当在使用前提前定义。一个不是作为方法的函数应该使用函数定义的格式。函数名和开始圆括号之间不应该有空格,结束的圆括号和右边的花括号之间应该留一个空格。右侧的花括号应当同function关键字保持同行,开始和结束之间不应该有空格。参数名之间应当在逗号之后保留一个空格。函数体应当保持一级缩进。
//好的写法
function doSomething(arg1,arg2) {
	return arg1 + arg2;
}
//不好的写法:空格使用不当
function doSomething (arg1,arg2){
	return arg1 + arg2;
}
//不好的写法:函数表达式
var doSomething = function(arg1,arg2) {
	return arg1 + arg2;
}
//不好的写法:左侧花括号位置不对
function doSomething(arg1,arg2) {
	return arg2 + arg2
}
//错误的写法:使用function构造器
var doSomething = new Function("arg1","arg2","return arg1 + arg2");
其他函数内部定义的函数应当在var语句后立即定义。 匿名函数可能作为方法赋值给对象,或者作为其它函数的参数。function关键字同开始括号之间不应有空格。 立即被调用的函数应当在函数调用的外层用圆括号包裹
10.命名
变量和函数命名是个大问题。命名应仅限于数字字母字符,某些情况下也可以使用下划线。最好不要在任何命名中使用反斜杠和$。
变量命名应当采用驼峰命名格式,首写字母小写,每个单词首字母大写。变量名的第一个单词应当是一个名词以避免同函数混淆。不要在变量名中使用下划线。
函数命名也应当采用驼峰命名格式,函数命名的第一个单词应当是动词来避免同变量混淆。函数名中最好不要使用下划线。
//不好的写法:名词开头
function car() {
	//code
}
//不好的写法:使用下划线
function do_something() {
	//code
}
构造函数——通过new运算符创建新对象的函数——也应当以驼峰格式命名并且首字符大写。构造函数名称应当以非动词开头,因为new代表着创建一个对象实例的操作。
// 好的写法
function MyObject() {
	//代码
}
//不好的写法:小写字母和下划线
function my_Object() {
	//代码
}
常量的命名应当是所有字母大写,不同单词之间用单个下划线隔开。
//好的写法
var TOTAL_COUNT = 10;
//不好的写法:驼峰形式
var totalCount = 10;
对象的属性同变量的命名规则相同。对象的方法同函数的命名规则相同。如果属性或者方法是私有的。应当在之前加一个下划线。
11.赋值
给变量赋值时,如果右侧是含有比较语句的表达式,需要用圆括号包裹。
//好的方法
var flag = (i < count);
//不好的写法:遗漏括号
var flag = i < count;
12.等号运算符
使用===和!==代替==和!=来避免弱类型转换错误。
var same = (a === b);
//不好的写法
var same = (a == b);
13.三元操作符
三元操作符应当仅仅用在条件赋值语句中,而不要作为if语句的替代品。
//好的写法  
var value = condition ? value1 : value2;
//不好的写法  
condition ? doSomething():do somethingElse();  
14.语句
(1)简单语句
每一行包含一条语句,已分号;结束
(2)返回语句
当返回一个值的时候不应当使用圆括号包裹,除非在某些情况下这么做可以让返回值更容易理解。
(3)复合语句
- 复合语句是大括号括起来的语句列表。
- 括起来的语句应当较复合语句多缩进一个层级
- 开始的大括号应当在复合语句所在的行尾,结束的大括号应当独占一行且同复合语句的开始保持同样的缩进。
- 当语句是控制结构的一部分时,诸如if或者for语句,所有的语句都需要大括号括起来,也包括单个语句。
- 像if一样的语句开始的关键字,其后应该紧跟一个空格,起始大括号应当在空格之后。
if (condition) {
	statements
} else if (condition) {
	statements
} else {
	statements
}  
for (test1; condition; update) {
	statements
}  
for (variable in object) {
	statements
}  
Switch下的每个case都应该保持一个缩进,除第一个之外包括default在内的每个case都应该在之前保持一个空行
switch (value) {
	case 1:  
	/* 抛出错误 */  
	case 2:  
		doSomething();
		break;
	case 3:
		return true;
	default:  
		throw new Error(this shouldn't happen);
}  
15.留白空格
在逻辑相关的代码块之间添加空行可以提高代码的可读性。
两行空行的情况下:
- 在不同的源代码文件之间。
- 在类和接口定义之间。
单行空行的情况下:
- 方法之间。
- 多行或者单行注释之前。
- 方法中局部变量和第一行语句之间。
- 方法中逻辑代码块之间以提升代码的可读性。
空格在以下情况:
- for循环中的分号之后,比如 for (var i = 0; i < 10; i += 1) {...}
- for循环中初始化多个变量,比如 for (var i = 0, max = 10; i < max; i += 1) {...}
- 分隔数组项的逗号之后,var a = [1, 2, 3];
- 对象属性后的逗号以及名值对之间的冒号之后,var o = {a: 1, b: 2};
- 函数参数中,myFunc(a, b, c)
- 函数声明的花括号之前,function myFunc() {}
- 匿名函数表达式function之后,var myFunc = function () {};
另外,我们推荐在运算符和操作数之间添加空格。也就是说在+, -, *, =, <, >, <=, >=, ===, !==, &&, ||, +=符号前后都添加空格。
// generous and consistent spacing
// makes the code easier to read
// allowing it to "breathe"
var d = 0,
	a = b + 1;
if (a && b && c) {
	d = a % c;
	a += d;
}
// antipattern
// missing or inconsistent spaces
// make the code confusing
var d= 0,
	a =b+1;
if (a&& b&&c) {
	d=a %c;
	a+= d;
}
最后,还应当注意,最好在花括号旁边添加空格:
- 在函数、if-else语句、循环、对象直接量的左花括号之前补充空格({)
- 在右花括号和else和while之间补充空格
###0X04 前端安全编码规范
在之前先记住两句话: 1.永远不要相信用户的输入;2.一切输入都是有害的。
在web应用里,前端安全只是比较小的一部分,后又服务端,系统等安全,但是我们不能忽视前端安全,尤其是现在xss攻击技术已经非常强大了(有兴趣的可以自己去了解xss等前端安全知识)。所以,作为前端开发人员一定要懂点前端安全的知识,起码要有安全意识。下面开始总结的前端编码安全规范。
####1.body 文本 比如: <b>错误,你的查询=$query?>没啥结果
攻击者可能会把动态的内容=$query?>换成恶意的xss输入:
返回的结果就为: <b>错误,你的查询<script>evil_script()没啥结果
这个解决的办法就是把能触发的xss的字符用相应的html实体代替。
< 小于号转成 <
> 大于号转成 >
& 和号转成 &
"" 双引号转成"
'' 单引号转成 '
###2.HTML标签中的内容 一些标签例如<input>、<style>、<color>等的属性可能为动态内容,这种情况也存在xss威胁。 比如:
<input name="name" value="<?=query?>">
攻击者可能会通过在输入框里输入构造新的闭合括号来生成新的<script>标签:
xss">\<script>evil_script()</script>
返回的结果为
<input name="name" value="xss"><script>evil_script()</script>">
攻击者还有可能标签的属性值进行xss的案例。
<input name="name" value=<?=query?>>
恶意输入:
xss onnouseover=evil_script()
返回:
<input name="name" value=xss onnouseover=evil_script()>
当用户鼠标移上去,这个恶意脚本就会被执行。 解决办法和前面一样:
< 小于号转成 <
> 大于号转成 >
& 和号转成 &
"" 双引号转成"
'' 单引号转成 '
####3.<script></script>里的内容 这种情况是比较危险的,就是用户可以直接把内容写入JavaScript代码里。攻击者只要写段能运行的js脚本就可以,比如
\<script>
var msg = '<?=$query?>'
·····
</script>
输入
xss';evil_script();//
返回结果:
\<script>
var msg = 'xss';evil_script();//'
·····
</script>
解决办法如下:
' 单引号转成 \'
" 双引号转成 \"
\ 反斜杠转成 \\
/ 正斜杠转成 \/
\n 换行符转成 \n
\r 回车符转成\r
####4. JavaScript 事件
常见的比如:
<input type=button name=smt value='确定' onclick='GotoUrl("<?=$targetUrl>");'>
输入
foo");evil_script("
返回
<input type=button name=smt value='确定' onclick='GotoUrl("foo");evil_script("");'>
这种情况下要先对HTML转义在对js转义。如下:
< 小于号转成 <
> 大于号转成 >
& 和号转成 &
"" 双引号转成"
'' 单引号转成 '
\ 反斜杠转成 \\
/ 正斜杠转成 \/
\n 换行符转成 \n
\r 回车符转成\r
####5. url属性
规定 href 和 src 值是以 http:// 开头 规定不能有十进制和十六进制的编码字符 规定属性以双引号界定
字符对URL的影响:
空格转成 %20
+ 转成 %2B
= 转成%3D
% 转成 %25
& 转成 %26
# 转成%23
? 转成 %3F
/ 转成 %2F
当然我这里只是简单的说了一下基本的对输入字符进行转义,真正要防御好前端攻击还有很多要做的,可以参考这个更全一点的安全编码规范:http://www.owasp.org.cn/owasp-project/download/OWASPV1.pdf