• XSS漏洞原理、攻击与防御

    现代 Web 网页通常都是动态的,内容根据数据库来生成。举个例子,您在某个网站上发表一条评论,评论内容会保存在数据库中;当您或其他用户浏览评论时,后端需要查询数据库,最终生成可供浏览的网页。

    根据数据生成网页,就是网页渲染,通常可以分为两种:

    • 服务端渲染,即在后端渲染好 HTML 页面,再返回给浏览器;
    • 客户端渲染,即在前端通过 JS 脚本操作 DOM 节点,动态调整 HTML 网页;

    不管采用哪种渲染方式,本质上都是将数据拼接在 HTML 网页,再呈现给用户。数据通常是由用户输入的,比如评论。如果被别有用心的人利用,注入恶意代码进行攻击,该怎么办呢?想想 SQL注入 攻击!

    阅读全文
  • 深入理解统一资源定位符:URL

    URL统一资源定位符uniform resource locator )的缩写,顾名思义就是用来定位网络资源的。URL 有时也被称为 URIURI 则是 统一资源标识符uniform resource identifier )的缩写。

    有人说 URI 只用于标识区分资源,而 URL 还包含如何找到(定位)到资源的信息,是前者的子集。尽管如此,由于日常交流这两个术语经常混着用,我偏向认为两者是一样的。

    我们知道,Web 应用中的 HTML 网页、JavaScript 源码、 CSS 样式表以及图片等多媒体资源,都可以通过一个 URL 来访问。URL 唯一标识一个网络资源,并指明了获取它的方式。

    虽然 URL 成名于 Web 应用,也经常被称为 Web 地址,但它的使用场景远不止 Web 。我们前面看到的 URL 的结构也比较简单,但 URL 的语法其实支持更为复杂的结构。

    语法结构

    URL 的完整语法结构如下图所示,总共包含七个部分:

    阅读全文
  • 三次握手,TCP连接的建立

    TCP 是面向连接的传输协议,因此通信双方必须先建立连接,才能传输数据。

    上一小节,我们已经初步学习了 TCP 三次握手建立连接的主要步骤,但有不少细节还来不及展开。现在我们再接再厉,先通过一个实验来观察三次握手的过程,进而深入研究其中的细节。

    观察三次握手过程

    如下图,局域网中有一台服务器,IP 地址是 10.0.0.2 ,其他主机可以通过 SSH 协议来登录服务器:

    阅读全文
  • TCP/IP协议栈

    上一小节,我们学习了 OSI 参考模型,见识到 分层 设计思想在通信系统中的重要作用。那么,现行的通信协议是不是按照 OSI 模型进行分层呢?各层的重要协议都有哪些呢?

    目前使用最广泛的通信协议是 TCP/IP 系列协议,但它并不是严格按照 OSI 参考模型设计的。实际上,TCP/IP 早在 OSI 参考模型提出前就开始研发,并逐步发展至今。

    TCP/IP 协议栈也是分层设计的,但与 OSI 不同,它只分为 4 层:

    阅读全文
  • 网络实验:用dig命令模仿迭代解析

    上一小节,我们学习了 DNS 服务器的工作原理,它们可以分为很多种角色:

    • 根域名服务器
    • 顶级域名服务器
    • 权威域名服务器
    • 递归解析器(DNS缓存服务器)

    于此同时,我们还了解了域名 迭代解析 的过程。本节我们趁热打铁,安排一次实验——按迭代解析步骤来解析域名 test.fasionchan.com ,以此加深理解。

    阅读全文
  • 用C语言开发ping命令

    经过前面学习,我们知道 ping 命令内部通过 ICMP 协议探测目标 IP ,并计算 往返时间 。 本文使用 C 语言开发一个简版 ping 命令, 演示如何通过 套接字 发送和接收 ICMP 协议报文。

    其他语言版本:

    报文封装

    ICMP 报文同样分为头部和数据,其中头部的结构非常简单:

    阅读全文
  • ARP攻击

    前面我们学习了 ARP 协议,对它的工作原理和报文格式有了深入的了解。现在正是讨论 ARP攻击 的好时候,大家对 网络安全 这种高级话题应该更有兴趣吧!

    废话不多说,马上进入安全模式,带大家捋捋 ARP 攻击的来龙去脉:

    • ARP 攻击的原理是什么?
    • 如何发起 ARP 攻击?
    • 通过 ARP 攻击可以做什么?可以窃取信息吗?
    • 如何应对 ARP 攻击?

    ARP攻击原理

    由于 ARP 协议没有真伪校验机制,因此网络中的坏蛋可以发出一些假报文,来欺骗其他主机,以达到不可告人的目的。以下面这个网络为例:

    阅读全文
  • 用Python开发ping命令

    经过前面学习,我们知道 ping 命令内部通过 ICMP 协议探测目标 IP ,并计算 往返时间 。 本文使用 Python 开发一个简版 ping 命令, 演示如何通过 套接字 发送和接收 ICMP 协议报文。

    其他语言版本:

    报文封装

    ICMP 报文同样分为头部和数据,其中头部的结构非常简单:

    阅读全文
  • 数字证书身份认证原理与签发步骤详解

    上一小节,我们学习了非对称加密,掌握了密钥协商,数据签名等典型应用场景。现在,我们继续讨论身份认证话题,学习 数字证书( certificate )的工作原理。 概念回顾 信息摘要( digest ),数据经过哈希算法得到的一串哈希值,代表数据的特征,也称为数据指纹; 摘要算法 ,可以把任意长度的数据,映射成一个定长的字符串(哈希值); 由于哈希冲突的存在,两份不同的数据,有可能算出相同的摘要值; 摘要算法无法用于数据加密,通常用来校验数据完整性,即 数据防伪 ; 常见的摘要算法有:MD5 、SHA1 、SHA256 、SHA512 。 数字签名( signature ),摘要由私钥加密后,得到的摘要密文就是数字签名; 签名,由数据发送方生成,这是一个 加密 过程(使用私钥); 验签,由数据接收方校验,这是一个 解密 过程(使用公钥); 数字签名只能由私钥生成,因此第三方无法伪造; 数字证书 在介绍密钥协商时,我们提到服务器先将公钥发给客户端,用公钥保护对称加密密钥,确保通信内容不会被第三方获悉。但如果客户端连接的服务器是假的呢?如果用户对假网站信以为真,输入了账号密码,那么这些敏感信息都会被假网站窃取! 这种假网站被叫做 钓鱼网站( phishing site ),它们高仿原网站,以假乱真。用户仅凭外观通常难以区分,因此信以为真。在钓鱼网站上输入的账号密码,最终都会被架设网站的黑客收集到。 那么,客户端应该如何判断服务器真伪呢?如何识别钓鱼站点呢? 上节我们也讨论了数字签名,通过它可以实现数据防伪。那么,我们是不是可以利用这项技术来甄别仿冒站点呢?显然,若有权威机构(如政府)担起站点信息签名的责任,即可轻松识别仿冒站点! 权威机构生成一对密钥,并提供站点认证审核和数字签名颁发服务; 站点管理员将站点信息,包括域名、运营单位、公钥等信息发给权威机构审核; 权威机构对提交上来的站点信息进行审核,审核通过则用私钥签名后返回给站点管理员; 客户端(浏览器)连接站点服务器,服务器将站点信息以及对应的数字签名发给客户端; 客户端用权威机构提供的公钥来校验数字签名,即可判断站点信息的真伪性; 签名验证通过,客户端从站点信息中取出公钥,与服务端协商密钥,发起加密通信; 由于签名用的私钥只有权威机构掌握,黑客无法伪造数字签名,也就无法架设仿冒站点; 权威机构必须由可信的单位运营; 你可能会觉得,黑客直接盗用站点信息和签名不就可以伪造原站点了嘛?此言差矣!因为公钥属于站点信息的一部分,也会参与签名!客户端和服务端协商密钥时,会使用这个公钥加密密钥。由于黑客不掌握站点私钥,因此加密连接无法建立!黑客把公钥替换成自己的吧,签名就不对,肯定会被验出来! 由域名、运营单位以及公钥等组成的站点信息,加上权威机构生成的数字签名,就构成了本节的主角—— 数字证书( certificate )。HTTPS 协议正是利用数字证书技术,来实现站点身份验证的。 您可能会说,如果权威机构的公钥被人调包,那数字证书也就不起保护作用了。确实如此!不过,权威机构的公钥通常以根证书的形式预装在操作系统里面,黑客很难对它做手脚。这也从层面说明使用正版系统的重要性,因为盗版系统很有可能会被人做手脚。 证书签发实验 CA权威机构 首先,权威机构需要生成一对密钥,对应图中红色那对( pem 文件 ):
    阅读全文
  • HTTP代理服务器是怎么工作的?

    早年间,上网速比较慢,特别是跨运营商的访问更是如此。笔者上大学时用的是教育网,访问教育网外的服务就慢如蜗牛,甚至都连不上。这时,各种各样的代理服务器就应运而生了。

    如上图,客户机想连接右边的目标服务器,但直连网速很差,可能是跨运营商了。如果它跟代理服务器,而且代理服务器跟目标服务器的网速较快,那它就可以利用代理服务器来加速。

    使用代理时,客户机需要先将请求发给代理服务器,由它帮忙请求目标服务器。按采用的协议不同,代理服务器可以分为好几种,例如 SOCKS ,当然也有 HTTP

    本节就趁着讲 HTTP 协议的机会,跟大家唠一唠 HTTP 代理服务器的运行原理。

    阅读全文