【分享】使用第三方上传插件的引起的页面权限处理

这段时间在discuz的门户上面加了一个批量上传的插件,来会搞了好几天 算是大功告成了,就是少了一个水印的功能。现在回顾下实现时候出现的一个问题,就是接收页面的权限问题。

  首先我们知道,在文件上传的时候,接收页面是不可以直接被访问的。如果可以直接被访问的话,入侵者就可以很简单的构造第三方的post工具借助千面获取到的特定字段进行贝本地的传输。可以上传任意的文件到服务器上面,当然即使你的服务器在接收页面的上做了验证文件有效,但是实用cookie的时候就有你郁闷的了。入侵者可以在上传一个合法的文件,然后进行post抓包。可以很简单的抓取到相关的信息,比如提交的页面,cookie,等等信息。这其中cookie一般是最危险的。入侵者在实用本地工具进行构造传输,将cookie也同样的提交上去,这样就可以很简单的进行数据欺骗。

  还有一种就是实用来源验证,说白了就是在接收页面做一个验证,验证接收的数据是来自指定的路径。这一般会涉及到另外的一个技术就是,$_SERVER['HTTP_REFERER'],可以在这里面进行获取来源的地址,但是这个函数有一定的局限性,比如没有设置,进行的隐藏表单提交,等都是获取不到任何的来源地址的。这里就要说到我遇到的问题了,因为flash是嵌入在html的一个执行文件,可以构造响应的表单进行传输,但是如果你是flash的开发者,或者flash的上传页面提供第三方的接口供你来进行传输特征码,才可以进行有效的验证,更好的就是提供session的验证。但是目前我们实用的flash的第三方插件很少有提供很完美的这样的接口,而flash上传一大部分是构造好一个表单然后通过post的隐藏方式提交。说白了就是直接提交到你指定的url上面,跟不就谈不上是同一个会话机制了,所以session这东西就显得力不从心了。

  回过头来看下,我用的这个flash上传插件就很不幸的没有提供很好的加密解决方案,并且传输是直接的进行post隐藏式的提交,就相当于一个软件式的直接提交。既然要进行接收端的加密,又要保证在登录的时候可以正常进行提交,也要同时保证即使在登录状态下也不可以脱离本页面进行提交(如果可以脱离本页面的话,就出现了另外的一个漏洞,这个下面说)。

  显然session是不可以用的,因为是内部post隐藏提交,相当于构建多个表单进行多个页面弹出式的提交,这样根本就不可能传入session的信息,因为已经脱离了当前会话。

  而后我们想到cookie,但是又否决了,因为cookie的传输是相当不安全的,并且,在新的页面中这种cookie又是不可用的,果断放弃cookie验证。

  然后又想到了缓存文件,大家知道缓存文件是在页面被执行的时候进行的,但是这样的就出现一个问题:什么时候销毁或重写缓存的数据呢?上传的时候么?上传完毕后么?

    假设我们上传的时候进行缓存重写或者清空,这样下一个文件在提交的时候就不能进行了。

    假设我们在上传完毕后进行销毁,如果操作者在上传过程中死机了呢?这样缓存就无法进行更新了,这个时间就给黑客有了可趁之机。显然这又是不行的,并且缓存的读写频率很高的话会影响机器的硬盘性能。

  缓存行不通了,我们能不能直接自己来写一个临时文件进行保存呢?显然这也是不行的,这和缓存一样涉及到什么时候销毁什么时候进行重写?

  那么来源验证呢?千面我们说过flash在提交的时候相当于新开了一个浏览器,显然这也是不行的。

  那么到底我们因该采取什么样的方法来进行验证呢?我们不妨可以这样的想下,验证码是我们自己进行书写规则的,加密明文也是我们掌握的,我们和不利用我们这点来进行一个验证呢?即使入侵者知道特征码和加密后的文本,但是入侵者永远都不一定知道我们用的何种加密方式。我们可以模仿discuz中的加密方式,将一段字符结合随机数进行加密,这样即使入侵者知道我们的随机数,也知道我们的明文,但是却不知道我们真正加密的密码到底是什么!这就充分保证了密码的安全性。

  好了处理的思路有了,那就开始实施吧,首先我们在上传页面 homeP_eidtor.php 中书写上我们自己的加密方法,生成两个东西,一个是加密的随机码,一个是加密后的密码。 然后在接收页面中写上接收密码和随机码的东西,我们将真正的加密东西可以实用固定的,也可以实用缓存文件中的,因为缓存无论销毁和不销毁对我们的安全都是没有任何影响的。

  上面的原理如下图

  

这就是的实现思路。

好了,我们现在来解释下为什么要强调在登录状态也不可以脱离当前页面提交,原因其实很简单。试想:入侵者如果偶然获取到了管理员的帐户密码,然后就可以进行那个页面了,显然这时候就可以进行页面的提交了,如果说使用了第三方的工具进行提交的话,就会产生很大的问题咯。轻则会导致服务器臃肿,重则直接提权服务器。当然这点有点多虑了,但是为了以防万一最好家一点提交页面特有的东西提交到接收页面上去。最好使用比较常见的一些字段信息,这会被很多的入侵者所忽略。如果比较醒目的话就不好了。。呵呵

posted @ 2012-11-17 00:45  阿夏  阅读(343)  评论(0编辑  收藏  举报