Web安全学习笔记第一章

Web安全时代

1.0时代:针对服务器进行攻击,主要包括SQL注入,上传漏洞,命令链接等攻击方式

2.0时代:针对服务器以及用户,新增XSS、CSRF等攻击方式

Web工作流程

Web工作方式类似餐厅点餐,点餐-上菜。这是用户能看到的部分。而服务员接到点餐后,会把菜单拿给厨师,然后厨师做好菜后会给服务员说,然后服务员就拿到做好的菜品就上菜给客人。

而Web工作流程与上面相似,用户通过浏览器输入网址,比如baidu.com,浏览器会通过DNS服务器找到baidu.com对应的服务器IP地址,服务器接到请求后与数据库交互,然后得到结果,并返回给用户。

浏览器并不能直接通过我们输入的网址直接与服务器通讯。当我们输入需要访问的网址后,浏览器会把我们的网址通过DNS服务器查询,得到服务器的IP地址,然后服务器直接与这个IP地址进行通讯的。

URL协议

浏览器与服务器通讯也需要一种方法,这个方法就是URL协议,它的中文翻译是“统一资源定位符”,它的作用是以简洁的方式从互联网上得到资源,并且让每个文件都有一个唯一的URL地址。

URL格式大致为:

协议://用户名:密码@域名:端口号/目录/文件名.文件后缀?参数=值#锚点
  1. 协议:URL支持许多协议,我们常见的协议有HTTP、FTP、MAILTO、HTTPS协议,而协议的作用就是告诉浏览器将如何处理要打开的文件。
  2. 用户名和密码:如果服务器需要授权才能访问就在这里输入
  3. 域名:这里填写你需要访问的网站域名,比如www.baidu.com或者image.baidu.com
  4. 端口号:如果是http协议,默认的80端口是不需要填写的,其他的协议根据相应的协议端口进行填写
  5. 目录以及文件名、后缀:这里是访问服务器中的文件路径。
  6. 参数:这里是需要传递给服务器的一些值,服务器会根据这些传递的值作出响应。
  7. 锚点:锚点的作用是定位当前文件中的哪一个位置。

HTTP协议

HTTP协议就是web中最重要的协议,也是使用应用最广泛的协议,每次我们我们访问网页都进行了http请求。

一个完整的http请求包含三部分:

  1. 请求行

    包含请求的方法以及URL、协议版本,比如:GET /test/xx.php?id=123444 HTTP/1.1

  2. 请求头

    常见内容包含:

    HOST:主机地址(域名)比如:www.xsscript.com。

    User-Agent:让服务器能够识别用户的包含操作系统及版本、CPU、浏览器、语言等信息。

    Cookie:代表用户凭证,服务器可以根据这个用户凭证来识别你是谁。

    Referer:服务器可以通过Referer来判断用户的来源,也就是你从什么地方过来的。

  3. 请求正文

    GET请求没有请求正文,所有的参数均含在请求行和头中,POST有请求正文

一个完整的http响应包含三部分:

  1. 状态行

    包含协议和版本、以及服务器状态的响应编码。比如HTTP/1.1 200 OK表示服务器响应成功

  2. 响应头

    常见内容包含:

    Server:HTTP服务器的版本

    Content-Type:响应正文类型,让浏览器根据类型进行处理然后显示给用户

    Set-Cookie:如果用户没有Cookie或者Cookie需要更新,服务器会在响应包中含此内容,提示浏览器设置或更新Cookie。

    Content-Language:响应正文的语言

    Content-Length:响应正文的长度。

    Location:当用户访问www.baidu.com然后响应包中包含了此内容的时候,会跳转到相应的网址。

  3. 响应正文

    发送给用户浏览器处理的正文内容。

参考

Web安全工程师

MDN web docs

MariaDB swap空间没有配置导致的出错问题

之前自己写的一篇关于搭建lamp的文章,在运行过程中会出现一些莫名其妙的错误导致mariadb错误,然后必须手动重启mariadb才能正常启动服务。

于是在mariadb的日志文件中查看到错误信息,/var/log/mariadb/mariadb

171002 10:56:34 [ERROR] Plugin 'InnoDB' init function returned error.
171002 10:56:34 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
171002 10:56:34 [ERROR] mysqld: Out of memory (Needed 128917504 bytes)
171002 10:56:34 [Note] Plugin 'FEEDBACK' is disabled.
171002 10:56:34 [ERROR] Unknown/unsupported storage engine: InnoDB
171002 10:56:34 [ERROR] Aborting

其中有一句Out of memory (Needed 128917504 bytes),看来是内存不足导致的错误,因为我的服务器是阿里云的低配服务器,所以当其他服务占用了很多内存之后,导致mariadb没有足够的内存提供服务。

因为自己的内存是512M,于是想到采用swap空间。查看swap的大小是free -m返回的信息是:

              total        used        free      shared  buff/cache   available
Mem:            992         315         331           0         344         525
Swap:             0           0           0

看来swap也没有建立,那么就手动建立一个swap文件,由于官方给的swap大小建议的是实际内存的2倍,所以我在这里就建立了一个1GB的swap交换文件。

dd if=/dev/zero of=/swapfile bs=1024 count=1048576

配置swap

mkswap /swapfile

启动swap

swapon /swapfile

最后你可以通过free -m命令来查看是否成功建立swap交换分区。

文完

家庭NAS搭建

前言

最近因为装了家庭影院买了盒子,再加上之前自己也想购买一个NAS,选过来选过去挑选了群晖NAS,但是无奈价格太贵,除了统一性、稳定性和群晖自身开发的系统之外没有任何的性价比可言,四硬盘位的NAS卖的更是离谱。

家里有一台淘汰掉的主机,然后再加上自己有几块闲置的硬盘,便想出了自己搭建NAS服务器,因为每个IT男家中总会有那么一台或几台淘汰下来的机器和硬盘,即使你要组装一台新的机器,性价比也非常高。

再加上自行组建NAS可玩性、灵活度较高,所以就敲定了这个方案。

在3年前自己玩弄树莓派写了一篇文章,如今照着做了一遍感觉很多命令变化挺大的,所以也是重写一篇关于nas搭建的文章的动力。

在配置的时候本来我想搭建一个下载服务器,找到mldonkey搭建,但是无奈配置了半天也没有搞定所以也就放弃了。最后我的解决方案是通过其他电脑下载然后拷贝到nas中。

环境

系统我采用了Ubuntu 16.04 Server,因为在稳定性和节省系统资源比desktop版更胜一筹。如果你是想通过无线网络搭建NAS,那么第一次你需要使用网线连接安装Wi-Fi相关的包,如果没有网线或者你只需要无线网络,那么你可以使用desktop版本,因为desktop版自带了无线网卡的驱动。

方案

  1. 搭建samba服务器,用于储存一些非私人资料,比如软件安装包、ISO镜像文件等,把samba共享给电视盒子,可以直接观看硬盘里面的电影。
  2. 搭建Time Machine,因为本人常用的是MacBook笔记本,所以搭建Time Machine就显得非常必要了
  3. 搭建seafile私有云服务,并提供给外网端口,用于外部访问。

为什么要搭建seafile,虽然Time Machine可以备份我的资料,但是无法让我在外面没有带电脑的时候取得资料,并且搭建seafile也算是一个双备份,因为上面的三个服务都是单独的一块硬盘,即使Time Machine或者seafile其中一个硬盘损坏,也不会造成数据丢失。

继续阅读

LAMP环境搭建

环境

系统版本:Centos 7.3 64位

服务器:阿里云香港

当前用户:root

目标:搭建wordpress执行环境

准备工作

如果你是在一个新的环境中搭建lamp环境,那么我建议你先更新升级系统,这样能保证系统为最新版本以及系统的安全性。

> yum -y update
> yum -y upgrade

安装Apache

首先安装Apache

> yum -y install httpd

启动Apache

> systemctl start httpd

设置Apache为开机启动

> systemctl enable httpd

此时Apache搭建完成,系统的/var/www/html就是网站的根目录。访问服务器的外网ip或者域名就可以看见Apache已经搭建成功。

继续阅读

Mongodb 身份验证

介绍

不管数据库是在多安全的环境或者本地环境,给数据库建立一个安全的环境是很有必要的。

Mongodb提供了一系列的安全功能,这里介绍一种很常用的身份验证方式。

开启验证

默认情况下,只要在启动数据库的时候没有加上--auth选项,就是没有身份验证功能的,所有客户端都可以进行所有权限的操作。

如果加上过后,我们就可以通过安全的身份验证连接数据库。如果要在数据库中进行身份验证,可以通过db.auth(username, password),如果验证成功则返回1,反之。

建立用户

建立用户我们可以通过db.createUser()方法来建立用户,比如下面这样:

db.createUser({user: 'username', pwd: 'password', roles: [
    {role: 'read', db: 'test'}
]});

继续阅读