mirror of
https://github.com/Oreolek/ifhub.club.git
synced 2024-04-28 23:19:21 +03:00
fix раскрытия путей и XSS
This commit is contained in:
parent
8f721b320d
commit
83c1558738
|
@ -75,6 +75,67 @@ return array(
|
|||
array('border'=>'#int','cellpadding'=>'#int','cellspacing'=>'#int','align'=>array('right', 'left', 'center'),'height'=>'#int','width'=>'#int')
|
||||
),
|
||||
),
|
||||
// допустимые комбинации значений у параметров
|
||||
'cfgSetTagParamCombination' => array(
|
||||
array(
|
||||
'param',
|
||||
'name',
|
||||
array(
|
||||
'allowScriptAccess' => array(
|
||||
'value'=>array('sameDomain'),
|
||||
),
|
||||
'movie' => array(
|
||||
'value'=>array('#domain'=>array('youtube.com','rutube.ru','vimeo.com')),
|
||||
),
|
||||
'align' => array(
|
||||
'value'=>array('bottom','middle','top','left','right'),
|
||||
),
|
||||
'base' => array(
|
||||
'value'=>true,
|
||||
),
|
||||
'bgcolor' => array(
|
||||
'value'=>true,
|
||||
),
|
||||
'border' => array(
|
||||
'value'=>true,
|
||||
),
|
||||
'devicefont' => array(
|
||||
'value'=>true,
|
||||
),
|
||||
'flashVars' => array(
|
||||
'value'=>true,
|
||||
),
|
||||
'hspace' => array(
|
||||
'value'=>true,
|
||||
),
|
||||
'quality' => array(
|
||||
'value'=>array('low','medium','high','autolow','autohigh','best'),
|
||||
),
|
||||
'salign' => array(
|
||||
'value'=>array('L','T','R','B','TL','TR','BL','BR'),
|
||||
),
|
||||
'scale' => array(
|
||||
'value'=>array('scale','showall','noborder','exactfit'),
|
||||
),
|
||||
'tabindex' => array(
|
||||
'value'=>true,
|
||||
),
|
||||
'title' => array(
|
||||
'value'=>true,
|
||||
),
|
||||
'type' => array(
|
||||
'value'=>true,
|
||||
),
|
||||
'vspace' => array(
|
||||
'value'=>true,
|
||||
),
|
||||
'wmode' => array(
|
||||
'value'=>array('window','opaque','transparent'),
|
||||
),
|
||||
),
|
||||
true, // Удалять тег, если нет основного значения параметра в списке комбинаций
|
||||
),
|
||||
),
|
||||
// Параметры тегов являющиеся обязательными
|
||||
'cfgSetTagParamsRequired' => array(
|
||||
array(
|
||||
|
|
89
engine/lib/external/Jevix/jevix.class.php
vendored
89
engine/lib/external/Jevix/jevix.class.php
vendored
|
@ -157,6 +157,7 @@ class Jevix{
|
|||
const TR_TAG_CALLBACK = 15; // Тег обрабатывается callback-функцией - в обработку уходит только контент тега(короткие теги не обрабатываются)
|
||||
const TR_TAG_BLOCK_TYPE = 16; // Тег после которого не нужна автоподстановка доп. <br>
|
||||
const TR_TAG_CALLBACK_FULL = 17; // Тег обрабатывается callback-функцией - в обработку уходит весь тег
|
||||
const TR_PARAM_COMBINATION = 18; // Проверка на возможные комбинации значений параметров тега
|
||||
|
||||
/**
|
||||
* Классы символов генерируются symclass.php
|
||||
|
@ -362,7 +363,46 @@ class Jevix{
|
|||
if(!isset($this->tagsRules[$tag])) throw new Exception("Тег $tag отсутствует в списке разрешённых тегов");
|
||||
$this->tagsRules[$tag][self::TR_TAG_CALLBACK_FULL] = $callback;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* КОНФИГУРАЦИЯ: Устанавливаем комбинации значений параметров для тега
|
||||
*
|
||||
* @param string $tag тег
|
||||
* @param string $param атрибут
|
||||
* @param array $aCombinations Список комбинаций значений. Пример: array('myvalue'=>array('attr1'=>array('one','two'),'attr2'=>'other'))
|
||||
* @param bool $bRemove Удаляеть тег или нет, если в списке нет значения основного атрибута
|
||||
*/
|
||||
function cfgSetTagParamCombination($tag, $param, $aCombinations,$bRemove=false){
|
||||
if(!isset($this->tagsRules[$tag])) throw new Exception("Tag $tag is missing in allowed tags list");
|
||||
|
||||
if(!isset($this->tagsRules[$tag][self::TR_PARAM_COMBINATION])) {
|
||||
$this->tagsRules[$tag][self::TR_PARAM_COMBINATION] = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Переводим в нижний регистр значений параметров
|
||||
* Ужасный код
|
||||
*/
|
||||
$aCombinationsResult=array();
|
||||
foreach($aCombinations as $k=>$aAttr) {
|
||||
$aAttrResult=array();
|
||||
foreach($aAttr as $kk => $mValue) {
|
||||
if (is_string($mValue)) {
|
||||
$mValue=mb_strtolower($mValue);
|
||||
} elseif (is_array($mValue)) {
|
||||
foreach($mValue as $kkk=>$vvv) {
|
||||
if (is_string($vvv)) {
|
||||
$mValue[$kkk]=mb_strtolower($vvv);
|
||||
}
|
||||
}
|
||||
}
|
||||
$aAttrResult[$kk]=$mValue;
|
||||
}
|
||||
$aCombinationsResult[mb_strtolower($k)]=$aAttrResult;
|
||||
}
|
||||
$this->tagsRules[$tag][self::TR_PARAM_COMBINATION][$param] = array('combination'=>$aCombinationsResult,'remove'=>$bRemove);
|
||||
}
|
||||
|
||||
/**
|
||||
* Автозамена
|
||||
*
|
||||
|
@ -1050,7 +1090,52 @@ class Jevix{
|
|||
if (!isset($tagRules[self::TR_TAG_IS_EMPTY]) or !$tagRules[self::TR_TAG_IS_EMPTY]) {
|
||||
if(!$short && $content == '') return '';
|
||||
}
|
||||
|
||||
|
||||
// Проверка на допустимые комбинации
|
||||
if (isset($tagRules[self::TR_PARAM_COMBINATION])) {
|
||||
$aRuleCombin=$tagRules[self::TR_PARAM_COMBINATION];
|
||||
$resParamsList=$resParams;
|
||||
foreach($resParamsList as $param => $value) {
|
||||
$value=mb_strtolower($value);
|
||||
if (isset($aRuleCombin[$param]['combination'][$value])) {
|
||||
foreach($aRuleCombin[$param]['combination'][$value] as $sAttr=>$mValue) {
|
||||
if (isset($resParams[$sAttr])) {
|
||||
$bOK=false;
|
||||
$sValueParam=mb_strtolower($resParams[$sAttr]);
|
||||
|
||||
if (is_string($mValue)) {
|
||||
if ($mValue==$sValueParam) {
|
||||
$bOK=true;
|
||||
}
|
||||
} elseif(is_array($mValue)) {
|
||||
if (isset($mValue['#domain']) and is_array($mValue['#domain'])) {
|
||||
if(!preg_match('/javascript:/ui', $sValueParam)) {
|
||||
foreach ($mValue['#domain'] as $sDomain) {
|
||||
$sDomain=preg_quote($sDomain);
|
||||
if (preg_match("@^(http|https|ftp)://([\w\d]+\.)?{$sDomain}/@ui",$sValueParam)) {
|
||||
$bOK=true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} elseif (in_array($sValueParam, $mValue)) {
|
||||
$bOK=true;
|
||||
}
|
||||
} elseif($mValue===true) {
|
||||
$bOK=true;
|
||||
}
|
||||
|
||||
if (!$bOK) {
|
||||
unset($resParams[$sAttr]);
|
||||
}
|
||||
}
|
||||
}
|
||||
} elseif(isset($aRuleCombin[$param]['remove']) and $aRuleCombin[$param]['remove']) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Если тег обрабатывает "полным" колбеком
|
||||
if (isset($tagRules[self::TR_TAG_CALLBACK_FULL])) {
|
||||
$text = call_user_func($tagRules[self::TR_TAG_CALLBACK_FULL], $tag, $resParams, $content);
|
||||
|
|
BIN
engine/lib/external/swfupload/swfupload.swf
vendored
BIN
engine/lib/external/swfupload/swfupload.swf
vendored
Binary file not shown.
|
@ -76,11 +76,25 @@ class ModuleSession extends Module {
|
|||
Config::Get('sys.session.host')
|
||||
);
|
||||
if(!session_id()) {
|
||||
/**
|
||||
* Попытка подменить идентификатор имени сессии через куку
|
||||
*/
|
||||
if (isset($_COOKIE[Config::Get ('sys.session.name')]) and !is_string($_COOKIE[Config::Get ('sys.session.name')])) {
|
||||
unset($_COOKIE[Config::Get ('sys.session.name')]);
|
||||
setcookie(Config::Get ('sys.session.name').'[]','',1,Config::Get('sys.cookie.path'),Config::Get('sys.cookie.host'));
|
||||
}
|
||||
/**
|
||||
* Попытка подменить идентификатор имени сессии в реквесте
|
||||
*/
|
||||
$aRequest=array_merge($_GET,$_POST); // Исключаем попадаение $_COOKIE в реквест
|
||||
if (@ini_get ('session.use_only_cookies') === "0" and isset($aRequest[Config::Get ('sys.session.name')]) and !is_string($aRequest[Config::Get ('sys.session.name')])) {
|
||||
session_name($this->GenerateId());
|
||||
}
|
||||
/**
|
||||
* Даем возможность флешу задавать id сессии
|
||||
*/
|
||||
$sUserAgent=isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : null;
|
||||
if ($sUserAgent and (in_array($sUserAgent,$this->aFlashUserAgent) or strpos($sUserAgent,"Adobe Flash Player")===0) and preg_match("/^[\w\d]{5,40}$/",getRequest('SSID'))) {
|
||||
if ($sUserAgent and (in_array($sUserAgent,$this->aFlashUserAgent) or strpos($sUserAgent,"Adobe Flash Player")===0) and is_string(getRequest('SSID')) and preg_match("/^[\w\d]{5,40}$/",getRequest('SSID'))) {
|
||||
session_id(getRequest('SSID'));
|
||||
} else {
|
||||
session_regenerate_id();
|
||||
|
|
Loading…
Reference in a new issue