基于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 SQL之where语句生成器
Mar 24 PHP
PHP 观察者模式的实现代码
May 10 PHP
Parse正式发布开源PHP SDK
Aug 11 PHP
php实现计数器方法小结
Jan 05 PHP
PHP使用JSON和将json还原成数组
Feb 12 PHP
Smarty中的注释和截断功能介绍
Apr 09 PHP
thinkPHP中create方法与令牌验证实例浅析
Dec 08 PHP
DWZ+ThinkPHP开发时遇到的问题分析
Dec 12 PHP
Laravel框架分页实现方法分析
Jun 12 PHP
PHP模型Model类封装数据库操作示例
Mar 14 PHP
Yii2处理密码加密及验证的方法
May 12 PHP
php封装的page分页类完整实例代码
Feb 01 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
Windows IIS PHP 5.2 安装与配置方法
2009/06/08 PHP
使用PHP遍历文件夹与子目录的函数代码
2011/09/26 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
2016/03/09 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
JScript中使用ADODB.Stream判断文件编码的代码
2008/06/09 Javascript
关于IE7 IE8弹出窗口顶上
2008/12/22 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
jquery动态改变form属性提交表单
2014/06/03 Javascript
js实现Select列表内容自动滚动效果代码
2015/08/20 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
JS简单生成由字母数字组合随机字符串示例
2018/05/25 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
Vue结合路由配置递归实现菜单栏功能
2020/06/16 Javascript
JS删除对象中某一属性案例详解
2020/09/08 Javascript
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
python实现多线程采集的2个代码例子
2014/07/07 Python
python对字典进行排序实例
2014/09/25 Python
python3.x 将byte转成字符串的方法
2018/07/17 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
Django框架HttpRequest对象用法实例分析
2019/11/01 Python
在Python中预先初始化列表内容和长度的实现
2019/11/28 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
CSS中的字体大小设置属性总结
2016/05/24 HTML / CSS
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
总监职责范文
2013/11/09 职场文书
会计系个人求职信范文分享
2013/12/20 职场文书
英文求职信写作小建议
2014/02/16 职场文书
开业主持词
2014/03/21 职场文书
餐厅保洁员岗位职责
2015/04/10 职场文书
2015年法律事务部工作总结
2015/07/27 职场文书