20189216 《网络攻防技术》第十周做业

1、冯·诺依曼体系结构和图灵机的理解及其二者之间的区别和联系

一、冯·诺依曼体系结构

  • 定义:美籍匈牙利数学家冯·诺依曼于1946年提出存储程序原理,把程序自己看成数据来对待,程序和该程序处理的数据用一样的方式储存。 冯·诺依曼体系结构冯·诺依曼理论的要点是:计算机的数制采用二进制;计算机应该按照程序顺序执行。人们把冯·诺依曼的这个理论称为冯·诺依曼体系结构。
  • 简介:从EDVAC到当前最早进的计算机都采用的是冯·诺依曼体系结构。因此冯·诺依曼是当之无愧的数字计算机之父。
  • 发展背景:
    电子计算机的问世,奠定人是英国科学家艾兰· 图灵(Alan Turing)和美籍匈牙利科学家冯· 诺依曼(John Von· Neumann)。图灵的贡献是创建了图灵机的理论模型,奠基了人工智能的基础。而冯· 诺依曼则是首先提出了计算机体系结构的设想。
    1946年美籍匈牙利科学家冯·诺依曼提出存储程序原理,把程序自己看成数据来对待,程序和该程序处理的数据用一样的方式存储,并肯定了存储程序计算机的五大组成部分和基本工做方法。
    半个多世纪以来,计算机制造技术发生了巨大变化,但冯· 诺依曼体系结构仍然沿用至今,人们老是把冯· 诺依曼称为“计算机鼻祖”。
  • 体系结构:
    (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存储器中,数据和程序在内存中是没有区别的,它们都是内存中的数据,当EIP指针指向哪 CPU就加载那段内存中的数据,若是是不正确的指令格式,CPU就会发生错误中断. 在如今CPU的保护模式中,每一个内存段都有其描述符,这个描述符记录着这个内存段的访问权限(可读,可写,可执行).这就变相的指定了哪些内存中存储的是指令哪些是数据)
    指令和数据均可以送到运算器进行运算,即由指令组成的程序是能够修改的。
    (2)存储器是按地址访问的线性编址的一维结构,每一个单元的位数是固定的。
    (3)指令由操做码和地址组成。操做码指明本指令的操做类型,地址码指明操做数和地址。操做数自己无数据类型的标志,它的数据类型由操做码肯定。
    (4)经过执行指令直接发出控制信号控制计算机的操做。指令在存储器中按其执行顺序存放,由指令计数器指明要执行的指令所在的单元地址。指令计数器只有一个,通常按顺序递增,但执行顺序可按运算结果或当时的外界条件而改变。
    (5)以运算器为中心,I/O设备与存储器间的数据传送都要通过运算器。
    (6)数据以二进制表示。
  • 特色:
    (1)计算机处理的数据和指令一概用二进制数表示
    (2)顺序执行程序
    计算机运行过程当中,把要执行的程序和处理的数据首先存入主存储器(内存),计算机执行程序时,将自动地并按顺序从主存储器中取出指令一条一条地执行,这一律念称做顺序执行程序。
    (3)计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。
  • 做用:
    冯.诺依曼体系结构是现代计算机的基础,如今大多计算机还是冯.诺依曼计算机的组织结构,只是做了一些改进而已,并无从根本上突破冯体系结构的束缚。冯.诺依曼也所以被人们称为“计算机之父”。然而因为传统冯.诺依曼计算机体系结构自然所具备的局限性,从根本上限制了计算机的发展。
    根据冯·诺依曼体系结构构成的计算机,必须具备以下功能:把须要的程序和数据送至计算机中。必须具备长期记忆程序、数据、中间结果及最终运算结果的能力。可以完成各类算术、逻辑运算和数据传送等数据加工处理的能力。可以根据须要控制程序走向,并能根据指令控制机器的各部件协调操做。可以按照要求将处理结果输出给用户。
    将指令和数据同时存放在存储器中,是冯·诺依曼计算机方案的特色之一 计算机由控制器、运算器、存储器、输入设备、输出设备五部分组成 冯·诺依曼提出的计算机体系结构,奠基了现代计算机的结构理念。
  • 冯·诺依曼体系工做原理
    程序的执行过程其实是不断地取出指令、分析指令、执行指令的过程。冯·诺依曼型计算机从本质上讲是采用串行顺序处理的工做机制,即便有关数据已经准备好了,也必须逐条执行指令序列,以下图所示:

    具体过程:
    (1)预先把指挥计算机如何进行操做的指令序列(就是程序)和原始数据输入到计算机内存中(拷贝),每条指令中明确规定了计算机从哪一个地址取数,进行什么操做,而后送到什么地方去等步骤。
    (2)计算机在执行时,先从内存中取出第一条指令,经过控制器的译码器接收指令的要求,再从存储器中取出数据进行指定的运算和逻辑操做等,而后再按地址把结果送到内存中,若是须要向硬盘等存储设备存储数据,还须要将内存中的该数据存储到硬盘中。接下来取出第2条指令,在控制器的指挥下完成规定操做,依次进行下去,直到遇到中止指令。
    (3)计算机中基本上有两股信息在流动,一种是数据,即各类原始数据、中间结果和程序等,另外一种信息是控制信息,它控制机器的各类部件执行指令规定的各类操做。

二、图灵机

  • 定义:图灵机就是指一个抽象的机器,它有一条无限长的纸带,纸带分红了一个一个的小方格,每一个方格有不一样的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。在每一个时刻,机器头都要从当前纸带上读入一个方格信息,而后结合本身的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换本身的内部状态,而后进行移动。
  • 基本思想:
    图灵的基本思想是用机器来模拟人们用纸笔进行数学运算的过程,他把这样的过程看做下列两种简单的动做:
    (1)在纸上写上或擦除某个符号;
    (2)把注意力从纸的一个位置移动到另外一个位置;
    而在每一个阶段,人要决定下一步的动做,依赖于 (a) 此人当前所关注的纸上某个位置的符号和(b) 此人当前思惟的状态。
    为了模拟人的这种运算过程,图灵构造出一台假想的机器,该机器由如下几个部分组成:
    1.一条无限长的纸带 TAPE。纸带被划分为一个接一个的小格子,每一个格子上包含一个来自有限字母表的符号,字母表中有一个特殊的符号 表示空白。纸带上的格子从左到右依此被编号为 0,1,2,... ,纸带的右端能够无限伸展。
    2.一个读写头 HEAD。该读写头能够在纸带上左右移动,它能读出当前所指的格子上的符号,并能改变当前格子上的符号。
    3.一套控制规则 TABLE。它根据当前机器所处的状态以及当前读写头所指的格子上的符号来肯定读写头下一步的动做,并改变状态寄存器的值,令机器进入一个新的状态。
    4.一个状态寄存器。它用来保存图灵机当前所处的状态。图灵机的全部可能状态的数目是有限的,而且有一个特殊的状态,称为停机状态。参见停机问题。
    注意这个机器的每一部分都是有限的,但它有一个潜在的无限长的纸带,所以这种机器只是一个理想的设备。图灵认为这样的一台机器就能模拟人类所能进行的任何计算过程。

    在某些模型中,读写头沿着固定的纸带移动。要进行的指令(q1)展现在读写头内。在这种模型中“空白”的纸带是所有为 0 的。有阴影的方格,包括读写头扫描到的空白,标记了 1,1,B 的那些方格,和读写头符号,构成了系统状态。(由 Minsky (1967) p.121 绘制)。
  • 查阅相关资料博客
    一、带你深刻理解图灵机
    二、带你深刻理解图灵机——天才所在的时代
    三、图灵机简介和原理分析

三、二者之间的区别和联系

2、对“程序=指令+数据”的理解

  • 程序:计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,知足人们某种需求的信息化工具。
    它以某些程序设计语言编写,运行于某种目标结构体系上。打个比方,程序就如同以英语(程序设计语言)写做的文章,要让一个懂得英语的人(编译器)同时也会阅读这篇文章的人(结构体系)来阅读、理解、标记这篇文章。通常的,以英语文本为基础的计算机程序要通过编译、连接而成为人难以解读,但可轻易被计算机所解读的数字格式,而后放入运行。程序是一个指令序列。
  • 程序的运行:
    为了使计算机程序得以运行,计算机须要加载代码,同时也要加载数据。从计算机的底层来讲,这是由高级语言(例如Java,C/C++,C#等)代码转译成机器语言而被CPU所理解,进行加载。
    若是您在一个符合大多数的计算机上,操做系统例如Windows、Linux等,加载并执行不少的程序,在这种状况下,每个程序是一个单独的映射,并非计算机上的全部可执行程序。
    它是指为了获得某种结果而能够由计算机等具备信息处理能力的装置执行的代码化指令序列,或者能够被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。同一计算机程序的源程序和目标程序为同一做品。
  • 普林斯顿结构:
    普林斯顿结构又作冯·诺伊曼结构,在一台基于最多见的普林斯顿结构的计算机上,程序一般是经过外存来加载到计算机以内。若是基于这种结构的计算机之上没有程序做为支撑,一般没法工做。全部程序都基于机器语言运行,机器语言是一个以二进制数字(0和1)构成的语言。
    通常的,程序是由高级语言编写,而后在编译的过程当中,被编译器/解释器转译为机器语言,从而得以执行。
    javascript

  • 指令:计算机从事某一特殊运算的代码。如:数据传送指令、算术运算指令、位运算指令、程序流程控制指令、串操做指令、处理器控制指令。
    计算机程序发给计算机处理器的命令就是“指令(instruction)”。最低级的指令是一串0和1,表示一项实体做业操做要运行(如“Add”)。根据指令类型,某个具体的存储领域被称做“寄存器(register)”,里面包含了可用于调出指令的数据或数据存储位置。计算机的汇编语言(assembler)中,每种语言通常只响应单一的处理器指令。而高级语言的每种语言通过程序编辑后能响应多个处理器指令。在汇编语言中,宏指令(macro instruction)在汇编程序处理过程当中会扩展为多个指令(以编码过的源宏定义为基础)。
  • 组成形式:
    指令是指示计算机执行某种操做的命令。它由一串二进制数码组成。
    一条指令一般由两个部分组成:操做码+地址码。
    操做码:指明该指令要完成的操做的类型或性质,如取数、作加法或输出数据等。
    地址码:指明操做对象的内容或所在的存储单元地址。html

  • 数据:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。一般状况下,精心选择的数据结构能够带来更高的运行或者存储效率。数据结构每每同高效的检索算法和索引技术有关。
  • 数据结构的重要意义:
    通常认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。一个逻辑数据结构能够有多种存储结构,且各类存储结构影响数据处理的效率。
    在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验代表,系统实现的困难程度和系统构造的质量都严重的依赖因而否选择了最优的数据结构。许多时候,肯定了数据结构后,算法就容易获得了。有些时候事情也会反过来,咱们根据特定算法来选择数据结构与之适应。不论哪一种状况,选择合适的数据结构都是很是重要的。
    选择了数据结构,算法也随之肯定,是数据而不是算法是系统构造的关键因素。这种洞见致使了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。
  • 结构算法:
    算法的设计取决于数据(逻辑)结构,而算法的实现依赖于采用的存储结构。数据的存储结构实质上是它的逻辑结构在计算机存储器中的实现,为了全面的反映一个数据的逻辑结构,它在存储器中的映象包括两方面内容,即数据元素之间的信息和数据元素之间的关系。不一样数据结构有其相应的若干运算。数据的运算是在数据的逻辑结构上定义的操做算法,如检索、插入、删除、更新和排序等。
    数据的运算是数据结构的一个重要方面,讨论任一种数据结构时都离不开对该结构上的数据运算及其实现算法的讨论。
    数据结构不一样于数据类型,也不一样于数据对象,它不只要描述数据类型的数据对象,并且要描述数据对象各元素之间的相互关系。
    数据类型是一个值的集合和定义在这个值集上的一组操做的总称。数据类型可分为两类:原子类型、结构类型。一方面,在程序设计语言中,每个数据都属于某种数据类型。类型明显或隐含地规定了数据的取值范围、存储方式以及容许进行的运算。能够认为,数据类型是在程序设计中已经实现了的数据结构。另外一方面,在程序设计过程当中,当须要引入某种新的数据结构时,老是借助编程语言所提供的数据类型来描述数据的存储结构。前端

3、研究如下安全问题(要有实践),结合上面内容谈谈他们有什么共同点,如何抽象出统一的防范方法?(缓冲区溢出 XSS攻击 SQL注入攻击)

一、缓冲区溢出漏洞实验

  • 实验简介:
    缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的状况。这一漏洞能够被恶意用户利用来改变程序的流控制,甚至执行代码的任意片断。这一漏洞的出现是因为数据缓冲器和返回地址的暂时关闭,溢出会引发返回地址被重写。java

  • 实验准备:
    实验楼提供的是64位Ubuntu linux,而本次实验为了方便观察汇编语句,咱们须要在32位环境下做操做,所以实验以前须要作一些准备。linux

(1)输入命令安装一些用于编译32位C程序的东西:web

  • sudo apt-get update
  • sudo apt-get install lib32z1 libc6-dev-i386(第一次安装时没有截图成功)
  • sudo apt-get install lib32readline-gplv2-dev

(2)输入命令“linux32”进入32位linux环境。此时你会发现,命令行用起来没那么爽了,好比不能tab补全了,因此输入“/bin/bash”使用bash:
算法

  • 实验步骤:

(1)初始设置:
Ubuntu和其余一些Linux系统中,使用地址空间随机化来随机堆(heap)和栈(stack)的初始地址,这使得猜想准确的内存地址变得十分困难,而猜想内存地址是缓冲区溢出攻击的关键。所以本次实验中,咱们使用如下命令关闭这一功能:sudo sysctl -w kernel.randomize_va_space=0

此外,为了进一步防范缓冲区溢出攻击及其它利用shell程序的攻击,许多shell程序在被调用时自动放弃它们的特权。所以,即便你能欺骗一个Set-UID程序调用一个shell,也不能在这个shell中保持root权限,这个防御措施在/bin/bash中实现。
linux系统中,/bin/sh实际是指向/bin/bash或/bin/dash的一个符号连接。为了重现这一防御措施被实现以前的情形,咱们使用另外一个shell程序(zsh)代替/bin/bash。下面的指令描述了如何设置zsh程序:
sudo su
cd /bin
rm sh
ln -s zsh sh
exit
sql

(2)shellcode
通常状况下,缓冲区溢出会形成程序崩溃,在程序中,溢出的数据覆盖了返回地址。而若是覆盖返回地址的数据是另外一个地址,那么程序就会跳转到该地址,若是该地址存放的是一段精心设计的代码用于实现其余功能,这段代码就是shellcode。
观察如下代码:

本次实验的shellcode,就是刚才代码的汇编版本:
\x31\xc0\x50\x68"//sh"\x68"/bin"\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80shell

(3)漏洞程序
把如下代码保存为“stack.c”文件,保存到 /tmp 目录下。代码以下:

经过代码能够知道,程序会读取一个名为“badfile”的文件,并将文件内容装入“buffer”。
编译该程序,并设置SET-UID。命令以下:
sudo su
gcc -m32 -g -z execstack -fno-stack-protector -o stack stack.c
chmod u+s stack
exit

GCC编译器有一种栈保护机制来阻止缓冲区溢出,因此咱们在编译代码时须要用 –fno-stack-protector 关闭这种机制。
而 -z execstack 用于容许执行栈。数据库

(4) 攻击程序
咱们的目的是攻击刚才的漏洞程序,并经过攻击得到root权限。
把如下代码保存为“exploit.c”文件,保存到 /tmp 目录下。代码以下:

注意上面的代码,“\x??\x??\x??\x??”处须要添上shellcode保存在内存中的地址,由于发生溢出后这个位置恰好能够覆盖返回地址。
而 strcpy(buffer+100,shellcode); 这一句又告诉咱们,shellcode保存在 buffer+100 的位置。
如今咱们要获得shellcode在内存中的地址,输入命令:
gdb stack
disass main
截图结果:

接下来的操做:

根据语句 strcpy(buffer+100,shellcode); 咱们计算shellcode的地址为 0xffffd2a0(十六进制)+100(十进制)=0xffffd304(十六进制)
如今修改exploit.c文件!将 \x??\x??\x??\x?? 修改成 \x04\xd3\xff\xff
而后,编译exploit.c程序:gcc -m32 -o exploit exploit.c

(5)攻击结果

二、SQL注入攻击

(1)SQL语言
结构化查询语言(Structured Query Language)简称SQL:是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

(2) SQL注入
SQL注入能使攻击者绕过认证机制,彻底控制远程服务器上的数据库。SQL是结构化查询语言的简称,它是访问数据库的事实标准。目前,大多数Web应用都使用SQL数据库来存放应用程序的数据。几乎全部的Web应用在后台都使用某种SQL数据库。跟大多数语言同样,SQL语法容许数据库命令和用户数据混杂在一块儿的。若是开发人员不细心的话,用户数据就有可能被解释成命令,这样的话,远程用户就不只能向Web应用输入数据,并且还能够在数据库上执行任意命令了。
SQL注入技术是利用web应用程序和数据库服务器之间的接口来篡改网站内容的攻击技术。经过把SQL命令插入到Web表单提交框、输入域名框或页面请求框中,最终欺骗服务器执行恶意的SQL命令。

(3)SQL注入危害

  • 非法读取、篡改、添加、删除数据库中的数据。
  • 盗取用户的各种敏感信息,获取利益。
  • 经过修改数据库来修改网页上的内容。
  • 私自添加或删除帐号。
  • 注入木马等等。

(4) SQL注入攻击的过程及原理
SQL注入攻击是指攻击者经过在应用程序后台数据库的操做中插入一些恶意SQL语句来达到操做数据库数据的目的。具体来说就是,SQL注入攻击是攻击者利用Web应用程序,经过输入非法字符,来构造恶意的SQL语句,最终将恶意的SQL语句注入到应用的后台数据库服务器中。数据库服务器执行这些恶意SQL语句后,不会按照数据库数据表设计者的意图去执行某些操做,而是进行一些非法的操做,进而形成数据库数据的丢失,损坏等后果。这种注入攻击方式困扰着众多Web应用。

(5)SQL注入攻击的手段

  • 没有正确过滤转义字符
    应用系统的使用者输入内容,在没有通过前端验证,字符串过滤的状况下,就会发生SQL注入攻击。非法的输入传递给后台的SQL语句,SQL语句最终在数据库中执行非法的操做。
  • Incorrect type handling
    因为Web应用使用者所输入的参数,在传递过程当中并非强类型,也没有实施必要的类型转换,那么就会发生Incorrect type handling这种状况。好比,应用编码者对用户输入的内容并无进行合法性检验,本来应该输入数字,可是编码者并未进行类型检验。
  • 数据库自身的漏洞
    某些数据库因为自身设计以及实现的漏洞,就会致使攻击者利用这些漏洞对数据库服务器进行攻击。SQLsever有些漏洞会致使攻击者可以越过访问权限,执行越权的操做,这样对数据库的危害也是极大的。所以应该及时修补数据库漏洞。
  • 盲目SQL注入式攻击
    若是应用系统对于承受的SQL注入攻击没有察觉,没有对攻击者进行有效的防范,就会发生盲目的SQL注入攻击。存在SQL注入攻击点的网页可能不会给攻击者展现有用的信息,它会根据注入攻击者注入到合法语句中的不一样逻辑,进而显示不一样的网页内容,这种攻击手段很是的耗费精力,须要攻击者不断的精心构造注入语句,一旦发现注入点和注入目标就能够很顺利的获取想要的信息。
  • 条件响应
    目前这种SQL注入攻击方式可以在应用程序的网页中进行逻辑计算。
  • 条件性差错
    经过构造逻辑错误来判断应用程序是否具备注入点。总结概括出该应用所使用的数据库的类型,数据库中包含的一些数据表名,字段名等,这样就能够为接下来注入点的寻找提供帮助。
  • 时间延误
    经过构造SQL注入语句,使得数据库判断逻辑时间变长,经过判断应用页面的加载时间来判断构造的SQL注入语句是否正确。

(6)攻击的过程主要分为以下步骤

  • 经过屡次输入不一样的内容来测试当前的应用系统是否能够进行SQL注入,若是能够,那么进行第二步,若是不能够,则放弃。
  • 经过不断的输入测试数据,进而寻找SQL注入攻击点,找到SQL注入攻击点后,接下来就要寻找网站中能够被利用的SQL注入的漏洞。在这里,咱们能够经过输入一些特殊字符,语句来寻找漏洞,同时咱们也能够根据浏览器的返回的数据库信息,进而能够判断该Web应用所使用的数据库的类型。接下来,咱们就能够构造数据库的查询语句,从而找寻注入点。
  • 暴力猜解数据库中存储的一些用户名和密码,通常状况下,服务器的数据库数据表中存放的表名、字段名,字段类型等信息都是有必定规律的。能够经过构建特殊数据库语句,这样能够在数据库经过查询语句来得到用户的表名、字段名、用户名和密码的长度以及内容,网络上存在着大量的SQL自动化注入工具,这个暴力猜解的过程能够经过这些工具来快速的实现。
  • 能够着手寻找Web应用管理后台的入口。一般状况下,Web后台管理的界面确定是不会对于普通用户进行开放的,所以后台管理界面的路径是未知的。不过能够利用网上的一些路径扫描工具来寻找后台真正的登录路径。这些路径实际上是有规律可循的,通过不断的尝试就能够找到真正的管理后台入口的地址。
  • 此时能够进行系统入侵和破坏了。由于刚刚获得了用户表的用户名和密码,这样一来,就可以获取到管理员的用户名和密码,从而拥有了管理员权限,登陆管理员帐号,进入应用的管理后台,随后就能够进行篡改网页、上传木马、修改、泄漏用户信息等一系列的破坏行为,并进一步入侵数据库服务器。

(7) 针对SQL注入攻击的检测方法
做为排在威胁Web应用安全十大攻击手段之首的SQL注入攻击,在安全产业界和学术界有着不少的深刻研究。在传统的安全产业界主要检测和识别SQL注入攻击有以下两种技术:一种是基于特征的关键字匹配技术;另外一种是基于异常检测技术。

  • 基于特征的关键字匹配技术:它包含许多关键字匹配算法,一个好的匹配算法是这项技术好坏的评价标准之一,目前主要使用的检测技术就是基于特征的关键字匹配技术,这种技术的核心思想是在SQL语句中抽取出特殊字符(例如#等),提取数据库的关键字(例如:select、union等)。经过提取出来的特殊字符来判断该SQL语句是否进行了SQL注入攻击。
  • 基于异常检测技术:它包含基于程序行为的异常检测技术,基于数据流的异常检测技术和基于聚类的异常检测技术等手段,这种检测技术被业界分为学习期与检测期。在学习期,检测系统必须拥有不受影响的网络系统,必须针对须要检测的Web应用具备专业的学习机制,只有当检测系统通过不断的学习,进而学习成熟后,才能进入系统检期。在系统的检测期,检测系统利用其在学习期演变成的准确模型,对传递进系统来的用户输入数据进行系统地全面分析。

(8)针对SQL注入攻击的防护措施

  • 普通用户与系统管理员的权限要严格区分
  • 使用参数化的过滤性SQL语句
  • 须要增强对用户输入的验证
  • 使用数据库自带的安全参数
  • 避免出现一些详细的错误消息
  • 多层环境防治SQL注入式攻击
  • 使用专业的漏洞扫描工具
  • 对数据进行加密处理
  • 在Web应用程序开发过程的全部阶段实施代码的安全检查

SQL注入攻击防范
(1)在设计应用程序时,彻底使用参数化查询(Parameterized Query)来设计数据访问功能。
(2)在组合SQL字符串时,先针对所传入的参数做字元取代(将单引号字元取代为连续2个单引号字元)。
(3)若是使用PHP开发网页程序的话,亦可打开PHP的魔术引号(Magic quote)功能(自动将全部的网页传入参数,将单引号字元取代为连续2个单引号字元)。
(4)其余,使用其余更安全的方式链接SQL数据库。例如已修正过SQL注入问题的数据库链接组件,例如ASP.NET的SqlDataSource对象或是 LINQ to SQL。
(5)使用SQL防注入系统。

XSS攻击

  • 基于特征的防护
    XSS漏洞和著名的SQL注入漏洞同样,都是利用了Web页面的编写不完善,因此每个漏洞所利用和针对的弱点都不尽相同。这就给XSS漏洞防护带来了困难:不可能以单一特征来归纳全部XSS攻击。
    传统XSS防护多采用特征匹配方式,在全部提交的信息中都进行匹配检查。对于这种类型的XSS攻击,采用的模式匹配方法通常会须要对“JavaScript”这个关键字进行检索,一旦发现提交信息中包含“javascript”,就认定为XSS攻击。这种检测方法的缺陷显而易见:骇客能够经过插入字符或彻底编码的方式躲避检测:
    (1)在javascript中加入多个tab键,获得
    < IMG SRC="jav ascript:alert('XSS');" >;
    (2)在javascript中加入(空格)字符,获得
    < IMG SRC="javascri pt:alert('XSS');" >;
    (3)在javascript中加入(回车)字符,获得
    < IMG SRC="jav
    ascript:alert('XSS');" >;
    (4)在javascript中的每一个字符间加入回车换行符,获得
    < IMG SRC="javascrip\r
    \nt:alert('XSS');" >
    (5)对”javascript:alert(‘XSS’)”采用彻底编码,获得
    < IMGSRC=javascrip?74:alert('XSS') >
    上述方法均可以很容易的躲避基于特征的检测。而除了会有大量的漏报外,基于特征的
    还存在大量的误报可能:在上面的例子中,对上述某网站这样一个地址,因为包含了关键字“javascript”,也将会触发报警。
  • 基于代码修改的防护 和SQL注入防护同样,XSS攻击也是利用了Web页面的编写疏忽,因此还有一种方法就是从Web应用开发的角度来避免: 对全部用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其余的一概过滤。 实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。确认接收的的内容被妥善的规范化,仅包含最小的、安全的Tag(没有javascript),去掉任何对远程内容的引用(尤为是样式表和javascript),使用HTTP only的cookie。 固然,如上操做将会下降Web业务系统的可用性,用户仅能输入少许的制定字符,人与系统间的交互被降到极致,仅适用于信息发布型站点。而且考虑到不多有Web编码人员受过正规的安全培训,很难作到彻底避免页面中的XSS漏洞。
相关文章
相关标签/搜索