基于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函数
Feb 16 PHP
PHP 反向排序和随机排序代码
Jun 30 PHP
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
Aug 21 PHP
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
Nov 02 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
Jul 05 PHP
对PHP新手的一些建议(PHP学习经验总结)
Aug 20 PHP
php程序内部post数据的方法
Mar 31 PHP
discuz图片顺序混乱解决方案
Jul 29 PHP
PHP使用mkdir创建多级目录的方法
Dec 22 PHP
Yii2汉字转拼音类的实例代码
Apr 18 PHP
PHP观察者模式定义与用法实例分析
Mar 22 PHP
php png失真的原因及解决办法
Oct 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来检测proxy
2006/10/09 PHP
php实现的三个常用加密解密功能函数示例
2017/11/06 PHP
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
2014/04/10 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
JS实现光滑展开合拢的菜单效果代码
2015/09/16 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
JavaScript面试题(指针、帽子和女朋友)
2016/11/23 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
2016/12/21 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
React服务端渲染(总结)
2017/07/01 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
2020/03/31 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
微信小程序scroll-view实现滚动到锚点左侧导航栏点餐功能(点击种类,滚动到锚点)
2020/06/11 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
2020/07/19 Javascript
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
python WindowsError的错误代码详解
2017/07/23 Python
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
2017/09/05 Python
Python中super函数用法实例分析
2019/03/18 Python
python pyinstaller 加载ui路径方法
2019/06/10 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
Python3 io文本及原始流I/O工具用法详解
2020/03/23 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
美国最大的珠宝首饰网上商城:Jewelry.com
2016/07/22 全球购物
成人毕业生自我鉴定
2013/10/18 职场文书
住宅使用说明书
2014/05/09 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
Django cookie和session的应用场景及如何使用
2021/04/29 Python
Python加密与解密模块hashlib与hmac
2022/06/05 Python