搞开发三年了,从一个初级菜鸟到中级菜鸟,虽然还是菜鸟,但在开发中已经有了自己很多的想法。关于web开发安全方面的所思所做跟大家予以分享,吐槽无需等待,即可拍砖,热烈欢迎
项目刚上线,发现就被盯上了,每天有很多莫名其妙的IP在扫描网站,试探着各种漏洞,当然,作为一名还算负责的开发者,立即绷紧了神经,项目紧急更新,一些特定目录的访问绑定了公司IP,实现白名单访问机制,开场完。。正文开始:
1. 禁用 X-Powered-By ,无论PHP,node很多框架都默认开启此参数,这是将所用的服务器框架或开发语言,赤裸裸的告诉不怀好意者呀,例如此网站:
Connection:Keep-AliveContent-Encoding:gzipContent-Type:text/htmlDate:Thu, 22 Jan 2015 08:16:42 GMTKeep-Alive:timeout=1, max=996Server:ApacheTransfer-Encoding:chunkedVary:Host,Accept-EncodingX-Powered-By:PHP/5.3.3
亲@途牛网,赶紧禁用吧,如果PHP 5.3有漏洞,你明白的
2. 用户登录, Google最近实验表明99%的验证码都是可以机器识别的,所以原来那套靠验证码防止机器暴力破解的法子貌似不可行了, 所以我们必须限制密码错误次数,例如5次自动锁定,当天5次自动锁定,特定Ip绑定, 短信验证等等
数据库设计CREATE TABLE users( id uuid NOT NULL, username character varying(50), -- 用户名 email character varying(100), -- 邮箱 nick_name character varying(50), -- 昵称 pwd character varying(50), -- 密码 registry_at timestamp without time zone DEFAULT now(), -- 注册时间 registry_ip character varying(20), -- 注册IP status integer DEFAULT 0, -- 状态 0.未激活 1.正常 -1.禁用 login_fail_times integer DEFAULT 0, -- 登录错误次数 CONSTRAINT users_pkey PRIMARY KEY (id), CONSTRAINT users_email_key UNIQUE (email), CONSTRAINT users_username_key UNIQUE (username))//记录每次登陆CREATE TABLE login_log( id bigserial NOT NULL, account_id bigint, -- 账号ID ip character varying(20), -- 登录IP create_at timestamp without time zone DEFAULT now(), -- 创建时间 channel character varying(20) DEFAULT 'web'::character varying, -- 登录渠道 os character varying(20) DEFAULT 'web'::character varying, -- 系统 android, os, web success boolean DEFAULT false, remark text, -- 备注 CONSTRAINT login_log_pkey PRIMARY KEY (id))
3. 网站管理平台,强烈建议通过IP白名单机制来访问网站管理平台,一边面保护自己的网站,另一方面呵护用户的隐私
module.exports = function(req, res, next) { if (/^\/admin/.test(req.originalUrl)) { var ip = req.ip, hostReg = /127\.0\.0\.1/, wanIpReg = /192\.168\./, companyIpReg = /110\.110\.110\.110/; if (!hostReg.test(ip) && !wanIpReg.test(ip) && !companyIpReg.test(ip)) { console.info(ip+"....reject...."); res.send(401); } else { console.info(ip+"....across....."); next(); } } else { next(); }}
4. 记录IP访问日志,如果访问太频繁,如100次每秒,果断加入到黑名单IP中
5. 关于登录页面,加上referer验证,crsf跨域提交验证貌似都没有什么害处
//csrf防护//检查refererfunction checkReferer(req, res, next) { var referer = req.headers['referer']; var host = req.host; if (referer && referer.indexOf(host) !== -1) { next(); } else { res.simpleResponse(-403, '/', '/', {errMsg:''}, req); }}
...
将安全进行到底,欢迎拍砖,在被拍中提高...