Web开发常见安全问题
转载自: http://blog.csdn.net/fengyinchao/article/details/50775121
不是所有 Web 开发者都有安全的概念,甚至可能某些安全漏洞从来都没听说过。这就是这篇科普文章的存在意义,希望 Web 开发者在开发时能依此逐条检查代码中的安全问题。
注:服务器运维相关的安全注意事项不在本文之列
这篇文章主要包含以下内容:
前端安全
- XSS 漏洞
- CSRF 漏洞
后端安全
- SQL 注入漏洞
- 权限控制漏洞
- SESSION 与 COOKIE
- IP 地址
- 验证码
前言
水桶底部只要有一个洞,水就能全部流光。Web 安全同理。
前端安全
前端安全主要表现为通过浏览器间接影响到用户数据的安全问题。
XSS 漏洞
XSS (Cross-Site Scripting),是一个我觉得耳熟能详的前端安全问题。通过构造特殊数据,在用户浏览器上执行特定脚本,从而造成危害(如以用户身份发帖、转账等)。
由于页面内 JavaScript 几乎可以完成各种事情,因此一旦网站上有 XSS 漏洞,那些没有验证码等确认措施的操作大多都能不知情地完成,其危害甚大。
来看看几个存在 XSS 漏洞的例子吧:
Case A: HTML DOM
<a href="/user/1">{{ user_name }}</a>Exploit:
<script>alert(1)</script>
Result:
<a href="/user/1"><script>alert(1)</script></a>最基本的例子,如果此处不对
user_name中的特殊符号进行 escape,就会造成 XSS。Case B: HTML Attribute
<img src="{{ image_url }}">Exploit:
" onerror="alert(1)
Result:
<img src="" onerror="alert(1)">这个例子表明,如果只对尖括号进行 escape 是不够的,很多时候引号也需要被 escape。简单来说,对不同输出场景,需要使用不同的 escape 规则。
Case C: JavaScript
<script>var user_data = {{ user_data|json_encode }};</script>Exploit:
{"exploit": "</script><script>alert(1);//"}
Result:
<script>var user_data = {"exploit": "</script><script>alert(1);//"};</script>这是一个特别的例子,大多数人觉得,对于输出在
<script>中的内容,json_encode一下就安全了,其实不然。在这个例子中,XSS 仍然发生了。更可怕的是,不少编辑器的代码高亮方案中甚至无法看出上面的 Result 中存在 XSS 漏洞。如 Sublime Text 下,代码高亮结果是这样的,看上去没有任何问题:

但是浏览器解析出来的结果是这样的:

解决方法:
在不同上下文中,使用合适的 escape 方式
不要相信 任何 来自用户的输入(不仅限于 POST Body,还包括 QueryString,甚至是 Headers)
CSRF 漏洞
CSRF (Cross-site request forgery),是一个知名度不如 XSS 但是却同样具有很大杀伤力的安全漏洞。它的杀伤力大正是因为很多开发者不知道这个漏洞。
举个栗子,如果你网站 A 上的「登出」功能是这样实现的:
<a href="http://a.com/logout.php">登出</a>则存在 CSRF 漏洞。假设网站 B(当然也可以是网站 A 本身)中有这么一段代码:
<img src="http://a.com/logout.php">那么当用户访问的时候,就会导致网站 A 上的会话被登出。
需要注意的是,不只是 GET 类请求,POST 类请求同样会存在 CSRF 漏洞,例如网站 B 中:
<form action="http://a.com/transaction" method="POST" id="hack">
<input type="hidden" name="to" value="hacker_account">
<input type="hidden" name="value" value="100000">
</form>
<script>document.getElementById("hack").submit();</script>那么用户访问网站 B 的时候,便会自动携带 A 的 SESSION 信息,成功 POST
/transaction到网站 A。这个漏洞危害很大,例如以前某些 BTC 交易所就存在这个漏洞,一旦用户被诱骗访问了黑客精心布置的网站就会造成资金损失;又例如,以前某中国著名社交网站也存在这个漏洞,更糟糕的是该网站还允许用户递交自己的
<img>显示在所有人的信息流中,且某些传播性操作可以用GET方式达成,这就导致黑客可以进行病毒式扩散,当然,仅仅是把<img src="logout.do">嵌入信息流也是有足够大杀伤力的 :)解决方法:
给所有请求加上 token 检查。token 一般是随机字符串,只需确保其不可预测性即可。token 可以在 QueryString、POST body 甚至是 Custom Header 里,但千万不能在 Cookies 里。
检查
referer(请注意,这往往不能防御来自网站自身的 CSRF 攻击,如用户评论中的<img>就是一个常见触发点)
后端安全
在这里,后端安全指的是对服务器数据等可能造成直接影响的安全问题。黑客一般会直接构造数据进行攻击。
SQL 注入漏洞
SQL 注入漏洞应该也是一个大多数开发者都知道的漏洞。
考察以下 PHP 代码:
<?php $user = mysql_query('SELECT * FROM USERS WHERE UserName="'.$_GET['user'].'"');那么当请求中 user 参数为
";DROP TABLE USERS;--时,合成的 SQL 语句是:SELECT * FROM USERS WHERE UserName="";DROP TABLE USERS;--"这里产生什么结果就不需要解释了吧 :) 另外,通过 SQL 注入,往往还能拿到系统权限。
解决方法:
所有 SQL 语句都使用参数化查询(推荐)或对参数进行 escape(不推荐)
权限控制漏洞
这个就不仔细展开了,未经授权可以进行的操作都是权限控制漏洞。
例如,某些网站的后台操作就仗着「以为用户不知道入口地址」不进行任何权限检查,又例如,某些操作可能出现不允许更改的字段被用户递交更改(往往是那些网页上标记为
disabled或者hidden的字段),再例如,允许通过../访问到不应该被访问的文件等(一般存在于include中)。解决方法:
所有地方都要进行权限检查(如是否已登录、当前用户是否有足够权限、该项是否可修改等),总之,不要相信任何来自用户的数据,URL 当然也是。
SESSION 与 COOKIE
Session 和 Cookie 是两种用于存储用户当前状态的工具。某些开发者不了解 Session 与 Cookie 的区别,误用或者混用,导致敏感信息泄露或者信息篡改。
Cookie 存储在浏览器上,用户可以查看和修改 Cookie。
Session 是存储在服务端的数据,一般来说安全可靠;大多数 Session 都是基于 Cookie 实现的(在 Cookie 中存储一串 SESSION_ID,在服务器上存储该 SESSION_ID 对应的内容)。IP 地址
首先,用户的 IP 地址一般存储在
REMOTE_ADDR中,这是唯一的可信的 IP 地址数据(视不同语言而定)。然后某些代理服务器,会将用户的真实 IP 地址附加在 header 的VIA或X_FORWARDED_FOR中(因为REMOTE_ADDR是代理服务器自身的 IP)。所以,要获取用户 IP 地址,一般做法是,判断是否存在VIA或者X_FORWARDED_FOR头,如果存在,则使用它们,如果不存在则使用REMOTE_ADDR。这也是网上大多数所谓教程提供的方法。这就产生问题了,
X_FORWARDED_FOR或VIA是 HTTP Header,换句话说,它们是可以被伪造的。例如,在投票中,如果采信了X_FORWARDED_FOR,往往意味着被刷票。解决方法:
只使用
REMOTE_ADDR作为获取 IP 的手段。验证码
验证码里常见的问题有:非一次性、容易被识别。
非一次性指的是,同一个验证码可以一直被用下去。一般来说,每进行一次验证码校对(无论正确与否),都应该强制更换或清除 Session 中的验证码。
关于识别问题,在当前科技水平下,不加噪点不加扭曲的验证码几乎是 100% 可识别的。所以大家自己看着办吧…
Web开发常见安全问题的更多相关文章
- Web 开发常见安全问题
不是所有 Web 开发者都有安全的概念,甚至可能某些安全漏洞从来都没听说过.这就是这篇科普文章的存在意义,希望 Web 开发者在开发时能依此逐条检查代码中的安全问题. 注:服务器运维相关的安全注意事项 ...
- web开发常见的鉴权方式
结合网上找的资料整理了一下,以下是web开发中常见的鉴权方法: 预备:一些基本的知识 RBAC(Role-Based Access Control)基于角色的权限访问控制(参考下面①的连接) l ...
- web开发常见的几大安全问题
一.SQL注入 SQL注入是一种常见的Web安全漏洞,攻击者利用这个漏洞,可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击.SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求 ...
- Web开发常见的几个漏洞解决方法 (转)
基本上,参加的安全测试(渗透测试)的网站,可能或多或少存在下面几个漏洞:SQL注入漏洞.跨站脚本攻击漏洞.登陆后台管理页面.IIS短文件/文件夹漏洞.系统敏感信息泄露. 1.测试的步骤及内容 这些安全 ...
- Web开发常见的几个漏洞解决方法
http://www.cnblogs.com/wuhuacong/archive/2013/04/15/3022011.html 如何利用SQL注入漏洞攻破一个WordPress网站 平时工作,多数是 ...
- web前端常见安全问题
1,SQL注入 2,XSS 3,CSRF 4.文件上传漏洞 1,SQL注入:这个比较常见,可能大家也听说过,就是URL里面如果有对数据库进行操作的参数时,要做一下特殊的处理,否则被别有用心的人利用的话 ...
- web开发常见性能优化方式
经常使用的高并发. 高性能web,数据库server. 1.html 静态化 : 如新闻频道更新的非常快,都是通过cms静态生成(门户,信息公布类型的站点,交互性高的如猫扑的大杂烩也是静态化,实时静 ...
- web开发常见bug汇总
1.在做使用struts2进行文件上传时总是出现 java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOu ...
- Web开发常见的漏洞
SQL注入漏洞 跨站脚本攻击漏洞 登陆后台管理页面 IIS短文件/文件夹漏洞 系统敏感信息泄露
随机推荐
- [Alpha阶段]第八次Scrum Meeting
Scrum Meeting博客目录 [Alpha阶段]第八次Scrum Meeting 基本信息 名称 时间 地点 时长 第八次Scrum Meeting 19/04/12 新主楼F座2楼 35min ...
- css 3 新特性
CSS3的新特性大致分为以下六类 1.CSS3选择器 2.CSS3边框与圆角 3.CSS3背景与渐变 4.CSS3过渡 5.CSS3变换 6.CSS3动画 下面分别说一说以上六类都有哪些内容 CSS3 ...
- Asp.Net Core Options模式的知识总结
Options模式是Asp.Net Core中用于配置的一种模式,它利用了系统的依赖注入,并且还可以利用配置系统.它使我们可以采用依赖注入的方法直接使用绑定的一个POCO对象,这个POCO对象就叫做O ...
- 私有仓库 gitlab 部署笔记
--------------------------------------------gitlab简介------------------------------------------------ ...
- 1、Mysql无法创建外键的原因 2、MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用
在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1. 两个字段的类型或者大小不严格匹配.例如,如果一个 ...
- dataTable tab栏切换时错位解决办法
做后台管理类网站肯定要写列表,首选dataTable,功能强大 最近在做一个tab栏切换时发现了一个很诡异的事情:表头错位了! 主要时因为当table被隐藏后,table的header宽度会计算错乱, ...
- centos6.5之phpmyadmin安装
PhpMyAdmin 首先我们看一下百度百科,看一下phpmyadmin是做什么的. phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让 ...
- python-itchat 统计微信群、好友数量的实例
今天小编就为大家分享一篇python-itchat 统计微信群.好友数量,及原始消息数据的实例,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 效果: 好友: # 获取自己的用 ...
- python3 重写、重用、重载
重用重用是用于在对象的概念中,实现代码的重用性 在继承角度,在子类继承父类之后,重新使用父类属性方法即是代码的重用 在组合角度,在一个类中以另外一个类的对象作为数据属性,提高代码的重用性 重用的方式: ...
- Centos 6.5下mysql 8.0.11的rpm包的安装方式
1.系统版本及mysql下载地址 操作系统:Centos 6.5(Centos 7.4下载对应的mysql版本安装同理) mysql数据库版本:mysql8.0.11 mysql官方网站:http:/ ...