安全编程技术

(一)缓冲区溢出

  1. 缓冲区
    概念:缓冲区,保存于内存中,简单说来是一块连续的计算机内存区域,可以保存相同数据类型的多个实例。

  2. 缓冲区溢出原理
    大于数组长度的字符串进入数组中,多余部分覆盖后面的内容 如下代码:

    void f(char* str)
    {
    char buffer[10];
    strcpy(buffer,str);
    }

    如果str的长度大于10,那么就会发生缓冲区溢出

  3. 缓冲区溢出的危害
    修改敏感数据,执行非授权指令。
    如果覆盖的地方保存的是数据,则会覆盖原有的数据。可能暂时不会有影响,也可能使得程序执行中出现不可预知的错误;如果覆盖的地方保存的是指令,则会覆盖原有的指令,而去执行现在保存的数字对应的地址的指令。
    通过缓冲区溢出,攻击者可以执行很多操作。

  4. 缓冲区溢出攻击
    (1)通过缓冲区溢出,来覆盖一些关键数据所对应的内存,从而改变执行逻辑。
    举一个简单的例子,如果碰巧在缓冲区后面的内存中有一个布尔变量,该变量为true(1)或false(0),决定用户是否可以执行某个敏感操作。如果该变量被缓冲区溢出的数据覆盖,可能由false(0)变为true(1),程序的执行流程被更改。
    (2)通过缓冲区溢出,向指令区放置一个精心准备的数据,该数据是一个函数的地址,来调用这个函数
    一般情况下能够被攻击的是一些结构相对稳定的软件,如IIS

  5. 解决方案–如何预防缓冲区溢出
    (1)积极检查边界。由于C和C++允许任意的缓冲区溢出,没有任何的缓冲区溢出边界检测机制来进行限制,因此,一般情况下,所有开发者需要手动在自己的代码中添加边界检测机制。
    不过,也有一些优化的技术来减少手工检查的次数。如使用Richard Jones和Paul Kelly开发的gcc补丁、利用Compaq的 C 编译器等。
    (2)不让攻击者执行缓冲区内的命令。这种方法使得攻击者即使在被攻击者的缓冲区中植入了执行代码之后,也无法执行被植入的代码。具体方法大家可以参考相关的文献。
    (3)编写风格良好的代码。养成一个习惯,不要因为一味追求程序性能,而编写一些安全隐患较多的代码,特别是不要使用一些可能有漏洞的API,减少漏洞发生的可能。可以用一些查错工具,限制一些可能具有缓冲区溢出漏洞攻击的函数的调用(如strcpy和sprintf等)。
    (4)程序指针检查。程序指针检查不同于边界检查,程序指针检查是一旦修改了程序指针,就会被检测到,被改变的指针将不被使用。这样,即使一个攻击者成功地改变了程序的指针,因为系统事先检测到了指针的改变,这个指针将不会被使用,达不到攻击的目的。

(二)web安全

URL操作攻击

/S模式和C/S模式最重要的区别:用URL来进行请求
URL:统一资源定位
http://www.csu.edu.cn就是一个URL
俗称网址
网址一般在浏览器的地址栏上显示给用户
正因为如此,用户可以设计巧妙的网址来攻击网站:获取受限资源,甚至可以对信息进行修改

网址可以怎样被设计呢?

网址上最常见的是可以带一些URL的参数
http://bksy.csu.edu.cn/info/1057/query.jsp?id=3060

解决方法:
(1)最常见的是:
将拥有资源访问权限的用户ID加到资源访问的URL中,查询前检查session登录状态
session检查是保证受限资源安全的最重要的方法

什么叫session检查?
用户登录成功,用户名保存在服务器端session;同一个客户端下次访问该网站的受限资源(比如网页),在网页前面增加:检查session中是否有此用户名
注:只针对受限资源进行session检查,不是所有资源都要session检查

多个受限资源中,session检查代码要写多次!采用其他技术
比如过滤器、拦截器等等,将session检查编写一次,来过滤或拦截处理指向受限资源的访问

这种方法,一般不需要进行URL的伪装

URL伪装(一般用于不需要用户登录,但是防止机器人恶意遍历访问的情况).

跨站脚本(XSS)

Cross-Site Scripting XSS
原理:三方
攻击方 受害方 网站
(1)攻击方向网站中放置(发送)一些含有脚本的内容,网站接收;
(2)受害方访问网站,因为某些原因运行了脚本,使其受害(如隐私泄露等)

例如:攻击者向受害者发送一封邮件,里面有一段可能会访问其Cookie的脚本。通过一个链接,引诱用户点击,从而访问脚本,脚本获取客户Cookie中的内容传给攻击者。

攻击者也可以在论坛上发帖,帖中含有脚本。让受害者点击。

如何解决?
最常见的方法:过滤脚本中的特殊字符;或者最常见的方法:将脚本中的特殊字符转成文本

SQL注入

原理
设计SQL注入
SQL注入的解决方法
解决方法:
(1)采用相对安全的参数传递方法
如Java中的PreparedStatement,.net中的SQLParameter等,它们会自动规避一些SQL语言的关键符号
(2)自己过滤掉一些SQL关键符号

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值