Linux 添加sudo用户 (centos)

一 、sodo的使用

1.1 关于sudo

         Sudo是linux系统中,非root权限的用户提升自己权限来执行某些特性命令的方式,它使普通用户在不知道超级用户的密码的情况下,也可以暂时的获得root权限。
         一般,普通用户在执行特殊命令是,只需要在特殊命令(如 yum)前面加上sudo,并输入自己的用户密码就可以了,在之后的5分钟内,再次使用特殊命令时,就无需再次输入用户密码。
         同时,sudo提供了强大的日志管理,其中详细的记录了每个用户都干了什么。
         sudo用户的管理是在文件:/etc/sudoers中存放的。也就是说,如果想把某个用户加入到sudo用户群里面,就需要自行配置这个文件,在读写这个文件时,需要root的权限。
 
 

2.1 将用户添加到sudo的方法

         在使用sudo的时候,如果出现"xxx is not in thesudoers file. This incident will be reported”说明当前用户名:xxx是没有权限使用sudo的,这个时候我们就需要修改/etc/sudoers来为当前用户xxx添加sudo权限。

  1. 使用 “su –” 命令,进入超级用户,进入etc目录 “cd /etc”
  2. 为sudoers文件添加写入的权限:使用命令   “chmod u+w sudoers”
  3. 使用命令“vim sudoers”,按“i”进入编辑模式后,找到“rootALL=(ALL) ALL ”,在后面添加:"xxxALL=(ALL) ALL"(这里的xxx是你的用户名),再按一下“Esc”键退出编辑,输入“wq”(write quit)后,退出sudoers。
  4. 输入“chmod u-w sudoers”将文件的写入属性撤销
  5. 通过“su xxx”切换回自己的用户名,再使用sudo命令时,就可以使用了

常用的正则表达式总结

非负整数:^d+$

正整数:^[0-9]*[1-9][0-9]*$

非正整数:^((-d+)|(0+))$

负整数:^-[0-9]*[1-9][0-9]*$

整数:^-?d+$

非负浮点数:^d+(.d+)?$

正浮点数 : ^((0-9)+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)$

非正浮点数:^((-d+.d+)?)|(0+(.0+)?))$

负浮点数:^(-((正浮点数正则式)))$

英文字符串:^[A-Za-z]+$

英文大写串:^[A-Z]+$

英文小写串:^[a-z]+$

英文字符数字串:^[A-Za-z0-9]+$

英数字加下划线串:^w+$

E-mail地址:^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$

URL:^[a-zA-Z]+://(w+(-w+)*)(.(w+(-w+)*))*(?s*)?$
或:^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&_~`@[]’:+!]*([^<>””])*$

邮政编码:^[1-9]d{5}$

中文:^[u0391-uFFE5]+$

电话号码:^(((d{2,3}))|(d{3}-))?((0d{2,3})|0d{2,3}-)?[1-9]d{6,7}(-d{1,4})?$

手机号码:^(((d{2,3}))|(d{3}-))?13d{9}$

双字节字符(包括汉字在内):^x00-xff

匹配首尾空格:(^s*)|(s*$)(像vbscript那样的trim函数)

匹配HTML标记:<(.*)>.*</1>|<(.*) />

匹配空行:n[s| ]*r

提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *(‘|”)?(w||/|.)+(‘|”| *|>)?

提取信息中的邮件地址:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*

提取信息中的图片链接:(s|S)(r|R)(c|C) *= *(‘|”)?(w||/|.)+(‘|”| *|>)?

提取信息中的IP地址:(d+).(d+).(d+).(d+)

提取信息中的中国手机号码:(86)*0*13d{9}

提取信息中的中国固定电话号码:((d{3,4})|d{3,4}-|s)?d{8}

提取信息中的中国电话号码(包括移动和固定电话):((d{3,4})|d{3,4}-|s)?d{7,14}

提取信息中的中国邮政编码:[1-9]{1}(d+){5}

提取信息中的浮点数(即小数):(-?d*).?d+

提取信息中的任何数字 :(-?d*)(.d+)?

IP:(d+).(d+).(d+).(d+)

电话区号:/^0d{2,3}$/

腾讯QQ号:^[1-9]*[1-9][0-9]*$

帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

中文、英文、数字及下划线:^[u4e00-u9fa5_a-zA-Z0-9]+$

匹配中文字符的正则表达式: [u4e00-u9fa5]

匹配双字节字符(包括汉字在内):[^x00-xff]

匹配空行的正则表达式:n[s| ]*r

匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/

sql语句:^(select|drop|delete|create|update|insert).*$

匹配首尾空格的正则表达式:(^s*)|(s*$)

匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*

mysql主从复制

怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下:

1、主从服务器分别作以下操作
1.1、版本一致
1.2、初始化表,并在后台启动mysql
1.3、修改root的密码

2、修改主服务器master:
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin   //[必须]启用二进制日志
server-id=222      //[必须]服务器唯一ID,默认是1,一般取IP最后一段

3、修改从服务器slave:
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin   //[不是必须]启用二进制日志
server-id=226      //[必须]服务器唯一ID,默认是1,一般取IP最后一段

4、重启两台服务器的mysql
/etc/init.d/mysql restart

5、在主服务器上建立帐户并授权slave:
#/usr/local/mysql/bin/mysql -uroot -pmttang
mysql>GRANT REPLICATION SLAVE ON *.* to ‘mysync’@’%’ identified by ‘q123456’; //一般不用root帐号,&ldquo;%&rdquo;表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。

6、登录主服务器的mysql,查询master的状态
mysql>show master status;
+——————+———-+————–+——————+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| mysql-bin.000004 |      308 |              |                  |
+——————+———-+————–+——————+
1 row in set (0.00 sec)
注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化

7、配置从服务器Slave:
mysql>change master to master_host=’192.168.145.222′,master_user=’mysync’,master_password=’q123456′,
master_log_file=’mysql-bin.000004′,master_log_pos=308;   //注意不要断开,308数字前后无单引号。

Mysql>start slave;    //启动从服务器复制功能

8、检查从服务器复制功能状态:

mysql> show slave statusG

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.222  //主服务器地址
Master_User: mysync   //授权帐户名,尽量避免使用root
Master_Port: 3306    //数据库端口,部分版本没有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 600     //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
Relay_Log_File: ddte-relay-bin.000003
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes    //此状态必须YES
Slave_SQL_Running: Yes     //此状态必须YES
……

注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。

以上操作过程,主从服务器配置完成。

9、主从服务器测试:

主服务器Mysql,建立数据库,并在这个库中建表插入一条数据:

mysql> create database hi_db;
Query OK, 1 row affected (0.00 sec)

mysql> use hi_db;
Database changed

mysql>  create table hi_tb(id int(3),name char(10));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into hi_tb values(001,’bobu’);
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+——————–+
| Database           |
+——————–+
| information_schema |
| hi_db                |
| mysql                |
| test                 |
+——————–+
4 rows in set (0.00 sec)

从服务器Mysql查询:

mysql> show databases;

+——————–+
| Database               |
+——————–+
| information_schema |
| hi_db                 |       //I’M here,大家看到了吧
| mysql                 |
| test          |

+——————–+
4 rows in set (0.00 sec)

mysql> use hi_db
Database changed
mysql> select * from hi_tb;           //查看主服务器上新增的具体数据
+——+——+
| id   | name |
+——+——+
|    1 | bobu |
+——+——+
1 row in set (0.00 sec)
10、完成:
编写一shell脚本,用nagios监控slave的两个yes(Slave_IO及Slave_SQL进程),如发现只有一个或零个yes,就表明主从有问题了,发短信警报吧。

出自 “系统网络运维” :http://369369.blog.51cto.com/319630/790921

如何将Linux命令的输出赋值给变量

可以使用如下形式的 shell 命令置换特性,将命令的输出存储到变量中:

  1. 变量名=$(命令)
  2. 变量名=$(命令 [命令选项 …] 参数1 参数2 …)
  3. 或者:
  4. 变量名=`命令`
  5. 变量名=`命令 [命令选项 …] 参数1 参数2 …`

以下是使用命令置换特性的示例:

本例,我们将 who (显示当前登录系统的用户) 的输出值存储到 CURRENT_USERS 变量中:

$ CURRENT_USERS=$(who)

然后,我们可以使用 echo 命令 显示一个句子并使用上述变量,如下:

$ echo -e “以下为登录到系统中的用户:nn $CURRENT_USERS”

上面的命令中:-e 标记表示解释所有的转义序列 (如 n 为换行)。为节约时间和内存,通常在 echo 命令 中直接使用命令置换特性,如下:

$ echo -e “以下为登录到系统中的用户:nn $(who)”

计算机常见编码

计算机常见编码
一. 有关编码的基础知识
1. 位 bit 最小的单元
字节 byte 机器语言的单位
1byte=8bits
1KB=1024byte
1MB=1024KB
1GB=1024MB
2. 二进制 binary
八进制 octal
十进制 decimal
十六进制 hex
3. 字符:是各种文字和符号的总称,包括各个国家的文字,标点符号,图形符
号,数字等。
字符集:字符集是多个符号的集合,每个字符集包含的字符个数不同。
字符编码:字符集只是规定了有哪些字符,而最终决定采用哪些字符,每一
个字符用多少字节表示等问题,则是由编码来决定的。计算机要
准确的处理各种字符集文字,需要进行字符编码,以便计算机能
够识别和存储各种文字。
二. 常见字符集的编码介绍:
常见的字符集有:ASCII 字符集,GB2312 字符集,BIG5 字符集,GB18030 字符集,
Unicode 字符集,下面一一介绍:
1. ASCII 字符集:
 定义:
美国信息互换标准代码,是基于罗马字母表的一套电脑编码系统,主要显示
英语和一些西欧语言,是现今最通用的单字节编码系统。
 包含内容:
控制字符(回车键,退格,换行键等)
可显示字符(英文大小写,阿拉伯数字,西文符号)
扩展字符集(表格符号,计算符号,希腊字母,拉丁符号)
 编码方式:
第 0-31 号及 127 号是控制字符或通讯专用字符;
第 32-126 号是字符,其中 48-57 号为 0-9 十个阿拉伯数字,65-90 号为 26 个
大写英文字母,97-122 号为 26 个英文小写字母,其余为一些标点符号,运
算符号等。
在计算机存储单元中,一个 ASCII 码值占一个字节(8 个二进制位),最高位
是用作奇偶检验位。【奇偶校验是指:在代码传送的过程中,用来检验是否
出错的一种方法。】奇偶校验分为奇校验和偶校验。奇校验规定:正确的代
码一个字节中 1 的个数必须是奇数,若非奇数,则在最高位添 1;偶校验规
定:正确的代码一个字节中 1 的个数必须是奇数,若非奇数,则在最高位添
1。
2. GB2312 字符集:
 定义:
信息交换用汉字编码字符集。是 中国 标准的简体中文字符集,它所收录的汉
字已经覆盖 99.75%的使用频率,在中国大陆和新加坡广泛使用。
 包含内容:
GB2312 收录了简化汉字及一般字符,序号,数字,拉丁字母,日文假名,
希腊字母,俄文字母,汉语拼音符号,汉语注音字母,共 7445 个图形字符。
其中包括 6763 个汉字,一级汉字 3755 个,二级汉字 3008 个。
 编码方式:
GB2312 对所收汉字进行了“分区”处理,每区含有 94 个汉字或者符号,这
种表示方法也叫做“区位码”。
它是用双字节表示的,前面的字节为第一字节,又称“高字节”,后面的为
第二字节,“低字节”。
高位字节,把 01-87 区的区号加上 0xA0(相当于数字 160);低位字节把 01-94
区的区号加上 0xA0(相当于数字 160)。 举个简单的小例子:第一个汉字—
—“啊”,它的区号为 16,位号 01,则区位码是 1601。则高字节位:
16+0xA0=0xB0;低字节位:01+0xA0=0xA1,所以“啊”的汉字处理编码为
0xB0A1。
3. GBK 字符集:
 定义:
GBK 是 GB2312 字符集的扩展(K)( 中国的中文编码表升级,融合了更多的
中文文字符号。),它收录了 21886 个符号,它分为汉字区和图形符号区,
汉字区包括 21003 个字符。GBK 字符集主要扩展了繁体中文字的支持。
4. BIG5 字符集:
 定义:
又称大五码,由台湾五家软件公司创立。因为当时台湾没有一个标准的字符
集,而且 GB2312 又没有收录繁体字,所以才推出了 BIG5。
 包含内容:
BIG5 字符集共收录了 13053 个中文字,该字符集在台湾使用。但是没有考虑
到社会上流通的人名,地方用字,方言用字,化学及生物科等用字,没有包
含日文平假名及片假字母。
 编码方式:
BIG5 也采用双字节存储方法,一两个字节编码一个字。高位字节的编码范围
是 0xA1-0xF9,低位字节的编码范围是0xA1-0xFE。
5. GB18030 字符集:
 定义:
GB18030 字符集标准解决汉字,日文假名,朝鲜语和中国少数民族文字组成
的大字符集计算机编码问题。
 包含内容:
该标准的字符总编码空间超过 150 万个编码位,收录了 27484 个汉字,覆盖
中文,日文,朝鲜语和中国少数民族文字。满足中国大陆,香港,台湾,日
本和韩国等东南亚地区信息交换多文种,大字量,多用途,统一编码格式的
要求。
 编码方式:
GB8030 标准采用单字节,双字节和四字节三种方式对字符编码。 单字节部
分使用 0x00-0x7F 码(对应于 ASCII 码的相应码);
双字节部分,首字节码从 0x81-0xFE,尾字节码分别是 0x40-0x7E 和 0x80-0xFE。
四字节部分采用 0x30-0x39 作为双字节编码扩充的后缀,这样扩充的四字节
编码,其范围是 0x81308130-0x0xFE39FE39,其中第一,三个字节编码位均为
0x81-0xFE,第二,四个为 0x30-0x39。
6. ISO8859-1:拉丁码表。欧洲码表
用一个字节的 8 位表示。
7. Unicode 字符集:
 定义:
( 国际标准码,融合了多种文字 。 所有文字都用两个字节来表示,Java 语言
是 使用的就是 unicode ) University multiple-object coded character set(通用多
八位编码字符集),支持世界上超过 650 种语言的国际字符。Unicode 允许在
同一服务器上混合使用不同语言,它为每种语言的每个字符设定了统一并且
唯一的二进制编码,以满足跨平台,跨语言进行文本转换,处理的要求。
 编码方式:
Unicode 标准始终使用十六进制数字,固定使用 2 个字节来表示一个字符,
共可以表示 65536 个字符。而且书写时在前面加上前缀“U+”,例如 A 的编
码是 004116,则书写成“U+0041”。
 Unicode 字符集包含的编码方案:
 UTF-8 : (。 最多用三个字节来表示一个字符。 )
UTF8 是 unicode 其中的一个使用方式。UTF 的意思是:
unicode translation format,即把 unicode 转作某种格式的意思。 UTF-8
使用可变长度字节来存储 unicode 字符,如 ASCII 字母还是采用一个
字符来存储,希腊字母等采用 2 个字符来存储,而常用的汉字要使
用 3 字节,辅助平面字符则使用 4 字节。
 UTF-16 :
使用一个或两个未分配的 16 位代码单元的序列对 unicode 代码
点进行编码,即 2 个字节表示一个字符。
 UTF-32 :
将每一个 unicode 代码点表示为相同值的 32 位整数。
 关于 unicode 编码的一个问题:
使 用 记 事 本 另 存 为 时 , 可 以 在 ANSI , GBK,Unicode ,
unicode big endian 和 UTF-8 这几种编码之间相互转换。同样是 txt 文
件,windows 是怎么识别编码的呢?
答:平时注意的话可以发现 Unicode,unicode big endian 和 UTF-8
编码的 txt 文件的开头会多出几个字节,分别是(FF,FE),(FE,FF),
(EF,BB,BF)。那么这些标记都是基于什么标准呢?
ANSI 字符集:ASCII 字符集,以及由此派生并兼容的字符集。
UTF-16 与 UTF-8:如“连通”两个字,在 UTF-16 中为:DE 8F 1A 90,
两个字节决定一个汉字;在 UTF-8 中则为:E8 BF 9E E9 80 9A,即 3
个字节决定一个字符。
当一个软件打开一个文本时,首先是要决定这个文本究竟是使用
哪种字符集的哪种编码保存的,软件一般采用三种方式来决定文本
的字符集和编码:检测文件头标识,提示用户选择,根据一定的规
则猜测。不同编码方式的开头字节如下:
EF BB BF UTF-8
FF FE UTF-16,little endian
FE FF UTF-16,big endian
FF FE 00 00 UTF-32, little endian
00 00 FE FF UTF-32,big endian
注:endian 是指字节序,big endian(大尾)和 little endian(小
尾)是 CPU 处理多字节数的不同方式。例如“汉”的 unicode 编码
是 6C49,写到文件中,如果将 6C 写在前面就是 big endian,将 49
写在前面就是 little endian。
8 .总结:
从 ASCII,GB2312,GBK 到 GB18030,这些编码方法是向下兼容的,即同一
个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编
码中,英文和中文可以统一的处理。区分中文编码的方法是高字节的最高位不为
0。
计算机使用的缺省编码方式就是计算机的内码。有的中文 windows 的缺省内
码还是 GBK,可以通过 GB18030 升级包升级到 GB1030。不过相对 GBK 新增的字
符,普通人很难用到的,通常我们用GBK 来指代中文 windows 内码。
GB2312 的原文是区位码,从区位码到内码,需要在高字节和低字节上分别
加上 A0。

浏览器 firefox上小书签(bookmarklet)和 网页剪辑器 在有些网站上无法使用

Content Security Policy 导致 bookmarklet 失效,在about:config里查CSP,把security.csp.enable设置为false,重启浏览器即可。

# Content Security Policy(CSP)简介 #

 

传统的web安全应该主要是同源策略(same origin policy)。A网站的代码不能访问B网站的数据,每个域都和其他的域相互隔离,给开发者营造了一个安全沙箱。理论上这是非常聪明的做法,但是实际执行过程中,攻击者使用了各种高招可以推翻这套保护。

 

XSS攻击者把恶意代码注入在网站常规数据里,这样就可以绕过浏览器的同源策略。浏览器相信来自安全域的所有代码。[XSS Cheat Sheet](http://ha.ckers.org/xss.html)是一个古老但是却很有代表性的攻击方式。一旦攻击者成功注入代码,那么基本上Game Over了,用户数据泄露无疑,我们迫切希望防止这种攻击的发生。

 

本教程指出一种全新的防御方式:Content Security Policy(CSP),这是HTML5带给我们的一套全新主动防御的体系,CSP可以有效的降低XSS攻击,当然首先要浏览器支持。

 

## 白名单 ##

 

浏览器的主要问题就是无法区分脚本是来自自己的应用还是来自第三方攻击者的恶意注入,而这一点恰恰被攻击者利用。举个例子:Google 的 **+1** 按钮会加载并执行一个来自 https://apis.google.com/js/plusone.js 的脚本,我们信任该脚本,但是我们不能期望浏览器去区分来自api.google.com的脚本是安全的,来自apis.evil.example.com的就不安全。浏览器都会下载并且执行。
CSP定义了 Content-Security-Policy HTTP头来为你的内容创建一个来源的白名单。浏览器只允许白名单域里的资源和代码执行。这样就算攻击者找到了一个漏洞注入脚本,脚本不在白名单里面照样无法执行。

 

以前面的那个例子来继续说明,因为我们信任 api.google.com的代码,我们可以这样定义我们的协议

 

        Content-Security-Policy: script-src ‘self’ https://apis.google.com

 

so easy,顾名思义,script-src控制script标签相关的策略,上例中,我们指定了’self’和https://apis.google.com作为他的值,浏览器只会下载并执行本域和https://apis.google.com的脚本。

 

如果有其他的脚本,浏览器会抛出如下异常,任凭攻击者如何注入,他都只能得到下面的结果:

XSS终结者:Content Security Policy(CSP)策略

## 策略支持多种资源 ##

 

除了script资源外这种最明显的注入外,CSP还提供了多种指令来控制各种资源的加载。用法和script-src类似,我们快速过一下这些指令:

 

– **connect-src**

 

限制使用XHR,WebSockets,和EventSource的连接源。

 

– **font-src**

 

指定字体的下载源。

 

– **frame-src**

 

指定frame可以嵌入的连接源。

 

– **img-src**

 

指定图片的加载源。

 

– **media-src**

 

指定video和audio的数据源。

 

– **object-src**

 

指定Flash和其他插件的连接源。

 

– **style-src**

 

指定link的连接源。和script-src类似。

 

默认如果你不指定这些指令的值,将允许所有的来源,例如 font-src:*和不写font-src是等价的。

 

当然你也可以重写默认值,只要使用default-src就可以。比如:指定了default-src:https://example.com 但是没有指定font-src,那么你的font-src也只能从https://example.com加载。在之前的例子中我们只指定了script-src,这说明我们可以从任何其他的地方加载image,font和其他资源。

 

你可以为你的web应用指定多个或者一个指令,只需要在HTTP头里面列出来这些值,不同的值之间用“;”来分隔。但是如果你写成 script-src https://host1.com;script-src:https://host2.com,那么第二个script-src将不起作用,正确的写法是:script-src https://host1.com https://host2.com

 

再举一个例子:如果你的静态资源全都来自一个CDN,并且你知道不会有frame和其他插件。你可以这样写

 

Content-Security-Policy:default-src https://cdn.example.net;frame-src ‘none’;object-src:’none’

 

## 细节实现 ##

 

X-WebKit-CSP,X-Content-Security-Policy都是曾经的HTTP头,在现代浏览器(除了IE)中,都已经支持不带前缀的 Content-Security-Policy头了。

 

CSP策略要求你每一个页面请求都要带上Content-Security-Policy头,这提供了很多灵活性,你甚至可以根据条件判断什么时候需要加CSP策略,什么时候不要。

 

协议的 source list 同样很灵活,你可以指定协议(data:,https:),或者只指定主机名:(example.com,允许任意协议,任意端口),或者全限制(https://example.com:443)。甚至可以使用通配符,*://*.example.com:*,匹配example的任何子域,任意协议和端口,**注意:example.com不允许使用通配符**。

 

下面四个关键词也可以使用在source list中:

 

– **’none’**

 

什么都不匹配。

 

– **’self’**

 

匹配当前的域,不包括子域。

 

– **’unsafe-inline’**

 

允许inline JavaScript 和 CSS。

 

– **’unsafe-eval’**

 

允许 eval,new Function等的执行。

 

这几个关键词需要用单引号引用起来,如果不引用,则会被认为是域名。

 

## 沙箱 ##

 

还有一个值得一提的就是沙箱:sandbox。
沙箱的作用有一点不一样,他主要用来限制页面能做什么操作,而不是可以加载哪些资源。如果指定了sandbox指令,页面会当做一个iframe页面来对待:必须同源,禁止表单提交等。这些内容超出了本文的范畴,如果需要了解,可以访问如下链接:[“sandboxing flag set” section of the HTML5 spec.](http://www.whatwg.org/specs/web- … sandboxing-flag-set)

 

## 内联代码有风险 ##

 

CSP是基于白名单的,这种方式很清楚的可以区分哪些资源被认可,哪些不能。但是这种方式没法解决一个很大的问题:内联脚本注入。如果攻击者可以注入一段脚本:

 

        <script>sendMyDataToEvilDotCom();</script>

 

浏览器没有机制区分这是合理代码还是恶意代码,CSP解决这个问题的方式是:**禁止所有内联脚本**。
不仅仅包括<script>标签里的值,还包括内联事件和javascript:[CODE]的方式,如果你的代码是这样写的,那么你需要做一些改造了。

 

例如:

 

        <script>
                function doAmazingThings(){
                        alert(‘YOU ARE AMAZING’);
                }
        </script>
        <button>AM I amazing?</button>

 

需要改成

 

        <!– amazing.html –>
        <script src=’amazing.js’></script>
        <button id=’amazing’>Am I amazing?</button>

 

—-

 

        // amazing.js
        function doAmazingThings() {
          alert(‘YOU AM AMAZING!’);
        }
        document.addEventListener(‘DOMContentReady’, function () {
          document.getElementById(‘amazing’)
                  .addEventListener(‘click’, doAmazingThings);
        });

 

重写的代码更符合标准,CSP也可以很好的运行。外部资源可以更好的被缓存和压缩。这是良好的编码习惯。

 

内联样式(inline style)有同样的处理方式。

 

如果你坚决需要使用内联脚本或者样式,你可以使用’unsafe-inline’作为script-src和style-src的值,但我们不建议这么做。禁止内联脚本和样式是CSP提供的安全机制,是值得做出的妥协。

 

## Eval

 

尽管攻击者不能直接注入脚本,她可能会使用一些字符串的混淆瞒混浏览器过关,比如setInterval([string],…),可能最终会导致一些恶意攻击代码的执行,CSP规避折中风险的方法就是彻底禁用。

 

– **使用原生JSON.parse,避免使用eval**

 

原生的JSON.parse绝对安全,而且除了IE8以下之外,其他浏览器都已经支持的很好了。

 

– **重写setTimeout**

 

                setTimeout(“document.querySelector(‘a’).style.display=’none’;”,10);

 

        改写成

 

                setTimeout(function(){
                        document.querySelector(‘a’).style.display = ‘none’;
                },10);

 

– **避免运行时的模板工具**

 

        许多模板库使用 new Function() 加速运行时模板的生成。这种做法虽然很赞,但是却带来了风险。有些库支持不带new Function的CSP版本,降级到不使用eval的版本。

 

如果你使用的模板支持预编译(Handlebars),那将比最快的运行时编译模板都快,并且安全。同样,如果你必须使用这类 text-to-javascript方法,加入’unsafe-eval’到script-src
。不够不建议这样。

 

## Reporting

 

CSP的阻止不受信任的资源在客户端执行是一个不错的机制,但是如果能传回服务端一些报告将更棒。这样你可以在第一时间定位一些攻击和注入。report-uri可以允许指定一个地址。

 

        Content-Security-Policy: default-src ‘self’; report-uri /my_amazing_csp_report_parser;

 

报告内容如下

 

        {
                  “csp-report”: {
                    “document-uri”: “http://example.org/page.html”,
                    “referrer”: “http://evil.example.com/”,
                    “blocked-uri”: “http://evil.example.com/evil.js”,
                    “violated-directive”: “script-src ‘self’ https://apis.google.com“,
                    “original-policy”: “script-src ‘self’ https://apis.google.com; report-uri http://example.org/my_amazing_csp_report_parser
                  }
        }
报告包含大量信息可以帮你定位攻击,包括攻击发生的页面,referer,block-uri,以及违背的策略和你定义的策略。

 

## Report-Only

 

        Content-Security-Policy-Report-Only: default-src ‘self’; …; report-uri /my_amazing_csp_report_parser;

 

这样可以不阻止脚本和其他资源的运行,仅仅向后台发送一份报告。

 

## 实际使用

 

CSP在Chrome 16+,Safari 6+,Firefox 4+上得到了很好的支持。在IE10上得到了部分支持。Twitter(Twitter’s case study)和Facebook都率先商用。

 

### Use Case #1:Social media widgets

 

– Google’s **+1 button** 包括一段来自https://apis.google.com,和一个内嵌的iframe来自https://plusone.google.com. 一个最基本的policy就是:script-src https://apis.google.com; frame-src https://plusone.google.com.

 

– Facebook’s **Like button** 可以有多种实现方法,我推荐使用iframe

 

                frame-src https://facebook.com

 

默认facebook 的 iframe 默认使用的是 //facebook.com,请显示的使用https,如果没必要尽量使用https。

 

### Use Case #2 Lockdown

 

假设你在做一个银行的网站,你需要保证除了你自己的脚本,其他的资源严禁执行,那么首先你可以使用default-src ‘none’。

 

银行的图片,样式和脚本都来自CDN:https://cdn.mybank.net, 并且 XHR to https://api.mybank.com/ 会拉取大量数据,Frame也有使用,不过只加载本域的页面,没有第三方域。
网站上没有flash,fonts。那么一个严格的CSP可以这样写:

 

        Content-Security-Policy: default-src ‘none’; script-src https://cdn.mybank.net; style-src https://cdn.mybank.net; img-src https://cdn.mybank.net; connect-src https://api.mybank.com; frame-src ‘self’

 

### Use Case #3 SSL Only

 

一个婚戒论坛管理员希望保证所有的资源都是要你管ssl来加载,但是他有大量内联脚本,全部改掉是不现实的。我们可以设计出如下的规则:

 

        Content-Security-Policy: default-src https; script-src https: ‘unsafe-inline’; style-src https: ‘unsafe-inline’

 

## 未来

 

Content Security Policy 1.0 是 W3C Candidate Recommendation,浏览器很快就实现了。现在W3C正在起草 Content Security Policy 1.1
值得关注的1.1的新特性有:

 

– **支持 inline script 和 style**

 

虽然我们应当尽量避免使用inline script和style,但我们依然需要兼顾现有的老站点,所以1.1使用 nouces 和 hashes两套机制来确保内联的脚本和样式是安全的。

 

– **策略可以使用meta加入**

 

支持使用meta标签加入CSP策略

 

        <meta http-equiv=”Content-Security-Policy” content=”[POLICY GOES HERE]”>

 

你甚至可以使用javascript来注入一段meta CSP策略。

 

– **DOM API**

 

将来,你将可以使用javascript来查询和修改CSP策略,你可以指定不同的策略来应对不同的情况。

 

– **新的指令**

 

一些新的指令会加入,包括:
plugin-types 限制插件可以加载MIME类型。
form-action 表单提交目标地址的限制。

 

使用jquery获取GET参数

在前端有时候需要获取当前地址栏某个GET参数的值,这里有个Jquery的简单实现

// 获取get
(function($) {
$.extend({
urlGet:function()
{
var aQuery = window.location.href.split(“?”); //取得Get参数
var aGET = new Array();
if(aQuery.length > 1)
{
var aBuf = aQuery[1].split(“&”);
for(var i=0, iLoop = aBuf.length; i<iLoop; i++)
{
var aTmp = aBuf[i].split(“=”); //分离key与Value
aGET[aTmp[0]] = aTmp[1];
}
}
return aGET;
}
});
})(jQuery);
var GET = $.urlGet(); //获取URL的Get参数
var tnid = GET[‘tnid’]; //取得id的值
if(typeof tnid != ‘undefined’) {
$.cookie(‘ypre_tnid’,tnid);
}