当前位置: 首页 > news >正文

输入处理与安全性

1.输入处理

输入处理为业务逻辑处理之前的数据准备阶段。

a.检验字符编码的有效性

b.必要时转换字符编码

c.检验参数字符串的有效性

 

检验字符编码:每种语言都有检验字符编码的函数,再输入处理中使用相应函数进行检验。

转换字符编码:转换字符编码的方法因编程语言而不同,可分为自动转换字符编码的语言和在脚本中手动转换字符编码的语言。

输入校验:今早发现输入错误并提示用户重新输入,提高了易用性;防止错误处理造成数据不一致等,提高了系统的可靠性。

安全性策略和输入校验:输入阶段实施的校验不能成为安全隐患的防范策略,输入校验是根据应用程序的软件规格而实施的操作。

根据应用程序的规格进行校验:

校验控制字符,换行符(CR和LF)和Tab等通常不显示在页面上、ASCIIb编码中0x20以下以及0x7F(DELETE)的字符、空字节。

校验字符数,应用程序的规格文档中应当明确定义所有输入项目的最大字符数。

需要校验的参数:输入校验的对象为所有的参数。

hidden参数、单选框、select元素;

Cookie中包含会话ID以外的值的情况下,Cookie值也是校验对象;

Referer等HTTP消息头也需要校验。

 

2.二进制安全与空字节攻击

二进制安全:不管输入值是怎样的字节列都能原封不动地对其进行处理的功能,特别是当包含零值字节(NULL字节,\0)时也能正确处理。

空字节:在C语言以及Unix与Windows的API中规定空字节为字符串的结尾。不能正确处理空字节的函数被称为不是二进制安全的函数。

空字节攻击:利用空字节攻击的手段被称为空字节攻击。空字节攻击本身并不造成伤害,而是通常被用于绕过其他安全隐患的防范策略。

检验脚本如下:

test.php

<body>
<?php
$p = $_GET['p'];
if (ereg('^[0-9]+$', $p) === FALSE) {
die('整数値を入力してください');
}
echo $p;
?>
</body>

检验参数p是否只包含数字

http://www.wcs.com/test.php?p=1%00<script>alert('xss')</script>

通过%00截断绕过了ereg检验。ereg函数不是二进制安全的函数。

 

3.PHP的正则表达式库

利用正则表达式便利地实现输入校验。

ereg系列,非二进制安全,在PHP5.3及以后已被废弃;

preg系列,仅在字符编码为UTF-8的情况下能正常处理中文字符;

mb_ereg3系列,适用于大多数字符编码。

通过在程序的开头使用preg或mb_ereg进行包含空字节的控制字符校验,能够同时进行应用规格中的字符种类校验和空字节校验。

 

4.输入校验与框架

在使用Web应用开发框架的情况下,可以利用框架中提供的输入校验功能,从而简化开发流程。

 

5.“非控制字符的正则表达式”

"确认输入值为0-100的字符且不包含控制字符"

PHP(preg_match),使用POSIX字符集:

PHP(preg_match),Perl风格的\P{Cc}: 

PHP(mb_ereg),只能使用POSIX字符集: 

Perl能使用\P{Cc}来指定控制字符以外的字符。Perl中可以使用正则表达式字面量,所以不必使用两个\来转义: 

Java(String类的matchs方法),匹配规则为全体一致,所以正则表达式中不必使用\A和\z。Java中正则表达式的形式为字符串,所以需要使用两个\来转义。 

VB.NET,.NET FRAMEWORK中提供了使用Regex类进行正则表达式查询的功能。VB.NET的字符串字面量中不需要使用两个\来转义。 

 

转载于:https://www.cnblogs.com/wcsan/p/9206117.html

相关文章:

  • 基于结构的距离度量
  • partprobe 和 partx 的用法
  • 开发环境问题
  • 【咸鱼教程】本地图片上传。动态GIF表情图生成
  • HTML_列表标签
  • docker基础
  • jstack
  • linux常用命令与终端快捷键总结
  • 别让程序员停止在35岁,如何让我们走得更远?
  • jQuery获取URL中的参数
  • try{ } catch (e){ }的理解
  • jQuery = 1.11.3 DomXSS漏洞
  • EOS多节点组网:商业场景分析以及节点启动时序
  • maven与sbt修改国内镜像
  • U盘安装Linux CentOS 6.8 系统
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • express如何解决request entity too large问题
  • Iterator 和 for...of 循环
  • JS函数式编程 数组部分风格 ES6版
  • Laravel 中的一个后期静态绑定
  • Service Worker
  • Spring声明式事务管理之一:五大属性分析
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 从0实现一个tiny react(三)生命周期
  • 猴子数据域名防封接口降低小说被封的风险
  • 力扣(LeetCode)357
  • 码农张的Bug人生 - 初来乍到
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 深度解析利用ES6进行Promise封装总结
  • 网络应用优化——时延与带宽
  • 走向全栈之MongoDB的使用
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 2017年360最后一道编程题
  • NLPIR智能语义技术让大数据挖掘更简单
  • # Apache SeaTunnel 究竟是什么?
  • # 达梦数据库知识点
  • #{} 和 ${}区别
  • #Linux(帮助手册)
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (Matlab)使用竞争神经网络实现数据聚类
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (数据结构)顺序表的定义
  • ./configure,make,make install的作用(转)
  • .Net 6.0 处理跨域的方式
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net MVC中使用angularJs刷新页面数据列表
  • .net 使用ajax控件后如何调用前端脚本
  • .Net 应用中使用dot trace进行性能诊断
  • .NET多线程执行函数
  • @property @synthesize @dynamic 及相关属性作用探究