「译」Web安全快速入门

2023-11-14

Web安全快速入门

──几个Web开发人员必知的安全缩略语

原文:A quick introduction to web security

作者:Austin Tackaberry 发表时间:2018/8/15

译者:陈 昌茂 发表时间:2018/8/25

(转载请注明出处)

你有很多理由需要了解Web安全,比如:

  • 你是一位关心个人隐私数据正被泄露的用户
  • 你是一名Web开发人员,想要编写更加安全的Web应用
  • 你是一位正在应聘Web开发岗位,准备面试有关Web安全问题。
  • 诸如此类~

本文将通俗易懂的准确地解释一些常用的Web安全缩略语。

在此之前,我们要了解两种模式,分别代表着两个极端,但又同属一个观念层次。

安全的两个模式

一种模式是追求绝对安全,结果无论如何努力也达不到绝对安全,而弄得自己痛苦不堪。

另一种是在采取了一定的防护措施后,便满足地认为已达到绝对安全,于是放松警惕,最后遭受安全威胁的攻击,损失惨重。

你不能就说:

喔,因为实现了CSP,所以我是安全的。我可以在漏洞清单中划掉跨站脚本,因为它不会发生。

你会发现自己和其他人一样,也是按这种方式思考的。显而易见,程序员们很容易按这种方式思考:非黑即白,非0即1,非对即错。其实,安全远没有这么简单。

我们在Web开发工作中初期就遇到会这些问题,并尝试从StackOverflow社区中能找到解决方案。

跨源资源共享(CORS)

你是否见到类似下面的错误信息?

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
复制代码

你不是一个人在战斗,你Google查询,有人说用这个方法,所有问题马上解决。

太好了,不是吗?

CORS是来保护你而不是伤害你的

为了解释CORS是如何帮助你的,让我们先从cookie说起,特别是认证cookie。认证cookie是用来告诉后台程序你的登录状态,它们自动随任何请求发送给后台程序。

我们来假设:你已经登录了Facebook账户,且Facebook使用cookie认证。你点击链接bit.ly/r43nugi,它重定向到恶意网站 superevilwebsite.rocks。恶意网站 superevilwebsite.rocks中的一段脚本代码向facebook.com 后台程序发起请求,你的认证cookie自动随请求发送给facebook.com 后台程序。

在非CORS的世界,黑客可以在你毫不知情的情况下变更你的账户。只需要简单几步:1、黑客在你的时间线上发帖,帖子中包含bit.ly/r43nugi 恶意链接;2、你的朋友们点击了该恶意链接,恶意脚本程序又在他们的时间线上发帖,这个过程不断被重复,在广度优先模式下,直到黑客占领了全部的Facebook用户的时间线,世界充斥着恶意网站 superevilwebsite.rocks。 ?

然而在CORS的世界,Facebook将只允许来源自facebook.com的请求方可在后台程序中修改数据。换句话说,他们会限制跨源资源共享。你可能会问:

我们可以修改请求文件头,这样请求不就看起来是来自facebook.com吗?

你可以试试,但不会成功的,因为浏览器会忽略你的修改,它会使用真正的来源信息。

好了,那如果恶意网站修改后台程序的请求呢?

在这种情况下,你想绕过CORS,但你还是不会得逞,原因后台程序不能同时发送你的认证cookie。脚本必须在浏览器上执行才能获取到你存在浏览器上的cookie。

内容安全策略(CSP)

为了便于理解CSP,我们先谈一下最常见的Web漏洞:跨站脚本攻击(简称:XSS)

XSS即黑客在你的浏览器中注入JavaScript代码。你可能会想:

黑客会做什么,红变绿吗?

我们假如黑客在你的浏览器成功中注入JavaScript代码到你正在访问的网站代码中。

他们可能会做哪些邪恶的事情?

  • 他们能冒充你向其他网站发送HTTP请求。
  • (这句不会翻,囧)
  • 他们能加script标签,内嵌的一段JavaScript代码。
  • 他们能加script标签,引用远程的JavaScript代码。
  • 他们能内嵌一个网页覆盖正常网页之上,提示你输入密码。
  • 罄竹难书,发挥你的想象力吧。

CSP通过限制功能提供保护:

  • 什么能在框架内打开。
  • 什么样式表可以被加载。
  • 哪些请求可以发送,等等。

那它时怎么工作的呢?

等你点击链接或在浏览器地址栏输入网址的时候,浏览器发送GET请求。服务器返回HTTP头信息以及HTML内容。如果你对返回头信息是什么很好奇,(以谷歌Chrome浏览器为例,打开浏览器开发者模式。括弧内为译者补充,下同)切换到“网络”标签,访问网站facebook.com

你可能会看到如下返回头信息:

content-security-policy: default-src * data: blob:;script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' *.atlassolutions.com blob: data: 'self';style-src data: blob: 'unsafe-inline' *;connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* wss://*.facebook.com:* https://fb.scanandcleanlocal.com:* *.atlassolutions.com attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;
复制代码

这些是facebook.com的安全内容策略。让我们调整成可读性强的格式。

content-security-policy:
default-src * data: blob:;
script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' *.atlassolutions.com blob: data: 'self';
style-src data: blob: 'unsafe-inline' *;
connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* wss://*.facebook.com:* https://fb.scanandcleanlocal.com:* *.atlassolutions.com attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;
复制代码

现在,我们逐条分解这些指令。

  • **default-src** 限制所有其他没有显示列出的CSP指令。
  • **script-src** 限制脚本加载。
  • **style-src** 限制样式表加载。
  • **connect-src** 限制可以使用脚本接口(如获取、XHR、ajax等)的URL链接。

注意远不止这3条指令,还有更多的CSP指令。浏览器将读取CSP头信息并加载、渲染HTML文件时执行这些指令。如果恰当地设置指令,浏览器将仅允许必要的操作。

如果没有CSP头信息,那么所有的操作都不会被限制。你可以想象这些指令全部替换成通配符*,任何操作都将被允许。

HTTPS 或 HTTP安全

你肯定听说过HTTPS。人们可能会这么说:

为何我要关心一个我玩游戏的网站是否启用了HTTPS呢?

或者是这样滴。。。

太疯狂了,你的网站居然没有启用HTTPS。都2018年了,别信其他人(潜台词:必须启用HTTPS)。

或许你听说谷歌Chrome浏览器(自7月24日发布的Chrome 68起)将把所有HTTP网站标记“不安全“。

重点是,HTTPS是加密的而HTTP不是。

如果你不发送敏感信息,(是否加密)有那么重要吗?

准备下一个缩写MITM,它代表中间人攻击。

如果你在咖啡馆使用无密码的公共Wi-Fi,任何人都很容易地冒充成路由器,使全部的请求和返回都通过该路由器。如果你的数据没有加密,那么他们可以做任何事。比如在HTML, CSS, 或 JavaScript到达你的浏览器之前修改。假如你已经知道XSS,那么可以做什么样的坏事。

那么怎样才可以实现我的电脑和服务器之间通信加密而不被中间人攻击呢?

最初SSL协议就是为了解决这个问题而设计的,1999年,TLS协议取代SSL协议用在HTTPS上。至于TLS如何工作已经超出本文范围。

HSTS协议

让我们还用Facebook的头信息为例,以下是一条很简洁的指令。

strict-transport-security: max-age=15552000; preload
复制代码
  • max-age 标明HSTS在浏览器的生效时间。
  • preload 对本文不重要。

这个头信息仅在用HTTPS访问时生效,在用HTTP访问时会被忽略。原因很简单,HTTPS时如此不安全,很难被信任。

让我们用Facebook的例子来描述下。你首次访问facebook.com,而且知道HTTPS比HTTP安全,所以你使用https://facebook.com。当浏览器接收到HTML,收到头信息,告知浏览器在后续访问中强制重定向到HTTPS网站。一个月后,有人通过HTTP给你发送一个Facebook的链接,比如http://facebook.com,在max-age时间范围内,浏览器会强制使用HTTPS,防止潜在的中间人攻击。

结论

无论你在Web开发旅程中的何时何地Web安全都很重要。你越重视它,安全威胁离你越远。安全时对每个人都很重要的事情,而不仅是对于工作中。?

转载于:https://juejin.im/post/5b83d02e6fb9a019cb3cdd7f

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

「译」Web安全快速入门 的相关文章

随机推荐

  • Git&SourceTree学习

    Souretree操作 1 创建本地仓库 2 创建文件 3 修改文件 add commit 4 创建分支 branch 5 合并分支 merge rebase 6 回滚与重置提交 revert reset 7 推送 push 8 拉取 pu
  • vscode插件-draw.io绘图

    日常绘图经常借助一些绘图软件 如viso 但需要安装 注册等等 而简易的绘图 建议用draw io免费插件 vscode是免费编辑软件 可灵活安装各类插件 先介绍draw io的安装与启用方法 1 启用vscode 如图在vscode的扩展
  • 小轮子一枚-高仿express的Java服务器

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 之前做了个Java项目MockSocks 要做UI 用Swing写实在是又low又费劲 跟前端同事聊起node webkit 觉得很不错 但是我大部分业务都在Java上 于
  • 1052 卖个萌

    本文代码参考来源 柳神 萌萌哒表情符号通常由 手 眼 口 三个主要部分组成 简单起见 我们假设一个表情符号是按下列格式输出的 左手 左眼口右眼 右手 现给出可选用的符号集合 请你按用户的要求输出表情 输入格式 输入首先在前三行顺序对应给出手
  • Nacos的配置中心(简单案例搭建)

    动态更改配置参数 使用Nacos配置中心 一定先把Nacos给启动起来 不然会报错误 java lang IllegalStateException failed to req API nacos v1 ns service list af
  • Please move or remove them before you switch branches.

    用git pull来更新代码的时候 遇到了下面的问题 error Your local changes to the following files would be overwritten by merge xxx xxx xxx php
  • springboot微信公众号小程序在后端调用模板消息发送消息

    Autowired private ReportService reportService PostMapping saveReport public ApiResult addReport RequestBody Report repor
  • adb命令打开摄像头_Camera(一):查看Camera设备详细信息

    一 查看是否存在camera外设 设备节点 ls dev video 二 adb 查看camera 详细信息 2 1 adb shell dumpsys media camera 2 2 adb 查看camera 过滤信息 查看某一项参数
  • ROS下进行人脸识别并输出人脸坐标位置

    功能包下载链接 https download csdn net download qq 42145185 12265062 启动命令 roslaunch face tracker pkg start tracking launch 核心检测
  • solidity:智能合约结构介绍

    合约结构介绍 1 SPDX 版权声明 bytecode metadata 介绍 2 pragma solidity 版本限制 3 contract 关键字 4 import 导入声明 5 interface 接口 6 library 库合约
  • linux系统Web服务配置

    目录 一 什么是Web服务 二 Web服务的架构 三 Web服务的配置 1 安装Apache 2 配置Apache 3 安装MySQL 4 配置MySQL 5 安装PHP 6 配置PHP 四 Web服务的测试 五 Web服务的权限管理 六
  • 泛微oa 明细数据合计

    由于工作的原因接触到了泛微这个支持二次开发的系统 这个系统除了新建页面需要用到一次开发之外 主要采用react的语法来开发 大部分工作都只需要微量的代码支持 在一次开发当中需要统计某一些数据的计算 这也算是一个高并发的问题 因为用户总是不愿
  • 最全最好的Tracker地址目录

    我们在使用BT下载器 例如qBittorrent 下载东西 经常会遇到下载慢 甚至没有速度的情况 添加trackers可以帮助我们连接到更多的资源节点 解决下载没速度的问题 给下载加速 是必备操作 最全最好Trackers 地址目录 打开上
  • maven之 详细介绍

    Maven Build Resources 功能 主要用于打包资源文件 默认情况下maven只打包src main resource下的资源 通过 1 设置build resources 2 使用build helper maven plu
  • UUVsimulator仿真

    UUV Simulator Based on Gazebo 使用版本 Ubuntu20 04 ros Noetic gazebo 11 下载 https github com arturmiller uuv simulator tree n
  • Ubuntu14.04 安装opencv记录

    一 下载源码 安装软件版本为 opencv 3 2 0 zip 软件包 链接 https pan baidu com s 1d51XYqoUcWvbXjM2JW GDQ 提取码 c8vv 二 安装相关库与工具 1 安装相关库 sudo ap
  • MIPS 指令

    MIPS 指令 指令 功能 应用实例 LB 从存储器中读取一个字节的数据到寄存器中 LB R1 0 R2 LH 从存储器中读取半个字的数据到寄存器中 LH R1 0 R2 LW 从存储器中读取一个字的数据到寄存器中 LW R1 0 R2 L
  • 【计算机毕业设计】基于微信小程序的英语学习交流平台 英语学习交流小程序

    毕设帮助 源码交流 技术解答 见文末 一 前言 随着现代化信息技术的迅猛发展 不仅影响了人们的日常交流 也给语言学习者带来了一种新型的学习方式 在这种趋势下 应运而生了许多不同于传统意义上的学习方法 英语学习系统则是其中一种极具有代表的方式
  • 前端页面添加全局水印或指定页面添加水印

    前言 为了防止信息泄露或知识产权被侵犯 在web的世界里 对于图片文档等增加水印处理是十分有必要的 水印的添加根据环境可以分为两大类 前端浏览器环境添加和后端服务环境添加 今天介绍的就是通过canvas创建一张含有水印信息的背景图片 通过v
  • 「译」Web安全快速入门

    Web安全快速入门 几个Web开发人员必知的安全缩略语 原文 A quick introduction to web security 作者 Austin Tackaberry 发表时间 2018 8 15 译者 陈 昌茂 发表时间 201