基于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 相关文章推荐
第七节--类的静态成员
Nov 16 PHP
PHP 第一节 php简介
Apr 28 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
May 09 PHP
PHP使用range协议实现输出文件断点续传代码实例
Jul 04 PHP
thinkphp浏览历史功能实现方法
Oct 29 PHP
php准确获取文件MIME类型的方法
Jun 17 PHP
基础的WordPress插件制作教程
Nov 24 PHP
php生成txt文件实例代码介绍
Apr 28 PHP
Yii统计不同类型邮箱数量的方法
Oct 18 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
Nov 04 PHP
php文件上传类的分享
Jul 06 PHP
总结PHP中初始化空数组的最佳方法
Feb 13 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
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
将Datatable转化成json发送前台实现思路
2013/09/06 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
JavaScript中实现依赖注入的思路分享
2015/01/15 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
jQuery简单操作cookie的插件实例
2016/01/13 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
jQuery对table表格进行增删改查
2020/12/22 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
详解JavaScript作用域和作用域链
2019/03/19 Javascript
Node.js中package.json中库的版本号(~和^)
2019/04/02 Javascript
node.js命令行教程图文详解
2019/05/27 Javascript
Python with用法实例
2015/04/14 Python
python psutil库安装教程
2018/03/19 Python
对numpy中布尔型数组的处理方法详解
2018/04/17 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
超实用的 30 段 Python 案例
2019/10/10 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
python中四舍五入的正确打开方式
2021/01/18 Python
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
软件测试工程师面试问题精选
2016/10/28 面试题
教师推荐信范文
2013/11/24 职场文书
二手书店创业计划书
2014/01/16 职场文书
医学专业自荐信
2014/06/14 职场文书
诚信考试标语
2014/06/24 职场文书
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
代领学位证书毕业证书委托书
2014/09/30 职场文书
2015年国庆节演讲稿范文
2015/07/30 职场文书
JVM之方法返回地址详解
2022/02/28 Java/Android
如何利用python创作字符画
2022/06/25 Python
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技