基于Discuz security.inc.php代码的深入分析


Posted in PHP onJune 03, 2013

代码如下所示:

<?php/*
[Discuz!] (C)2001-2009 Comsenz Inc.
This is NOT a freeware, use is subject to license terms
$Id: security.inc.php 16688 2008-11-14 06:41:07Z cnteacher $
*/
//如果没有设定 IN_DISCUZ ,则访问出错
if(!defined('IN_DISCUZ')) {
exit('Access Denied');
}
// 使用位移  $attackevasive 来设定 论坛防御级别 ,如果是 1 或者是 4 的话, 1=cookie 刷新限制 , 4=二次请求
// 读取上次时间到当前存放cookies数组,并将现在时间放置cookies
// 将$_DCOOKIE['lastrequest'] 不断加密 存放last访问时间到 lastrequest_cookies
if($attackevasive & 1 || $attackevasive & 4) {
$_DCOOKIE['lastrequest'] = authcode($_DCOOKIE['lastrequest'], 'DECODE');
dsetcookie('lastrequest', authcode($timestamp, 'ENCODE'), $timestamp + 816400, 1, true);
}
//如果确认被攻击,则展示提示语 1
if($attackevasive & 1) {
if($timestamp - $_DCOOKIE['lastrequest'] < 1) {
securitymessage('attachsave_1_subject', 'attachsave_1_message');
}
}
 
//如检查到 HTTP_X_FORWARDED_FOR 有以下 参数 ,将提示 使用代理
if(($attackevasive & 2) && ($_SERVER['HTTP_X_FORWARDED_FOR'] ||
$_SERVER['HTTP_VIA'] || $_SERVER['HTTP_PROXY_CONNECTION'] ||
$_SERVER['HTTP_USER_AGENT_VIA'] || $_SERVER['HTTP_CACHE_INFO'] ||
$_SERVER['HTTP_PROXY_CONNECTION'])) {
securitymessage('attachsave_2_subject', 'attachsave_2_message', FALSE);
}
//如果在限定的时间内访问多次,将判断为二次请求
if($attackevasive & 4) {
if(empty($_DCOOKIE['lastrequest']) || $timestamp - $_DCOOKIE['lastrequest'] > 300) {
securitymessage('attachsave_4_subject', 'attachsave_4_message');
}
}
 
//如果需要回答问题,则判断为8
if($attackevasive & 8) {
list($questionkey, $questionanswer, $questiontime) = explode('|', authcode($_DCOOKIE['secqcode'], 'DECODE'));
include_once DISCUZ_ROOT.'./forumdata/cache/cache_secqaa.php';
if(!$questionanswer || !$questiontime || $_DCACHE['secqaa'][$questionkey]['answer'] != $questionanswer) {
if(empty($_POST['secqsubmit']) || (!empty($_POST['secqsubmit']) && $_DCACHE['secqaa'][$questionkey]['answer'] != md5($_POST['answer']))) {
$questionkey = array_rand($_DCACHE['secqaa']);
dsetcookie('secqcode', authcode($questionkey.'||'.$timestamp, 'ENCODE'), $timestamp + 816400, 1, true);
securitymessage($_DCACHE['secqaa'][$questionkey]['question'], '<input type="text" name="answer" size="8" maxlength="150" /><input class="button" type="submit" name="secqsubmit" value=" Submit " />', FALSE, TRUE);
} else {
dsetcookie('secqcode', authcode($questionkey.'|'.$_DCACHE['secqaa'][$questionkey]['answer'].'|'.$timestamp, 'ENCODE'), $timestamp + 816400, 1, true);
}
}
}
/**
 * 输出被攻击提示语言,如果是ajax,展示一??错误?樱 如果是?求, ?t展示错误?面
 * @param $subject
 * @param $message
 * @param $reload
 * @param $form
 * @return unknown_type
 */
function securitymessage($subject, $message, $reload = TRUE, $form = FALSE) {
$scuritylang = array(
'attachsave_1_subject' => '频繁刷新限制',
'attachsave_1_message' => '您访问本站速度过快或者刷新间隔时间小于两秒!请等待页面自动跳转 ...',
'attachsave_2_subject' => '代理服务器访问限制',
'attachsave_2_message' => '本站现在限制使用代理服务器访问,请去除您的代理设置,直接访问本站。',
'attachsave_4_subject' => '页面重载开启',
'attachsave_4_message' => '欢迎光临本站,页面正在重新载入,请稍候 ...'
);
$subject = $scuritylang[$subject] ? $scuritylang[$subject] : $subject;
$message = $scuritylang[$message] ? $scuritylang[$message] : $message;
if($_GET['inajax']) {
ajaxshowheader();
echo '<div id="attackevasive_1" class="popupmenu_option"><b style="font-size: 16px">'.$subject.'</b><br /><br />'.$message.'</div>';
ajaxshowfooter();
} else {
echo '<html>';
echo '<head>';
echo '<title>'.$subject.'</title>';
echo '</head>';
echo '<body bgcolor="#FFFFFF">';
if($reload) {
echo '<script language="JavaScript">';
echo 'function reload() {';
echo ' document.location.reload();';
echo '}';
echo 'setTimeout("reload()", 1001);';
echo '</script>';
}
if($form) {
echo '<form action="'.$_SERVER['PHP_SELF'].'" method="POST">';
}
echo '<table cellpadding="0" cellspacing="0" border="0" width="700" align="center" height="85%">';
echo '  <tr align="center" valign="middle">';
echo '    <td>';
echo '    <table cellpadding="10" cellspacing="0" border="0" width="80%" align="center" style="font-family: Verdana, Tahoma; color: #666666; font-size: 11px">';
echo '    <tr>';
echo '      <td valign="middle" align="center" bgcolor="#EBEBEB">';
echo '     <br /><br /> <b style="font-size: 16px">'.$subject.'</b> <br /><br />';
echo $message;
echo '        <br /><br />';
echo '      </td>';
echo '    </tr>';
echo '    </table>';
echo '    </td>';
echo '  </tr>';
echo '</table>';
if($form) {
echo '</form>';
}
echo '</body>';
echo '</html>';
}
exit();
}
 
function ajaxshowheader() {
global $charset, $inajax;
ob_end_clean();
@header("Expires: -1");
@header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);
@header("Pragma: no-cache");
header("Content-type: application/xml");
echo "<?xml version=/"1.0/" encoding=/"$charset/"?>/n<root><![CDATA[";
}
function ajaxshowfooter() {
echo ']]></root>';
}
?>
PHP 相关文章推荐
《PHP编程最快明白》第四讲:日期、表单接收、session、cookie
Nov 01 PHP
一个基于PDO的数据库操作类(新) 一个PDO事务实例
Jul 03 PHP
php对大文件进行读取操作的实现代码
Jan 23 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
php中数字0和空值的区别分析
Jun 05 PHP
PHP使用缓存即时输出内容(output buffering)的方法
Aug 03 PHP
PHP合并discuz用户脚本的方法
Aug 04 PHP
PHP中类的继承和用法实例分析
May 24 PHP
PHP类相关知识点实例总结
Sep 28 PHP
php中文字符串截取多种方法汇总
Oct 06 PHP
Laravel中的Blade模板引擎示例详解
Oct 10 PHP
Swoole 5将移除自动添加Event::wait()特性详解
Jul 10 PHP
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
Jun 03 #PHP
基于php在各种web服务器的运行模式详解
Jun 03 #PHP
PHP运行模式的深入理解
Jun 03 #PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 #PHP
ubuntu10.04配置 nginx+php-fpm模式的详解
Jun 03 #PHP
基于php-fpm的配置详解
Jun 03 #PHP
php的POSIX 函数以及进程测试的深入分析
Jun 03 #PHP
You might like
在VS2008中编译MYSQL5.1.48的方法
2010/07/03 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
2019/07/15 PHP
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
基于JavaScript实现新增内容滚动播放效果附完整代码
2017/08/24 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
react-native fetch的具体使用方法
2017/11/01 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
如何使用Jquery动态生成二级选项列表
2020/02/06 jQuery
python爬虫中多线程的使用详解
2019/09/23 Python
基于python操作ES实例详解
2019/11/16 Python
python模拟实现分发扑克牌
2020/04/22 Python
pycharm软件实现设置自动保存操作
2020/06/08 Python
优瑞自动咖啡机官网:Jura
2018/09/29 全球购物
英国领先的鞋类零售商和顶级品牌的官方零售商:Wynsors
2020/02/17 全球购物
教师档案管理制度
2014/01/23 职场文书
网络书店创业计划书
2014/02/07 职场文书
七一讲话心得体会
2014/09/05 职场文书
村干部四风问题整改措施
2014/09/30 职场文书
工程部文员岗位职责
2015/02/04 职场文书
中班上学期个人总结
2015/02/12 职场文书
化验员岗位职责
2015/02/14 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
2016年教师党员创先争优承诺书
2016/03/24 职场文书
2016年公共机构节能宣传周活动总结
2016/04/05 职场文书
Python函数中的不定长参数相关知识总结
2021/06/24 Python
MySQL中连接查询和子查询的问题
2021/09/04 MySQL
Android开发手册自定义Switch开关按钮控件
2022/06/10 Java/Android