20189222 《网络攻防实践》第十周学习总结
1.谈谈你对于 冯·诺依曼体系结构和图灵机的理解,它们有什么区别和联系?
-
冯·诺依曼体系结构:
一种将程序指令存储器和数据存储器合并在一起的计算机设计概念结构,他首次提出了三大概念,分别是:- 五大组成部件:输入设备,存储器,运算器,控制器,输出设备
- 采用二进制
- 存储程序
冯诺依曼体系结构的指令和数据均采用二进制码表示;指令和数据以同等地位存放在存储器中,均可按地址寻访;指令由操作码和地址码组成,操作码用来表示操作的性质,地址码用来表示操作数所在存储器的位置;指令在存储器中按顺序存放,通常指令是按顺序执行的,特定条件下,可以根据运算结果或者设定的条件改变执行顺序;机器以运算器为中心,输入输出设备和存储器的数据传送通过运算器。
-
图灵机:
图灵机(Turing Machine)是图灵在1936年发表的 “On Computable Numbers, with an Application to the Entscheidungsproblem”(《论可计算数及其在判定性问题上的应用》)中提出的数学模型。既然是数学模型,它就并非一个实体概念,而是架空的一个想法。在文章中图灵描述了它是什么,并且证明了,只要图灵机可以被实现,就可以用来解决任何可计算问题图灵机的结构包括以下几个部分:
- 一条无限长的纸带(tape),纸带被分成一个个相邻的格子(square),每个格子都可以写上至多一个字符(symbol)。
- 一个字符表(alphabet),即字符的集合,它包含纸带上可能出现的所有字符。其中包含一个特殊的空白字符(blank),意思是此格子没有任何字符。
- 一个读写头(head),可理解为指向其中一个格子的指针。它可以读取/擦除/写入当前格子的内容,此外也可以每次向左/右移动一个格子。
- 一个状态寄存器(state register),它追踪着每一步运算过程中,整个机器所处的状态(运行/终止)。当这个状态从运行变为终止,则运算结束,机器停机并交回控制权。如果你了解有限状态机,它便对应着有限状态机里的状态。
- 一个有限的指令集(instructions table),它记录着读写头在特定情况下应该执行的行为。可以想象读写头随身有一本操作指南,里面记录着很多条类似于“当你身处编号53的格子并看到其内容为0时,擦除,改写为1,并向右移一格。此外,令下一状态为运行。”这样的命令。其实某种意义上,这个指令集就对应着程序员所写下的程序了。
两者相同点
都是顺序执行,能够进行存储和计算,也可以设置相应的计算规则。
两者不同点
- 冯诺依曼体系结构:(1)是一台真正的计算机。(2)由不同部分组成。(3)二进制表示。
- 图灵机:(1)一个理想情况下的计算机。(2)只能进行数学计算。(3)字母表示
图灵机是计算机领域的一个数学模型,而冯诺依曼体系机构是一个计算机模型。
2.根据你的程序设计经验谈谈对“程序=指令+数据”的理解
作一个不恰当的比喻,“程序=指令+数据”就像是“作文=语法+词汇”一样。在计算机中指令就相当于语法,能够将词汇串联成句,表达出我们想表达的意思,也就是说指令和数据一起才能构成程序。本身程序就是计算机想要表达意思的一个集合,没有数据的支撑,光有指令只能是空中楼阁。在实际编程的时候,我们往往需要用简单的数据来证明我们程序设计的是否合理。因此,“程序=指令+数据”这句话就好理解了,有想法,有工具,才能完成一件事情,计算机程序也是如此。这便是我的理解。
3. 研究以下安全问题(要有实践),结合上面内容谈谈他们有什么共同点,如何抽象出统一的防范方法?(缓冲区溢出、XSS攻击、SQL注入攻击)
缓冲区溢出
缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。计算机程序一般都会使用到一些内存,这些内存或是程序内部使用,或是存放用户的输入数据,这样的内存一般称作缓冲区。溢出是指盛放的东西超出容器容量而溢出来了,在计算机程序中,就是数据使用到了被分配内存空间之外的内存空间。而缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。
XSS攻击
XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被骇客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,骇客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。
SQL注入攻击
SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:①不当的类型处理;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当。
当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。
共同点
它们利用存储程序的特点和漏洞,将恶意程序插入到要执行的程序中,使程序跳转到攻击者想要执行的位置执行从而完成攻击。
防范方法就是引入检查机制,如关键字检查、关键字转码。