博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Web 开发常见安全问题
阅读量:4315 次
发布时间:2019-06-06

本文共 2826 字,大约阅读时间需要 9 分钟。

不是所有 Web 开发者都有安全的概念,甚至可能某些安全漏洞从来都没听说过。这就是这篇科普文章的存在意义,希望 Web 开发者在开发时能依此逐条检查代码中的安全问题。

注:服务器运维相关的安全注意事项不在本文之列

这篇文章主要包含以下内容:

前端安全

XSS 漏洞

CSRF 漏洞
后端安全

SQL 注入漏洞

权限控制漏洞
SESSION 与 COOKIE
IP 地址
验证码
前言

水桶底部只要有一个洞,水就能全部流光。Web 安全同理。

前端安全

前端安全主要表现为通过浏览器间接影响到用户数据的安全问题。

XSS 漏洞

XSS (Cross-Site Scripting),是一个我觉得耳熟能详的前端安全问题。通过构造特殊数据,在用户浏览器上执行特定脚本,从而造成危害(如以用户身份发帖、转账等)。

由于页面内 JavaScript 几乎可以完成各种事情,因此一旦网站上有 XSS 漏洞,那些没有验证码等确认措施的操作大多都能不知情地完成,其危害甚大。

来看看几个存在 XSS 漏洞的例子吧:

Case A: HTML DOM

Exploit:

Result:

最基本的例子,如果此处不对 user_name 中的特殊符号进行 escape,就会造成 XSS。

Case B: HTML Attribute

%7B%7B%20image_url%20%7D%7D

Exploit:

" οnerrοr="alert(1)

Result:

这个例子表明,如果只对尖括号进行 escape 是不够的,很多时候引号也需要被 escape。简单来说,对不同输出场景,需要使用不同的 escape 规则。

Case C: JavaScript

Exploit:

{"exploit": "

这是一个特别的例子,大多数人觉得,对于输出在

那么用户访问网站 B 的时候,便会自动携带 A 的 SESSION 信息,成功 POST /transaction 到网站 A。

这个漏洞危害很大,例如以前某些 BTC 交易所就存在这个漏洞,一旦用户被诱骗访问了黑客精心布置的网站就会造成资金损失;又例如,以前某中国著名社交网站也存在这个漏洞,更糟糕的是该网站还允许用户递交自己的 显示在所有人的信息流中,且某些传播性操作可以用 GET 方式达成,这就导致黑客可以进行病毒式扩散,当然,仅仅是把 logout.do 嵌入信息流也是有足够大杀伤力的 :)

解决方法:

给所有请求加上 token 检查。token 一般是随机字符串,只需确保其不可预测性即可。token 可以在 QueryString、POST body 甚至是 Custom Header 里,但千万不能在 Cookies 里。

检查 referer (请注意,这往往不能防御来自网站自身的 CSRF 攻击,如用户评论中的 就是一个常见触发点)

后端安全

在这里,后端安全指的是对服务器数据等可能造成直接影响的安全问题。黑客一般会直接构造数据进行攻击。

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 开发安全问题。

另附篇讲的比较好的文章

可参考 :

posted on
2016-09-26 17:00  阅读(
...) 评论(
...) 收藏

转载于:https://www.cnblogs.com/wuyifu/p/5909809.html

你可能感兴趣的文章
JMeter响应数据出现乱码的处理-三种解决方式
查看>>
获取设备实际宽度
查看>>
Notes on <High Performance MySQL> -- Ch3: Schema Optimization and Indexing
查看>>
Alpha冲刺(10/10)
查看>>
数组Array的API2
查看>>
为什么 Redis 重启后没有正确恢复之前的内存数据
查看>>
No qualifying bean of type available问题修复
查看>>
第四周助教心得体会
查看>>
spfile
查看>>
Team Foundation Service更新:改善了导航和项目状态速查功能
查看>>
WordPress资源站点推荐
查看>>
Python性能鸡汤
查看>>
android Manifest.xml选项
查看>>
Cookie/Session机制具体解释
查看>>
ATMEGA16 IOport相关汇总
查看>>
(C#)调用Webservice,提示远程服务器返回错误(500)内部服务器错误
查看>>
python-----python的文件操作
查看>>
JAVA基础-多线程
查看>>
面试题5:字符串替换空格
查看>>
[Codevs] 线段树练习5
查看>>