基于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简洁函数小结
Aug 12 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
Jun 03 PHP
PHP与javascript实现变量交互的示例代码
Jul 23 PHP
PHP计算2点经纬度之间的距离代码
Aug 12 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
Jul 25 PHP
php不使用copy()函数复制文件的方法
Mar 13 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
Dec 08 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
Sep 21 PHP
php基于curl实现的股票信息查询类实例
Nov 11 PHP
PHP检查网站是否宕机的方法示例
Jul 24 PHP
PHP基于curl模拟post提交json数据示例
Jun 22 PHP
PHP引擎php.ini参数优化深入讲解
Mar 24 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判断手机访问还是电脑访问示例分享
2014/01/20 PHP
php中array_unshift()修改数组key注意事项分析
2016/05/16 PHP
php使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
javascript 对表格的行和列都能加亮显示
2008/12/26 Javascript
Javascript select下拉框操作常用方法
2009/11/09 Javascript
javascript 鼠标拖动图标技术
2010/02/07 Javascript
在多个页面使用同一个HTML片段《续》
2011/03/04 Javascript
js中数组Array的一些常用方法总结
2013/08/12 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
nodejs入门教程二:创建一个简单应用示例
2017/04/24 NodeJs
VUE element-ui 写个复用Table组件的示例代码
2017/11/18 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
webpack external模块的具体使用
2018/03/10 Javascript
VUE 解决mode为history页面为空白的问题
2019/11/01 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
深入浅析Python中的yield关键字
2018/01/24 Python
python 公共方法汇总解析
2019/09/16 Python
Python利用matplotlib绘制折线图的新手教程
2020/11/05 Python
面向游戏玩家和书呆子的极客订阅盒:Loot Crate
2020/11/25 全球购物
双语教学实施方案
2014/03/23 职场文书
医学生自我鉴定范文
2014/03/26 职场文书
奠基仪式策划方案
2014/05/15 职场文书
工资收入证明
2014/10/07 职场文书
刑事上诉状范文
2015/05/22 职场文书
Matlab求解数组中的最大值及它所在的具体位置
2021/04/16 Python
对Keras自带Loss Function的深入研究
2021/05/25 Python
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers
Mysql 8.x 创建用户以及授予权限的操作记录
2022/04/18 MySQL