1
0
Fork 0
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:
Mzhelskiy Maxim 2013-03-21 20:03:00 +07:00
parent 8f721b320d
commit 83c1558738
4 changed files with 163 additions and 3 deletions

View file

@ -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(

View file

@ -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);

Binary file not shown.

View file

@ -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();