bobbleee的个人博客分享 http://blog.sciencenet.cn/u/bobbleee 我是西安交通大学的一名教师,我领导了高性能建模与仿真小组

博文

计算机科学基础理论的威力

已有 6313 次阅读 2010-11-27 17:22 |个人分类:未分类|系统分类:科研笔记| 正则表达式, 不插电的计算机

       近两周在学习《不插电的计算机-computer science unpluged》,其中有一个游戏活动名叫Treasure Hunt,通过该活动让学生(文化程度为小学生,年龄在9岁以上)了解有限状态机(FSA,finite-state automata)。

      《Computer science unpluged》这本书是新西兰CANTERBURY大学计算机科学与软件工程系的Tim Bell(现任系副主任,副教授)等人在1998年出版的一本旨在通过游戏来教授计算机科学的基本概念的在计算机教学方面极富创新意义的著作。其主要特点是可以面向所有年龄段的学生,从小学生到大学生;并且通过游戏来学计算机(即不插电,Computer science without a computer)。 其主要活动共有20个从信息的表示、算法、过程、难解性(Intractability)、密码学和人机交互五个方面介绍了计算机科学的20个基本知识。有兴趣的学生和老师可以访问其网站-http://csunplugged.org,该网站提供了丰富的教学资料。该项工作得到了卡耐基梅隆大学(CMU)、CANTERBURY大学及Google的支持。

       CMU的周以真教授在2006年提出“计算思维”的理念,后得到计算机界的广泛认同,美国国家科学基金会(NSF)在2008年开始了以“计算思维”为核心的重大基金资助计划CDI (Cyber-Enabled Discovery and Innovation,计算使能的科学发现与技术创新)。

       因此每个从事计算机科学教学的老师应用学习和研究计算思维这一课题,《不插电的计算机》是本有趣的入门教材。

      我在学习FSA的过程中,重新地将形式语言与自动机理论这门课复习了一遍。本科阶段学习这门课是20多年前的事,后来不用也基本忘的差不多了。我后来由于要讲授计算机系的一门研究生学位课程《程序言语理论与实现》,内容涉及到了文法方面的问题,其中讲到了正则式及FSA,对其在编译的构造方面的作用有了进一步,涉及到了理论与应用实践的结合,这样才对FSA的认识进了一步。但在编译实现时只是利用FSA来判定一个给定的串(单词,句子)是否合乎其文法(正则式)的规定。FSA分为确定性有穷自动机 (DFA) 和非确定性有穷自动机 (NFA) ,这两种自动机都可以判定正则式。NFA一个重要的性质大部分教材或任课教师并没有介绍,随着正则式被的应用日益广泛,尤其是应用于网页搜索(在网页中发现符合特定模式的文本)、XML文件的合法性判定等方面,目前大多语言C,PERL,Javascript都可支持正则式的,NFA的这一被遗忘的性质由显得如此重要。

        NFA在判定一个输入字符串用的是带回溯的算法,该算法与与对输入字符串中的每个字符最多计算一次的 DFA 不同,NFA 对输入字符串中的每个字符可能需要多次计算。回溯方法具有诸多优势,这样可以使NFA处理如"包含向后引用或捕获括号"等更复杂的正则表达式。它也具有一些缺点,因为其处理时间大大超过 DFA 的处理时间。这就是我上面提到的被遗忘的性质,与计算复杂度有关的性质。即该回溯算法在最坏的情况下,处理时间实际上相当于输入字符串中字符数的指数,这意味着,向字符串中增加一个字符串就会使处理时间翻倍。

       因此编写不严谨的正则表达式可能会受到攻击,以致计算相对较短的攻击字符串(少于 50 个字符)需要数小时或更长时间。此项性质被用来进行网络拒绝服务(DOS)攻击,称之为Regular expression Denial of Service - ReDoS ,成为目前网络攻击的一个重要形式。引用http://www.owasp.org的一个例子如下,经常有如下代码

String userName = textBox1.Text;
String password = textBox2.Text;
Regex testPassword = new Regex(userName);
Match match = testPassword.Match(password);
if (match.Success)
{
    MessageBox.Show("Do not include name in password.");
}
else
{
    MessageBox.Show("Good password.");
}

保障用户输入的口令不包括用户输入的用户名,以增加密码的强度,如果攻击者输入了^(([a-z])+.)+[A-Z]([a-z])+$为用户名,输入aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa! 为口令,则程序挂起。

     为此,10月份微软发布了Regez Fuzzer的一款免费工具,帮助程序员测试易受拒绝服务攻击的正则式,检查其构造的正则式是否容易引起拒绝服务攻击。

           写到此处心中不禁感慨:计算机科学的基本概念多么重要!体会到计算机科学基础理论的威力!

 

       在学习CS-unplugged的Treasure Hunt活动时发现原文中的一个小的错误,原文是:“the first two
coin tosses of every group of three will be the same. Every third toss is completely predictable!
(You can see this from the sequence too: every third toss, starting with the second symbol in the
sequence, is a copy of the previous one.)”。文中两处Every Third应是Every Second,second symbol应是 first symbol。这样才正确。From the FSA in that book the Regular Expression of coin-tossing machine is ((hh)|(tt)(h|t))*,the third one is random and does not depend on previous.

        另外Treasure Hunt活动应强调串的合法性检验,而不强调从起点到终点的最短路径的选择问题(优化问题),这不是FSA要考虑的,而在Treasure Hunt活动很容易变成谁最先到达Treasure岛的优化问题。

 

           最后给几个常用正则式: 

E-mail地址 ^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$
URL ^http://[A-Za-z0-9]+.[A-Za-z0-9]+[/=?%-&_~`@[]':+!]*([^<>""])*$
邮政编码 ^[1-9]d{5}$
手机号码 ^(((d{2,3}))|(d{3}-))?13d{9}$

 

以下是几个病态正则式

  • (a+)+
  • ([a-zA-Z]+)*
  • (a|aa)+
  • (a|a?)+
  • (.*a){x} | for x > 10

 

 

 

 


             

 

 

 

 

 



https://wap.sciencenet.cn/blog-501599-384300.html


下一篇:第一门程序语言与Haskell
收藏 IP: .*| 热度|

0

发表评论 评论 (2 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-25 11:39

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部