%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/security/classes/general/tests/ |
| Current File : /home/bitrix/www/bitrix/modules/security/classes/general/tests/site_configuration.php |
<?
use Bitrix\Main\SystemException;
/**
* Bitrix Framework
* @package bitrix
* @subpackage security
* @copyright 2001-2013 Bitrix
*/
/**
* Class CSecuritySiteConfigurationTest
* @since 12.5.0
*/
class CSecuritySiteConfigurationTest
extends CSecurityBaseTest
{
protected $internalName = "SiteConfigurationTest";
protected $tests = array(
"securityLevel" => array(
"method" => "checkSecurityLevel"
),
"errorReporting" => array(
"method" => "checkErrorReporting",
"base_message_key" => "SECURITY_SITE_CHECKER_ERROR_REPORTING",
"critical" => CSecurityCriticalLevel::MIDDLE
),
"exceptionDebug" => array(
"method" => "checkExceptionDebug",
"base_message_key" => "SECURITY_SITE_CHECKER_EXCEPTION_DEBUG",
"critical" => CSecurityCriticalLevel::HIGHT
),
"dbDebug" => array(
"method" => "checkDbDebug",
"base_message_key" => "SECURITY_SITE_CHECKER_DB_DEBUG",
"critical" => CSecurityCriticalLevel::HIGHT
),
"dbPassword" => array(
"method" => "checkDbPassword"
),
"scriptExtension" => array(
"method" => "checkScriptExtension"
),
"modulesVersion" => array(
"method" => "checkModulesVersion"
)
);
protected static $expectedScriptExtensions = "php,php3,php4,php5,php6,phtml,pl,asp,aspx,cgi,dll,exe,ico,shtm,shtml,fcg,fcgi,fpl,asmx,pht,py,psp";
public function __construct()
{
IncludeModuleLangFile(__FILE__);
}
/**
* Check if saved script file extension is up to date
*/
protected function checkScriptExtension()
{
$actualExtensions = getScriptFileExt();
$missingExtensions = array_diff(
explode(",", self::$expectedScriptExtensions),
$actualExtensions
);
if(!empty($missingExtensions))
{
$this->addUnformattedDetailError(
"SECURITY_SITE_CHECKER_DANGER_EXTENSIONS",
CSecurityCriticalLevel::HIGHT,
getMessage("SECURITY_SITE_CHECKER_DANGER_EXTENSIONS_ADDITIONAL", array(
"#EXPECTED#" => self::$expectedScriptExtensions,
"#ACTUAL#" => join(",", $actualExtensions),
"#MISSING#" => join(",", $missingExtensions)
))
);
return self::STATUS_FAILED;
}
return self::STATUS_PASSED;
}
protected function checkSecurityLevel()
{
$isFailed = false;
if(!CSecurityFilter::IsActive())
{
$this->addUnformattedDetailError("SECURITY_SITE_CHECKER_WAF_OFF", CSecurityCriticalLevel::HIGHT);
$isFailed = true;
}
if(!CSecurityRedirect::IsActive())
{
$this->addUnformattedDetailError("SECURITY_SITE_CHECKER_REDIRECT_OFF", CSecurityCriticalLevel::MIDDLE);
$isFailed = true;
}
$adminPolicy = self::AdminPolicyLevel();
if($adminPolicy != "high")
{
$this->addUnformattedDetailError(
"SECURITY_SITE_CHECKER_ADMIN_SECURITY_LEVEL",
$adminPolicy == "middle" ? CSecurityCriticalLevel::LOW : CSecurityCriticalLevel::HIGHT
);
$isFailed = true;
}
if($isFailed)
return self::STATUS_FAILED;
else
return self::STATUS_PASSED;
}
/**
* Return true if debug = off
*
* @return bool
* @since 14.0.0
*/
protected function checkDbDebug()
{
/** @global CDataBase $DB */
global $DB;
if($DB->debug)
return self::STATUS_FAILED;
else
return self::STATUS_PASSED;
}
/**
* Return true if error_reporting = 0
*
* @return bool
* @since 14.0.0
*/
protected function checkErrorReporting()
{
$validErrorReporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR|E_PARSE;
if (
COption::GetOptionInt("main", "error_reporting", $validErrorReporting) != $validErrorReporting
&& COption::GetOptionInt("main","error_reporting","") != 0
)
return self::STATUS_FAILED;
else
return self::STATUS_PASSED;
}
/**
* Return true if exception_handling debug = false
*
* @return bool
* @since 14.0.0
*/
protected function checkExceptionDebug()
{
$exceptionConfig = \Bitrix\Main\Config\Configuration::getValue('exception_handling');
if(
is_array($exceptionConfig)
&& isset($exceptionConfig['debug'])
&& $exceptionConfig['debug']
)
return self::STATUS_FAILED;
else
return self::STATUS_PASSED;
}
/**
* Return true if module updates available
*
* @return bool
* @since 14.0.2
*/
protected function checkModulesVersion()
{
try
{
$updates = static::getAvailableUpdates();
if(!empty($updates))
{
$this->addUnformattedDetailError(
"SECURITY_SITE_CHECKER_MODULES_VERSION",
CSecurityCriticalLevel::HIGHT,
getMessage("SECURITY_SITE_CHECKER_MODULES_VERSION_ARRITIONAL", array(
"#MODULES#" => nl2br(htmlspecialcharsbx(join("\n", $updates)))
))
);
return self::STATUS_FAILED;
}
}
catch (SystemException $e)
{
$this->addUnformattedDetailError("SECURITY_SITE_CHECKER_MODULES_VERSION_ERROR", CSecurityCriticalLevel::HIGHT);
return self::STATUS_FAILED;
}
return self::STATUS_PASSED;
}
protected function checkDbPassword()
{
/** @global CDataBase $DB */
global $DB;
$password = $DB->DBPassword;
$sign = ",.#!*%$:-^@{}[]()'\"-+=<>?`&;";
$dit = "1234567890";
if(trim($password) == "")
{
$this->addUnformattedDetailError("SECURITY_SITE_CHECKER_DB_EMPTY_PASS", CSecurityCriticalLevel::HIGHT);
}
else
{
if($password == strtolower($password))
{
$this->addUnformattedDetailError("SECURITY_SITE_CHECKER_DB_SAME_REGISTER_PASS", CSecurityCriticalLevel::HIGHT);
}
if(strpbrk($password, $sign) === false)
{
$this->addUnformattedDetailError("SECURITY_SITE_CHECKER_DB_NO_SIGN_PASS", CSecurityCriticalLevel::HIGHT);
}
if(strpbrk($password, $dit) === false)
{
$this->addUnformattedDetailError("SECURITY_SITE_CHECKER_DB_NO_DIT_PASS", CSecurityCriticalLevel::HIGHT);
}
if (strlen($password)<8)
{
$this->addUnformattedDetailError("SECURITY_SITE_CHECKER_DB_MIN_LEN_PASS", CSecurityCriticalLevel::HIGHT);
}
}
}
/**
* @since 14.0.7
* @return array
* @throws Bitrix\Main\SystemException
*/
protected static function getAvailableUpdates()
{
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/classes/general/update_client.php');
$errors = null;
$installedModules = CUpdateClient::GetCurrentModules($errors);
if ($errors !== null)
throw new SystemException($errors);
$stableVersionsOnly = COption::GetOptionString('main', 'stable_versions_only', 'Y');
$errors = null;
$updateList = CUpdateClient::GetUpdatesList($errors, LANG, $stableVersionsOnly);
if ($errors !== null)
throw new SystemException($errors);
if (
!isset($updateList['MODULES'])
|| !is_array($updateList['MODULES'])
|| !isset($updateList['MODULES'][0]['#'])
)
{
throw new SystemException('Empty update modules list');
}
$result = array();
if (!$updateList['MODULES'][0]['#'])
{
return $result;
}
if (
!isset($updateList['MODULES'][0]['#']['MODULE'])
|| !is_array($updateList['MODULES'][0]['#']['MODULE'])
)
{
throw new SystemException('Empty update module list');
}
foreach ($updateList['MODULES'][0]['#']['MODULE'] as $module)
{
if (array_key_exists($module['@']['ID'], $installedModules))
$result[] = $module['@']['ID'];
}
return $result;
}
/**
* @return string
*/
protected static function AdminPolicyLevel()
{
$arGroupPolicy = array(
"parent" => Array(
"SESSION_TIMEOUT" => "",
"SESSION_IP_MASK" => "",
"MAX_STORE_NUM" => "",
"STORE_IP_MASK" => "",
"STORE_TIMEOUT" => "",
"CHECKWORD_TIMEOUT" => "",
"PASSWORD_LENGTH" => "",
"PASSWORD_UPPERCASE" => "N",
"PASSWORD_LOWERCASE" => "N",
"PASSWORD_DIGITS" => "N",
"PASSWORD_PUNCTUATION" => "N",
"LOGIN_ATTEMPTS" => "",
),
"low" => Array(
"SESSION_TIMEOUT" => 30, //minutes
"SESSION_IP_MASK" => "0.0.0.0",
"MAX_STORE_NUM" => 20,
"STORE_IP_MASK" => "255.0.0.0",
"STORE_TIMEOUT" => 60*24*93, //minutes
"CHECKWORD_TIMEOUT" => 60*24*185, //minutes
"PASSWORD_LENGTH" => 6,
"PASSWORD_UPPERCASE" => "N",
"PASSWORD_LOWERCASE" => "N",
"PASSWORD_DIGITS" => "N",
"PASSWORD_PUNCTUATION" => "N",
"LOGIN_ATTEMPTS" => 0,
),
"middle" => Array(
"SESSION_TIMEOUT" => 20, //minutes
"SESSION_IP_MASK" => "255.255.0.0",
"MAX_STORE_NUM" => 10,
"STORE_IP_MASK" => "255.255.0.0",
"STORE_TIMEOUT" => 60*24*30, //minutes
"CHECKWORD_TIMEOUT" => 60*24*1, //minutes
"PASSWORD_LENGTH" => 8,
"PASSWORD_UPPERCASE" => "Y",
"PASSWORD_LOWERCASE" => "Y",
"PASSWORD_DIGITS" => "Y",
"PASSWORD_PUNCTUATION" => "N",
"LOGIN_ATTEMPTS" => 0,
),
"high" => Array(
"SESSION_TIMEOUT" => 15, //minutes
"SESSION_IP_MASK" => "255.255.255.255",
"MAX_STORE_NUM" => 1,
"STORE_IP_MASK" => "255.255.255.255",
"STORE_TIMEOUT" => 60*24*3, //minutes
"CHECKWORD_TIMEOUT" => 60, //minutes
"PASSWORD_LENGTH" => 10,
"PASSWORD_UPPERCASE" => "Y",
"PASSWORD_LOWERCASE" => "Y",
"PASSWORD_DIGITS" => "Y",
"PASSWORD_PUNCTUATION" => "Y",
"LOGIN_ATTEMPTS" => 3,
),
);
$arAdminPolicy = CUser::GetGroupPolicy(1);
$level = 'high';
if (is_array($arGroupPolicy))
{
foreach($arGroupPolicy['parent'] as $key => $value)
{
$el2_value = $arAdminPolicy[$key];
$el2_checked = $arAdminPolicy[$key] === "Y";
switch($key)
{
case "SESSION_TIMEOUT":
case "MAX_STORE_NUM":
case "STORE_TIMEOUT":
case "CHECKWORD_TIMEOUT":
if(intval($el2_value) <= intval($arGroupPolicy['high'][$key]))
$clevel = 'high';
elseif(intval($el2_value) <= intval($arGroupPolicy['middle'][$key]))
$clevel = 'middle';
else
$clevel = 'low';
break;
case "PASSWORD_LENGTH":
if(intval($el2_value) >= intval($arGroupPolicy['high'][$key]))
$clevel = 'high';
elseif(intval($el2_value) >= intval($arGroupPolicy['middle'][$key]))
$clevel = 'middle';
else
$clevel = 'low';
break;
case "LOGIN_ATTEMPTS":
if(intval($el2_value) > 0)
{
if(intval($el2_value) <= intval($arGroupPolicy['high'][$key]))
$clevel = 'high';
elseif(intval($el2_value) <= intval($arGroupPolicy['middle'][$key]))
$clevel = 'middle';
else
$clevel = 'low';
}
else
{
if(intval($arGroupPolicy['high'][$key]) <= 0)
$clevel = 'high';
elseif(intval($arGroupPolicy['middle'][$key]) <= 0)
$clevel = 'middle';
else
$clevel = 'low';
}
break;
case "PASSWORD_UPPERCASE":
case "PASSWORD_LOWERCASE":
case "PASSWORD_DIGITS":
case "PASSWORD_PUNCTUATION":
if($el2_checked)
{
if($arGroupPolicy['high'][$key] == 'Y')
$clevel = 'high';
elseif($arGroupPolicy['middle'][$key] == 'Y')
$clevel = 'middle';
else
$clevel = 'low';
}
else
{
if($arGroupPolicy['high'][$key] == 'N')
$clevel = 'high';
elseif($arGroupPolicy['middle'][$key] == 'N')
$clevel = 'middle';
else
$clevel = 'low';
}
break;
case "SESSION_IP_MASK":
case "STORE_IP_MASK":
$gp_ip = ip2long($el2_value);
$high_ip = ip2long($arGroupPolicy['high'][$key]);
$middle_ip = ip2long($arGroupPolicy['middle'][$key]);
if(($gp_ip & $high_ip) == (0xFFFFFFFF & $high_ip))
$clevel = 'high';
elseif(($gp_ip & $middle_ip) == (0xFFFFFFFF & $middle_ip))
$clevel = 'middle';
else
$clevel = 'low';
break;
default:
$clevel = 'low';
break;
}
if($clevel == 'low')
$level = $clevel;
elseif($clevel == 'middle' && $level == 'high')
$level = $clevel;
}
}
return $level;
}
}