正则 不包含 指定的字符串src='/xxx' 关于XSS攻击
String src = "abcimg src='xxxx'";
Pattern scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(?!/)(.*?)\\\'",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
String result = scriptPattern.matcher(src).replaceAll("");
System.out.println(result);
网页设计和网站开发用到的技术有哪些?
A — AJAX
AJAX 全称为“ Asynchronous JavaScript and XML ”(异步 JavaScript 和 XML ),是一种创建交互式网页应用的 网页开发 技术。根据Ajax提出者Jesse James Garrett建议,AJAX:
使用 XHTML + CSS 来表示信息;
使用 JavaScript 操作 DOM (Document Object Model)进行动态显示及交互;
使用 XML 和 XSLT 进行数据交换及相关操作;
使用 XMLHttpRequest 对象与 Web服务器 进行异步数据交换;
使用 JavaScript 将所有的东西绑定在一起。
类似于 DHTML 或 LAMP ,AJAX不是指一种单一的技术,而是有机地利用了一系列相关的技术。事实上,一些基于AJAX的“派生/合成”式(derivative/composite)的技术正在出现,如 AFLAX 。
B — Browser
网页浏览器 是个显示 网页服务器 或文件系统内的文件,并让用户与此些文件交互的一种 软件 。它用来显示在 万维网 或 局域网
等内的文字、图像及其他信息。这些文字或图像,可以是连接其他网址的超连结,用户可迅速及轻易地浏览各种信息。大部分网页为 HTML
格式,有些网页需特定浏览器才能正确显示。 个人电脑 上常见的网页浏览器按照2010年1月的市场占有率依次是 微软 的 Internet
Explorer 、 Mozilla 的 Firefox 、 Google 的 Google Chrome 、 苹果公司 的 Safari 和
Opera软件公司 的 Opera 。浏览器是最经常使用到的 客户端程序 。Web开发人员应该确保其程序在各个主流浏览器中都能正常工作。
C — CSS
层叠样式表, 又称: 串样式列表 ,英文: Cascading Style Sheets ,简写为 CSS ,由 W3C
定义和维护的标准,一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式(字体、间距和颜色等)的 计算机语言 。目前最新版本是
CSS 2.1,为W3C的候选推荐标准。下一版本CSS 3仍然在开发过程中。
D — DOM
文档对象模型 (Document Object Model,简称DOM),是 W3C 组织推荐的处理 可扩展置标语言
的标准编程接口。Document Object Model的历史可以追溯至1990年代后期微软与 Netscape 的“ 浏览器大战
”(browser wars),双方为了在 JavaScript 与 JScript
一决生死,于是大规模的赋予浏览器强大的功能。微软在网页技术上加入了不少专属事物,计有VBScript、ActiveX、以及微软自家的D HTML
格式等,使不少网页使用非微软平台及浏览器无法正常显示。DOM即是当时蕴酿出来的杰作。
E — Events
事件 是可以被控件识别的操作,如按下确定按钮,选择某个 单选按钮 或者 复选框 。每一种控件有自己可以识别的事件,如 窗体 的加载、单击、双击等事件,编辑框(文本框)的文本改变事,等等,现代的Web应用程序很大程度上依靠事件驱动。
事件有系统事件和用户事件。系统事件由系统激发,如时间每隔24小时,银行储户的存款日期增加一天。用户事件由用户激发,如用户点击按钮,在文本框中显示特定的文本。 事件驱动 控件执行某项功能。触发事件的对象称为事件发送者;接收事件的对象称为事件接收者。
使用事件机制可以实现:当类对象的某个状态发生变化时,系统将会通过某种途径调用类中的有关处理这个事件的方法或者触发控件事件的对象就会调用该控件所有已注册的事件处理程序等。
F — Firebug
Firebug 是 网页浏览器 Mozilla Firefox
的一个扩展,是一个除错工具。用户可以利用它除错、编辑、甚至删改任何网站的 CSS 、 HTML 、 DOM 、与 JavaScript
代码。Firebug 也有提供其他网页开发工具,例如 Yahoo! 的网页速度优化建议工具 YSlow 。Firebug是哈维( Joe
Hewitt )撰写的。他是最初Firefox创始者之一。
G — Grid
网格 ,也称 栅格 ,不过从定义上说,栅格更为准确些。网上找个一个对网页栅格系统比较恰当的 定义
:以规则的网格阵列来指导和规范网页中的版面布局以及信息分布。网页栅格系统是从平面栅格系统中发展而来。对于网页设计来说,栅格系统的使用,不仅可以让
网页的信息呈现更加美观易读,更具可用性。而且,对于前端开发来说,网页将更加的灵活与规范。如果有很多CSS框架支持栅格功能,可参考文章《
介绍27款经典的CSS框架 》。
H — HTML
超文本置标语言 ( 英文 : HyperText Markup Language , HTML )是为“ 网页 创建和其它可在 网页浏览器
中看到的信息”设计的一种 置标语言 。HTML被用来结构化信息——例如标题、段落和列表等等,也可用来在一定程度上描述文档的外观和 语义 。由
蒂姆·伯纳斯-李 给出原始定义,由 IETF 用简化的 SGML (标准通用置标语言)语法进行进一步发展的HTML,后来成为国际标准,由
万维网联盟 (W3C)维护。
最新版本是 HTML5 它是HTML下一个的主要修订版本,现在仍处于发展阶段。目标是取代1999年所定订的 HTML 4.01和
XHTML 1.0 标准,以期能在互联网应用迅速发展的时候,使网络标准达到符合当代的网络需求。广义论及HTML5时,实际指的是包括HTML、
CSS 和 JavaScript 在内的一套技术组合。
I — IE
Windows Internet Explorer (旧称 Microsoft Internet Explorer ,简称
Internet Explorer ,缩写 IE ),是 微软公司 推出的一款 网页浏览器
。截至2010年9月止,统计的数据显示Internet Explorer的 市场占有率
高达59.65%。虽然它依然是使用最广泛的网页浏览器,但与 2003年 最高峰时相比,市场占有率相差超过30%。
Internet Explorer对一些标准化技术都有一定程度上的支持,但亦有很多运行上的差距和兼容性的故障
,这导致技术开发者的批评日益增加。批评增加的情况,在很大程度上是归因于Internet
Explorer的竞争对手相对地已提供完全的技术支持,标准规格(Standards-compliant)的应用亦越来越广泛起来。因为
Internet Explorer在全球广为应用,网络开发者们在寻求 跨平台 的代码时常常会发现Internet
Explorer的漏洞、私有的功能集合和对标准支持的不完善。
2011年3月14日发布的Internet Explorer
9浏览器大幅提高对CSS3和HTML5等W3C规范的支持程度,这个版本也是Internet
Explorer浏览器第一个采用GPU加速的版本,正式版于Acid3测试中获得95/100分,相比以往版本有很大进步。可以认为,从
Internet Explorer 9开始,Internet Explorer浏览器对W3C规范的支持将不再是问题。
J — JavaScript
JavaScript 是一种广泛用于 客户端 Web开发 的 脚本语言
,常用来给HTML网页添加动态功能,比如响应用户的各种操作。它最初由 网景公司 的 Brendan Eich
设计,是一种动态、弱类型、基于原型的语言,内置支持类。JavaScript是 Sun公司 的注册商标。 Ecma国际
以JavaScript为基础制定了 ECMAScript
标准。JavaScript也可以用于其他场合,如服务器端编程。完整的JavaScript实现包含三个部分: ECMAScript ,
文档对象模型 , 字节顺序记号 。
Netscape公司在最初将其脚本语言命名为LiveScript来Netscape在与Sun合作之后将其改名为JavaScript。
JavaScript最初受 Java
启发而开始设计的,目的之一就是“看上去像Java”,因此语法上有类似之处,一些名称和命名规范也借自Java。但JavaScript的主要设计原则
源自 Self 和 Scheme
.JavaScript与Java名称上的近似,是当时网景为了营销考虑与Sun公司达成协议的结果。为了取得技术优势, 微软 推出了 JScript
来迎战JavaScript的 脚本语言 。为了互用性, Ecma国际 (前身为 欧洲计算机制造商协会
)创建了ECMA-262标准(ECMAScript)。现在两者都属于 ECMAScript 的实现。尽管JavaScript作为给非程序人员的
脚本语言 ,而非作为给程序人员的 编程语言 来推广和宣传,但是JavaScript具有非常丰富的特性。
K — Keyword Optimization
关键词优化 ,也叫 搜索引擎优化 ( Search Engine Optimization ,简称 SEO )是一种利用 搜索引擎
的搜索规则来提高目的 网站 在有关搜索引擎内的排名的方式。由于不少研究发现,搜索引擎的用户往往只会留意搜索结果最前面的几个条目,所以不少 网站
都希望通过各种形式来影响搜索引擎的排序。当中尤以各种依靠广告维生的网站为甚。
所谓“针对搜索引擎作优化的处理”,是指为了要让网站更容易被搜索引擎接受。搜索引擎会将网站彼此间的内容做一些相关性的数据比对,然后再由 浏览器 将这些内容以最快速且接近最完整的方式,体现给搜索者。
搜索引擎优化对于任何一家网站来说,要想在网站推广中取得成功,搜索引擎优化都是至为关键的一项任务。同时,随着搜索引擎不断变换它们的排名算法规
则,每次算法上的改变都会让一些排名很好的网站在一夜之间名落孙山,而失去排名的直接后果就是失去了网站固有的可观访问量。所以每次搜索引擎算法的改变都
会在网站之中引起不小的骚动和焦虑。可以说,搜索引擎优化是一个愈来愈复杂的任务。
L — Less
Less
最早是一个ruby的gem,让CSS具有动态语言的特性,这些特性包括变量,操作符,嵌套规则。其实Less真正的作用是将使用高级特性的CSS转换成
标准的CSS。这些都是在Web客户端发起请求时通过Http
Handler来完成的。也可以是编辑时就完成的。此外,Less可以配置成自动最小化所生成的CSS文件,不仅节省了带宽,并且使最终用户体验更上一
层。另外有.Net版本的 Less 。
M — MVC
MVC模式 (Model-View-Controller)是 软件工程 中的一种 软件架构
模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。MVC模式最早由 Trygve
Reenskaug 在1974年提出,是 施乐帕罗奥多研究中心 (Xerox PARC)在20世纪80年代为程序语言 Smalltalk
发明的一种软件设计模式。 MVC模式
的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结
构更加直观。软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。
N — Node.JS
Node 是一个Javascript运行环境(runtime) , 实际上它是对Google V8 引擎(应用于Google
Chrome浏览器)进行了封装。 V8 引
擎执行Javascript的速度非常快,性能非常好。Node对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。例
如,在服务器环境中,处理二进制数据通常是必不可少的,但Javascript对此支持不足,因此,V8.Node增加了Buffer类,方便并且高效地
处理二进制数据。因此,Node不仅仅简单的使用了V8,还对其进行了优化,使其在各环境下更加给力。 Node.js
包罗万象,但最主要的一点是,它提供了一种在Web浏览器之外运行Javascript的途径。Javascript广泛应用于网站的前端开发。Node
使得这种流行的编程语言能够在更多环境下运行,甚至是网站的服务器端。
O — Object
对象 (object),是 面向对象 (Object Oriented) 中的术语,既表示客观世界 问题空间
(Namespace)中的某个具体的事物,又表示软件系统 解空间 中的基本元素。在软件系统中,对象具有唯一的 标识符 ,对象包括 属性
(Properties)和 方法 (Methods),属性就是需要记忆的信息,方法就是对象能够提供的服务。在面向对象(Object
Oriented) 的软件中,对象(Object)是某一个 类 (Class)的 实例 (Instance)。
P — PHP
PHP ( H ypertext P reprocessor )是一种在电脑上运行的 脚本语言 ,主要用途是在于处理 动态网页
,也包含了 命令行 运行接口(command line interface),或者产生 图形用户界面 (GUI)程序。PHP最早由 Rasmus
Lerdorf 在1995年发明,而现在PHP的标准由PHP Group和开放源代码社区维护。PHP以PHP
License作为许可协议,不过因为这个协议限制了PHP名称的使用,所以和开放源代码许可协议 GPL 不兼容。
PHP的应用范围相当广泛,尤其是在网页程序的开发上。一般来说PHP大多运行在网页服务器上,通过运行PHP代码来产生用户浏览的网页。PHP可
以在多数的服务器和操作系统上运行,而且使用PHP完全是免费的。根据2007年4月的统计数据,PHP已经被安装在超过2000万个网站和100万台服
务器上。
Q — Query
查询 ,有很多种意思。例如查询语言用来和存储数据的扩展系统交互,一个很好的例子就是SQL用来操作关系数据库。另一种意思是,一个查询字符串,作为URL的一部分用于Web应用程序中传递数据,查询字符串的格式一般是键值对形式。
R — Regular Expressions
正则表达式 ( 英语 :Regular Expression、regex或regexp,缩写为RE),也译为 正规表示法 、 常规表示法
,在 计算机科学 中,是指一个用来描述或者匹配一系列符合某个 句法 规则的 字符串 的单个字符串。在很多 文本编辑器
或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多 程序设计语言 都支持利用正则表达式进行字符串操作。例如,在
Perl 中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由 Unix 中的工具软件(例如 sed 和 grep )普及开的。
S — Source Control
源代码管理 ,也称 版本控制 ,是一种 软件工程 技巧,借此能在软件开发的过程中,确保由不同人所编辑的同一程式档案都得到同步。 软件设计师
常会利用版本控制来追踪、维护 源码 、 文件 以及 设定档 等等的更动,并且提供控制这些更动控制权的 程序 。在最简单的情况下, 软件设计师
可以自己保留一个程式的许多不同版本,并且为它们做适当的编号。这种简单的方法已被用在很多大型的软件专案中。这是一个可以达到目的的方法,但不够有效
率。除了得同时维护很多几乎一样的 程式码 备份外;而且极度依赖 软件设计师 的自我修养与开发纪律,但这却常是导致错误发生的原因。
有时候,一个程式同时存有两个以上的版本也有其必要性,例如:在一个为了部署的版本中 程式错误
已经被修正、但没有加入新功能;在另一个开发版本则有新的功能正在开发、也有新的错误待解决,这使得同时间需要不同的版本并修改。此外,为了找出只存在于
某一特定版本中的 程式错误 、或找出 程式错误 出现的版本,软件除错者也必须借由比对不同版本的程式码以找出问题的位置。
T — TDD
测试驱动开发 (Test-driven development)是现代计算机 软件开发 方法的一种。利用 测试 来驱动 软件
程序的设计和实现。测试驱动开始流行于20世纪90年代。测试驱动开发是 极限编程
中倡导的程序开发方法,方法主要是先写测试程序,然后再编码使其通过测试。测试驱动开发的目的是取得快速反馈并使用“illustrate the
main line”方法来构建程序。
测试驱动开发的比喻。开发可以从两个方面去看待:实现的功能和质量。测试驱动开发更像两顶帽子思考法的开发方式,先戴上实现功能的帽子,在测试的辅
助下,快速实现正确的功能;再戴上 重构
的帽子,在测试的保护下,通过去除冗余和重复的代码,提高代码重用性,实现对质量的改进。可见测试在测试驱动开发中确实属于核心地位,贯穿了开发的始终。
U — Unit Testing
单元测试 (又称为 模块测试 )是针对 程序模块 ( 软件设计 的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在
过程化编程 中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
通常来说,程序员每修改一次程序就会进行最少一次单元测试,在编写程序的过程中前后很可能要进行多次单元测试,以证实程序达到 软件规格书 (
en:Specification )要求的工作目标,没有 臭虫 ;虽然单元测试不是什么必须的,但也不坏,这牵涉到 项目管理 的政策决定。
V — VIM
Vim 是从 vi 发展出来的一个 文本编辑器 。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和 Emacs
并列成为 类Unix系统 用户最喜欢的编辑器。Vim的第一个版本由 Bram Moolenaar 在1991年发布。最初的简称是 V i
IM itation,随着功能的不断增加,正式名称改成了 V i IM proved。现在是在 开放源代码 方式下发行的 自由软件 。
W — WordPress
WordPress 是一种使用 PHP 语言开发的 博客 平台,用户可以在支持 PHP 和 MySQL 数据库
的服务器上架设自己的网志。也可以把 WordPress 当作一个 内容管理系统 (CMS)来使用。WordPress 是一个免费的 开源
项目,在 GNU通用公共许可证
下授权发布。目前最新版本为2011年2月24日发布的3.0.5官方简体中文版,另外还有包括英文在内的多种语言可选。
X — XSS
跨网站指令码 ( Cross-site scripting ,通常简称为 XSS )是一种网站应用程式的安全漏洞攻击,允许恶意使用者将程式码注入到网页上,其他使用者在观看网页时就会受到影响。这类攻击通常包含了 HTML 以及使用者端 脚本语言 。
Y — YUI
Yahoo! UI Library ( YUI ) 是一个开放源代码的 JavaScript 函数库,为了能建立一个高互动的网页,它采用了 AJAX , DHTML 和 DOM 等程式码技术。它也包含了许多 CSS 资源。
Z — Z index
Z-Index
是CSS属性,设置元素的堆叠顺序。拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面。该属性设置一个定位元素沿 z 轴的位置,z 轴定义为垂直延伸到显示区的轴。如果为正数,则离用户更近,为负数则表示离用户更远。
正则表达式如何剔除两个字符之间的内容
正则表达式剔除两个字符之间的内容:
$id="index_nav"; $preg='/id="(.*)"/isU'; preg_match_all($preg,$id, $arr); print_r($arr);
正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
用正则表达式不就可以让用户名不能包含一些字符了吗,为什么还要转义
你只是对用户名进行分析而已,就用户名而已确实是不需要的。
转义最重要的是防止xss攻击和sql注入。
我先说xss,xss是指你本身没有一段js,但是在用户输入的时候给你加了css,如果你没转义,那么,这一段就变成js执行了,这就是xss。例子:
假设用户发布一片文章,,文章中夹带了这么一段scriptalert(document.cookie)/script;那么,在文章展示页,执行了这么一段的话就把cookie打印出来了。假设你cookie当中有用户名,那么用户就获取到了用户名,可能你觉得没什么,用户名不是什么敏感数据,但是,你数据中总有敏感的数据在里面可能被挖掘出来。
好,下一步:假设用户在console执行了这么一段js。document.cookie="username=sss' or 1 +’",这是一个注入的sql,可能包含获取你的数据库信息。
那么你在执行数据库查询的是时候,
就有可能变成下面这个语句
select * from users where username =‘sss’ or 1 +‘‘ 。
你觉得这个执行的结果会是怎么样。这是你想要的结果么。这样有可能就获取到其他人的资料了。
这样就造成了sql注入
找人修复ASP网站XSS漏洞
Web开发常见的几个漏洞解决方法
平时工作,多数是开发Web项目,由于一般是开发内部使用的业务系统,所以对于安全性一般不是看的很重,基本上由于是内网系统,一般也很少会受到攻击,但有时候一些系统平台,需要外网也要使用,这种情况下,各方面的安全性就要求比较高了,所以往往会交付给一些专门做安全测试的第三方机构进行测试,然后根据反馈的漏洞进行修复,如果你平常对于一些安全漏洞不够了解,那么反馈的结果往往是很残酷的,迫使你必须在很多细节上进行修复完善。本文主要根据本人项目的一些第三方安全测试结果,以及本人针对这些漏洞问题的修复方案,介绍在这方面的一些经验,希望对大家有帮助。
基本上,参加的安全测试(渗透测试)的网站,可能或多或少存在下面几个漏洞:SQL注入漏洞、跨站脚本攻击漏洞、登陆后台管理页面、IIS短文件/文件夹漏洞、系统敏感信息泄露。
1、测试的步骤及内容
这些安全性测试,据了解一般是先收集数据,然后进行相关的渗透测试工作,获取到网站或者系统的一些敏感数据,从而可能达到控制或者破坏系统的目的。
第一步是信息收集,收集如IP地址、DNS记录、软件版本信息、IP段等信息。可以采用方法有:
1)基本网络信息获取;
2)Ping目标网络得到IP地址和TTL等信息;
3)Tcptraceroute和Traceroute 的结果;
4)Whois结果;
5)Netcraft获取目标可能存在的域名、Web及服务器信息;
6)Curl获取目标Web基本信息;
7)Nmap对网站进行端口扫描并判断操作系统类型;
8)Google、Yahoo、Baidu等搜索引擎获取目标信息;
9)FWtester 、Hping3 等工具进行防火墙规则探测;
10)其他。
第二步是进行渗透测试,根据前面获取到的数据,进一步获取网站敏感数据。此阶段如果成功的话,可能获得普通权限。采用方法会有有下面几种
1)常规漏洞扫描和采用商用软件进行检查;
2)结合使用ISS与Nessus等商用或免费的扫描工具进行漏洞扫描;
3)采用SolarWinds对网络设备等进行搜索发现;
4)采用Nikto、Webinspect等软件对Web常见漏洞进行扫描;
5)采用如AppDetectiv之类的商用软件对数据库进行扫描分析;
6)对Web和数据库应用进行分析;
7)采用WebProxy、SPIKEProxy、Webscarab、ParosProxy、Absinthe等工具进行分析;
8)用Ethereal抓包协助分析;
9)用Webscan、Fuzzer进行SQL注入和XSS漏洞初步分析;
10)手工检测SQL注入和XSS漏洞;
11)采用类似OScanner的工具对数据库进行分析;
12)基于通用设备、数据库、操作系统和应用的攻击;采用各种公开及私有的缓冲区溢出程序代码,也采用诸如MetasploitFramework 之类的利用程序集合。
13)基于应用的攻击。基于Web、数据库或特定的B/S或C/S结构的网络应用程序存在的弱点进行攻击。
14)口令猜解技术。进行口令猜解可以采用 X-Scan、Brutus、Hydra、溯雪等工具。
第三步就是尝试由普通权限提升为管理员权限,获得对系统的完全控制权。在时间许可的情况下,必要时从第一阶段重新进行。采用方法
1)口令嗅探与键盘记录。嗅探、键盘记录、木马等软件,功能简单,但要求不被防病毒软件发觉,因此通常需要自行开发或修改。
2)口令破解。有许多著名的口令破解软件,如 L0phtCrack、John the Ripper、Cain 等
以上一些是他们测试的步骤,不过我们不一定要关注这些过程性的东西,我们可能对他们反馈的结果更关注,因为可能会爆发很多安全漏洞等着我们去修复的。
2、SQL注入漏洞的出现和修复
1)SQL注入定义:
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
SQL注入有时候,在地址参数输入,或者控件输入都有可能进行。如在链接后加入’号,页面报错,并暴露出网站的物理路径在很多时候,很常见,当然如果关闭了Web.Config的CustomErrors的时候,可能就不会看到。
另外,Sql注入是很常见的一个攻击,因此,如果对页面参数的转换或者没有经过处理,直接把数据丢给Sql语句去执行,那么可能就会暴露敏感的信息给对方了。如下面两个页面可能就会被添加注入攻击。
①http://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestD ... type='U' and status0)0 得到第一个用户建立表的名称,并与整数进行比较,显然abc.asp工作异常,但在异常中却可以发现表的名称。假设发现的表名是xyz,则
②http://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestDB.dbo.sysobjects ... tatus0 and name not in('xyz'))0 可以得到第二个用户建立的表的名称,同理就可得到所有用建立的表的名称。
为了屏蔽危险Sql语句的执行,可能需要对进行严格的转换,例如如果是整形的,就严格把它转换为整数,然后在操作,这样可以避免一些潜在的危险,另外对构造的sql语句必须进行Sql注入语句的过滤,如我的框架(Winform开发框架、Web开发框架等)里面就内置了对这些有害的语句和符号进行清除工作,由于是在基类进行了过滤,因此基本上子类都不用关心也可以避免了这些常规的攻击了。
/// summary
/// 验证是否存在注入代码(条件语句)
/// /summary
/// param name="inputData"/param
public bool HasInjectionData(string inputData)
{
if (string.IsNullOrEmpty(inputData))
return false;
//里面定义恶意字符集合
//验证inputData是否包含恶意集合
if (Regex.IsMatch(inputData.ToLower(), GetRegexString()))
{
return true;
}
else
{
return false;
}
}
/// summary
/// 获取正则表达式
/// /summary
/// returns/returns
private static string GetRegexString()
{
//构造SQL的注入关键字符
string[] strBadChar =
{
//"select\\s",
//"from\\s",
"insert\\s",
"delete\\s",
"update\\s",
"drop\\s",
"truncate\\s",
"exec\\s",
"count\\(",
"declare\\s",
"asc\\(",
"mid\\(",
"char\\(",
"net user",
"xp_cmdshell",
"/add\\s",
"exec master.dbo.xp_cmdshell",
"net localgroup administrators"
};
//构造正则表达式
string str_Regex = ".*(";
for (int i = 0; i strBadChar.Length - 1; i++)
{
str_Regex += strBadChar[i] + "|";
}
str_Regex += strBadChar[strBadChar.Length - 1] + ").*";
return str_Regex;
}
上面的语句用于判别常规的Sql攻击字符,我在数据库操作的基类里面,只需要判别即可,如下面的一个根据条件语句查找数据库记录的函数。
/// summary
/// 根据条件查询数据库,并返回对象集合
/// /summary
/// param name="condition"查询的条件/param
/// param name="orderBy"自定义排序语句,如Order By Name Desc;如不指定,则使用默认排序/param
/// param name="paramList"参数列表/param
/// returns指定对象的集合/returns
public virtual ListT Find(string condition, string orderBy, IDbDataParameter[] paramList)
{
if (HasInjectionData(condition))
{
LogTextHelper.Error(string.Format("检测出SQL注入的恶意数据, {0}", condition));
throw new Exception("检测出SQL注入的恶意数据");
}
...........................
}
以上只是防止Sql攻击的一个方面,还有就是坚持使用参数化的方式进行赋值,这样很大程度上减少可能受到SQL注入攻击。
Database db = CreateDatabase();
DbCommand command = db.GetSqlStringCommand(sql);
command.Parameters.AddRange(param);
3、跨站脚本攻击漏洞出现和修复
跨站脚本攻击,又称XSS代码攻击,也是一种常见的脚本注入攻击。例如在下面的界面上,很多输入框是可以随意输入内容的,特别是一些文本编辑框里面,可以输入例如scriptalert('这是一个页面弹出警告');/script这样的内容,如果在一些首页出现很多这样内容,而又不经过处理,那么页面就不断的弹框,更有甚者,在里面执行一个无限循环的脚本函数,直到页面耗尽资源为止,类似这样的攻击都是很常见的,所以我们如果是在外网或者很有危险的网络上发布程序,一般都需要对这些问题进行修复。
XSS代码攻击还可能会窃取或操纵客户会话和 Cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务。
[建议措施]
清理用户输入,并过滤出 JavaScript 代码。我们建议您过滤下列字符:
[1] (尖括号)
[2] "(引号)
[3] '(单引号)
[4] %(百分比符号)
[5] ;(分号)
[6] ()(括号)
[7] ( 符号)
[8] +(加号)
为了避免上述的XSS代码攻击,解决办法是可以使用HttpUitility的HtmlEncode或者最好使用微软发布的AntiXSSLibrary进行处理,这个更安全。
微软反跨站脚本库(AntiXSSLibrary)是一种编码库,旨在帮助保护开发人员保护他们的基于Web的应用不被XSS攻击。
编码方法
使用场景
示例
HtmlEncode(String)
不受信任的HTML代码。 a href=”http://www.cnblogs.com”Click Here [不受信任的输入]/a
HtmlAttributeEncode(String)
不受信任的HTML属性
hr noshade size=[不受信任的输入]
JavaScriptEncode(String)
不受信任的输入在JavaScript中使用
script type=”text/javascript”
…
[Untrusted input]
…
/script
UrlEncode(String)
不受信任的URL
a href=”http://cnblogs.com/results.aspx?q=[Untrusted input]”Cnblogs.com/a
VisualBasicScriptEncode(String)
不受信任的输入在VBScript中使用
script type=”text/vbscript” language=”vbscript”
…
[Untrusted input]
…
/script
XmlEncode(String)
不受信任的输入用于XML输出
xml_tag[Untrusted input]/xml_tag
XmlAttributeEncode(String)
不 受信任的输入用作XML属性
xml_tag attribute=[Untrusted input]Some Text/xml_tag
protected void Page_Load(object sender, EventArgs e)
{
this.lblName.Text = Encoder.HtmlEncode("scriptalert('OK');/SCRIPT");
}
例如上面的内容,赋值给一个Lable控件,不会出现弹框的操作。
但是,我们虽然显示的时候设置了转义,输入如果要限制它们怎么办呢,也是使用AntiXSSLibrary里面的HtmlSanitizationLibrary类库Sanitizer.GetSafeHtmlFragment即可。
protected void btnPost_Click(object sender, EventArgs e)
{
this.lblName.Text = Sanitizer.GetSafeHtmlFragment(txtName.Text);
}
这样对于特殊脚本的内容,会自动剔除过滤,而不会记录了,从而达到我们想要的目的。
4、IIS短文件/文件夹漏洞出现和修复
通过猜解,可能会得出一些重要的网页文件地址,如可能在/Pages/Security/下存在UserList.aspx和MenuList.aspx文件。
[建议措施]
1)禁止url中使用“~”或它的Unicode编码。
2)关闭windows的8.3格式功能。
修复可以参考下面的做法,或者找相关运维部门进行处理即可。
http://sebug.net/vuldb/ssvid-60252
http://webscan.360.cn/vul/view/vulid/1020
http://www.bitscn.com/network/security/200607/36285.html
5、系统敏感信息泄露出现和修复
如果页面继承一般的page,而没有进行Session判断,那么可能会被攻击者获取到页面地址,进而获取到例如用户名等重要数据的。
一般避免这种方式是对于一些需要登录才能访问到的页面,一定要进行Session判断,可能很容易给漏掉了。如我在Web框架里面,就是继承一个BasePage,BasePage 统一对页面进行一个登录判断。
public partial class UserList : BasePage
{
protected void Page_Load(object sender, EventArgs e)
{
...............
/// summary
/// BasePage 集成自权限基础抽象类FPage,其他页面则集成自BasePage
/// /summary
public class BasePage : FPage
{
/// summary
/// 默认构造函数
/// /summary
public BasePage()
{
this.IsFunctionControl = true;//默认页面启动权限认证
}
/// summary
/// 检查用户是否登录
/// /summary
private void CheckLogin()
{
if (string.IsNullOrEmpty(Permission.Identity))
{
string url = string.Format("{0}/Pages/CommonPage/Login.aspx?userRequest={1}",
Request.ApplicationPath.TrimEnd('/'), HttpUtility.UrlEncode(Request.Url.ToString()));
Response.Redirect(url);
}
}
/// summary
/// 覆盖HasFunction方法以使权限类判断是否具有某功能点的权限
/// /summary
/// param name="functionId"/param
/// returns/returns
protected override bool HasFunction(string functionId)
{
CheckLogin();
bool breturn = false;
try
{
breturn = Permission.HasFunction(functionId);
}
catch (Exception)
{
Helper.Alerts(this, "BasePage调用权限系统的HasFunction函数出错");
}
return breturn;
}
protected override void OnInit(EventArgs e)
{
Response.Cache.SetNoStore(); //清除缓存
base.OnInit(e);
CheckLogin();
}
否则可能会受到攻击,并通过抓包软件发现页面数据,获得一些重要的用户名或者相关信息。
还有一个值得注意的地方,就是一般这种不是很安全的网络,最好要求输入比较复杂一点的密码(强制要求),例如不能全部是数字密码或者不能是纯字符,对位数也要求多一点,因为很多人输入12345678,123456,123这样的密码,很容易被猜出来并登录系统,造成不必要的损失。
6、总结性建议
针对上面发现的问题,提出下面几条建议。
1)在服务器与网络的接口处配置防火墙,用于阻断外界用户对服务器的扫描和探测。
2)限制网站后台访问权限,如:禁止公网IP访问后台;禁止服务员使用弱口令。
3)对用户输入的数据进行全面安全检查或过滤,尤其注意检查是否包含SQL 或XSS特殊字符。这些检查或过滤必须在服务器端完成。
4)关闭windows的8.3格式功能。
5)限制敏感页面或目录的访问权限。