之前做项目写的那叫一个随意.. 由于都是小项目和练手 demo, 完全没有管过安全相关方面的知识.. 回头重新总结一下吧
目前比较常见的安全问题大概有这几种:
XSS Cross Site Script 跨站脚本攻击
CSRF Cross-site request forgery 跨站请求伪造
SQL 注入
DDOS Distributed Denial of Service 分布式拒绝服务
比较少见的, 还是了解一下的:
iframe 风险
上传漏洞
点击劫持
钓鱼
一个个来说吧~
XSS
简单来说就是页面执行了不被期望解析的代码, 恶意 web 用户将代码植入到提供给其它用户使用的页面. 比如评论内容为死循环的 script 代码段, get 参数为 js 代码等.
跨站脚本攻击的危害: 窃取 cookie, 放蠕虫, 网站钓鱼 ...
跨站脚本攻击的分类主要有: 存储型 XSS, 反射型 XSS,DOM 型 XSS
解决办法就是把所有前段输出数据转义, 保证不被解析.
原则: 宁死也不让数据变成可执行的代码, 不信任任何用户的数据, 严格区分数据和代码.
保存的数据库的时候, for PHPer,
addslashes,stripcslashes 这两个函数可以为预定义',",\ 打上(去掉)'\'.
htmlentities 或者 htmlspecialchars 会将预定义的字符转化为 html 实体, 也就是让浏览器输出 html 代码.
js 中, html 实体应直接加入 innerHTML 里面不会被解析, 会被显示成代码, 如果是 html 字符的话就需要加入 textContent 里面, 可以用这个来写过滤函数.
- // 防止中文乱码, 但我好像没事
- htmlentities($str, ENT_COMPAT , "UTF-8");
原代码
- <script>alert(1)<\/script>
- <p>1<p > 在</p>11</p>
转化输出大概是这样的
- <script>alert(1)<\/script>
- <p>1<p>222</p>11</p>
- CSRF
可以这么理解 CSRF 攻击: 攻击者盗用了你的身份, 以你的名义发送恶意请求. CSRF 能够做的事情包括: 以你名义发送邮件, 发消息, 盗取你的账号, 甚至于购买商品, 虚拟货币转账......
造成的问题包括: 个人隐私泄露以及财产安全. 简单来说, 通过客户浏览器的 cookie 等个人信息去以客户身份行动.
Web 的隐式身份验证机制只能保证请求是来自于你的浏览器, 不能保证是不是用户操作的.
简单来说 CSRF 攻击可以分成两个部分, 在可信任的访问网站登陆并生成 cookie, 在不登出的情况下有意或者无意的访问危险网站. 这里的危险网站访问不一定是一个网页, 可以是一个请求, 一个资源的地址.
一般策略有几种, 验证 HTTP Referer 字段; 添加 token 并验证; 重要操作用 post, 验证码等.
验证 HTTP Referer 字段
根据 HTTP 协议, 在 HTTP 头中有一个字段叫 Referer, 它记录了该 HTTP 请求的来源地址. 但这个属性是网页浏览器的, 安全性依赖于第三方 (即浏览器) 上, 旧浏览器上是可以修改的.
其次, 有些用户有关闭 Referer 的隐私需求, 并正常访问时, 会被认为是 CSRF 攻击.
这种方法的好处就是简单易行, 不改变任何源代码, 直接写一个拦截的中间件就行了, 缺点也很明显, 过度依赖于第三方. 但 Referer Check 可以用来监控 CSRF 攻击.
添加 token 并验证
token 是两端都保存的, 标志用户的长字符串. IBM 提到的做法是将 token 完全是页面获取, 镶嵌进 form 表单的所有 url 里面成为参数(post 则是隐藏 input value).
这样对这个页面的 dom 操作比较复杂, 影响性能, 尤其是异步的话要更新更多 form.
当然我们还是可以存在 cookie 里面的. 那么问题来了, 如果存在 cookie 里, 岂不是和不用 token 没区别了?
区别还是有的, 一般的 cookie 是直接用作身份凭证参数, 但用 token 的时候可以把 cookie 当成存储的地方(cookie 可以加 HttpOnly)!
需要的时候表单从 cookie 中找到需要的 token 在辅以算法 (如 md5) 或者参数调用, 达到目的.
当然也可以放在请求的 header 里作为参数.
Token 应该是一次性的, 即每次请求成功后要更新 Token, 这样也能刷新登陆时间. 比较好用的库: jwt.
验证码
重要步骤可以使用, 不过尽量少用, 比较烦人..
SQL 注入
就是防止储存的数据对你的服务器, 和业务造成印象. 还是那几个, 引号, 特殊符号等, 根本的手段就是参数化查询或者做词法分析.
还是那个原则, 永远不要相信用户的输入. 不要使用动态拼装 SQL 语句. 可以调用已有的高级参数化 sql 类实现, 内部一般都会有自动检测转译语法.
ps: 为应用创建单独的用户来使用数据库, 控制权限.
DDOS 攻击
指借助于客户 / 服务器技术, 将多个计算机联合起来作为攻击平台, 对一个或多个目标发动 DDoS 攻击, 从而成倍地提高拒绝服务攻击的威力.
高防服务器
高防服务器主要是指能独立硬防御 50Gbps 以上的服务器, 能够帮助网站拒绝服务攻击, 定期扫描网络主节点等, 这东西是不错, 就是贵~
黑名单
设置黑名单, 此方法秉承的就是 "错杀一千, 也不放一百" 的原则, 会封锁正常流量, 影响到正常业务.
DDoS 清洗
DDoS 清洗会对用户请求数据进行实时监控, 及时发现 DOS 攻击等异常流量, 在不影响正常业务开展的情况下清洗掉这些异常流量.
CDN 加速
CDN 服务将网站访问流量分配到了各个节点中, 这样一方面隐藏网站的真实 IP, 另一方面即使遭遇 DDoS 攻击, 也可以将流量分散到各个节点中, 防止源站崩溃.
这个是真的一点经验都没有... 也不能实践很尴尬, 就先了解一下吧.
iframe 风险
广告需求的 iframe 可能会因为到期域名更换等原因形成威胁. 项目中目前还没用到过 iframe 这类元素, 无经验..
上传漏洞
上传的文件是有可能是可执行的脚本或者其他的非期望的文件, 对服务器构成威胁.
应该严格控制上传的类型, 而不只是上传文件的后缀, 友情提问 @简书: 为什么我头像会动, 不是限制 jpg,jpeg,png 吗?(滑稽).
此外, 上传的文件保存路径的所有文件, 非特殊情况文件路径应该设定不可被执行(nignx 设置).
- location /protected/ {
- deny all;
- }
在判断文件类型时, 可以结合使用 MIME Type, 后缀检查等方式.
在文件类型检查中, 强烈推荐白名单方式, 黑名单的方式已经无数次被证明是不可靠的.
此外, 对于图片的处理, 可以使用压缩函数或者 resize 函数, 在处理图片的同时破坏图片中可能包含的 HTML 代码.
还可以单独设置文件服务器的域名: 由于浏览器同源策略的关系, 一系列客户端攻击将失效.
点击劫持和钓鱼
这两个都差不多, 算是比较久远的攻击手法, 都是模拟出虚假页面来获取用户的登录账号和密码. 一个利用覆盖遮盖, 一个是利用路由跳转到钓鱼网站.
高级一点的都可以牵扯到 xss 攻击上. 一般的话注意一下 https 和网址影噶就差不多了..
参考资料
IBM CSRF 攻击的应对之道 https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/
关于 HTML 代码注入, XSS 攻击问题解决 https://www.aliyun.com/jiaocheng/632054.html
浅谈 CSRF 攻击方式 by hyddd http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
什么是 DDoS 攻击? 的回答 by 又拍云 https://www.zhihu.com/question/22259175
文件上传漏洞及解析漏洞总结 by wt7315 http://blog.51cto.com/wt7315/1865580
来源: http://www.jianshu.com/p/f68e9d13695d