Victor's Code Journey
Victor's Code Journey

web安全之XSS漏洞

Cross-Site Scripting(跨站脚本攻击)简称 XSS,是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全。为了和 CSS 区分,这里把攻击的第一个字母改成了 X,于是叫做 XSS。XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。

而由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,或者利用这些信息冒充用户向网站发起攻击者定义的请求。在部分情况下,由于输入的限制,注入的恶意脚本比较短。但可以通过引入外部的脚本,并由浏览器执行,来完成比较复杂的攻击策略。

Ubuntu切换GCC版本

首先在ubuntu上安装多版本的GCC:

$ sudo apt install build-essential
$ sudo apt -y install gcc-7 g++-7 gcc-8 g++-8 gcc-9 g++-9

然后使用update-alternatives注册不同版本的GCC:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 7
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 8
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 9
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 9

选择想使用的GCC:

$ sudo update-alternatives --config gcc
There are 3 choices for the alternative gcc (providing /usr/bin/gcc).

  Selection    Path            Priority   Status
------------------------------------------------------------
  0            /usr/bin/gcc-9   9         auto mode
  1            /usr/bin/gcc-7   7         manual mode
* 2            /usr/bin/gcc-8   8         manual mode
  3            /usr/bin/gcc-9   9         manual mode
Press  to keep the current choice[*], or type selection number: 

Kerberos协议

什么是Kerberos?

Kerberos是一种网络身份验证协议,提供了网络上的身份验证和强大的加密工具,旨在通过使用密钥加密为客户端/服务器应用程序提供强身份验证。

互联网是一个不安全的地方。Internet中使用的许多协​​议都不提供任何安全性。一些站点尝试使用防火墙来解决其网络安全问题。不幸的是,防火墙假设“坏人”在外面,这通常是一个非常糟糕的假设。大多数真正破坏性的计算机犯罪事件都是由内部人员实施的。防火墙还有一个很大的缺点,那就是它限制了用户使用Internet的方式。(毕竟,防火墙一个极端的例子,就是没有比没有连接到网络并关闭电源的计算机更安全的说法了。)

Kerberos是由MIT创建的,用于解决这些网络安全问题。Kerberos协议使用强大的加密技术,以便客户端可以通过不安全的网络连接向服务器证明其身份(反之亦然)。客户端和服务器使用Kerberos证明其身份后,他们还可以加密所有通信,以确保在开展业务时的私密性和数据完整性。

缓存的一些思考

缓存常被用于处理高并发,高性能问题,在现今的系统中被广泛使用。缓存模式,简单来说就是利用时间局限性原理,通过空间换时间来达到加速数据获取的目的。

缓存的读写性能很高,预热快,在数据访问存在性能瓶颈或遇到突发流量,系统读写压力大增时,可以快速部署上线,同时在流量稳定后,也可以随时下线,从而使系统的可扩展性大大增强。

但是,在系统中引入缓存后,会增加系统的复杂度。

分布式锁简介

在分布式场景中分布式锁是一种很常见的需求。实现一个分布式锁要注意以下几点:

  • 安全: 独享(相互排斥)。在任意一个时刻,只有一个客户端持有锁。
  • 锁失效保护: 无死锁。即便持有锁的客户端崩溃(crashed)或者网络被分裂(gets partitioned),锁仍然可以被获取。
  • 集群容错。 只要大部分节点都活着,客户端就可以获取和释放锁。
  • 原子性:获取释放锁最好是原子操作,获取释放锁的性能要好。
  • 可重入(optional): 同一个线程在没有释放锁之前,如果想再次操作,可以直接获得锁。
  • 阻塞/非阻塞(optional):若没有获取到锁,返回获取失败。