📄 lib.php
字号:
global $CFG; $result = new object(); $result->issue = 'report_security_check_google'; $result->name = get_string('check_google_name', 'report_security'); $result->info = null; $result->details = null; $result->status = null; $result->link = "<a href=\"$CFG->wwwroot/$CFG->admin/settings.php?section=sitepolicies\">".get_string('sitepolicies', 'admin').'</a>'; if (empty($CFG->opentogoogle)) { $result->status = REPORT_SECURITY_OK; $result->info = get_string('check_google_ok', 'report_security'); } else if (!empty($CFG->guestloginbutton)) { $result->status = REPORT_SECURITY_INFO; $result->info = get_string('check_google_info', 'report_security'); } else { $result->status = REPORT_SECURITY_SERIOUS; $result->info = get_string('check_google_error', 'report_security'); } if ($detailed) { $result->details = get_string('check_google_details', 'report_security'); } return $result;}/** * Verifies email confirmation - spammers were changing mails very often * @param bool $detailed * @return object result */function report_security_check_emailchangeconfirmation($detailed=false) { global $CFG; $result = new object(); $result->issue = 'report_security_check_emailchangeconfirmation'; $result->name = get_string('check_emailchangeconfirmation_name', 'report_security'); $result->info = null; $result->details = null; $result->status = null; $result->link = "<a href=\"$CFG->wwwroot/$CFG->admin/settings.php?section=sitepolicies\">".get_string('sitepolicies', 'admin').'</a>'; if (empty($CFG->emailchangeconfirmation)) { if (empty($CFG->allowemailaddresses)) { $result->status = REPORT_SECURITY_WARNING; $result->info = get_string('check_emailchangeconfirmation_error', 'report_security'); } else { $result->status = REPORT_SECURITY_INFO; $result->info = get_string('check_emailchangeconfirmation_info', 'report_security'); } } else { $result->status = REPORT_SECURITY_OK; $result->info = get_string('check_emailchangeconfirmation_ok', 'report_security'); } if ($detailed) { $result->details = get_string('check_emailchangeconfirmation_details', 'report_security'); } return $result;}/** * Verifies if https enabled only secure cookies allowed, * this prevents redirections and sending of cookies to unsecure port. * @param bool $detailed * @return object result */function report_security_check_cookiesecure($detailed=false) { global $CFG; if (strpos($CFG->wwwroot, 'https://') !== 0) { return null; } $result = new object(); $result->issue = 'report_security_check_cookiesecure'; $result->name = get_string('check_cookiesecure_name', 'report_security'); $result->info = null; $result->details = null; $result->status = null; $result->link = "<a href=\"$CFG->wwwroot/$CFG->admin/settings.php?section=httpsecurity\">".get_string('httpsecurity', 'admin').'</a>'; if (empty($CFG->cookiesecure)) { $result->status = REPORT_SECURITY_SERIOUS; $result->info = get_string('check_cookiesecure_error', 'report_security'); } else { $result->status = REPORT_SECURITY_OK; $result->info = get_string('check_cookiesecure_ok', 'report_security'); } if ($detailed) { $result->details = get_string('check_cookiesecure_details', 'report_security'); } return $result;}/** * Verifies config.php is not writable anymore after installation, * config files were changed on several outdated server. * @param bool $detailed * @return object result */function report_security_check_configrw($detailed=false) { global $CFG; $result = new object(); $result->issue = 'report_security_check_configrw'; $result->name = get_string('check_configrw_name', 'report_security'); $result->info = null; $result->details = null; $result->status = null; $result->link = null; if (is_writable($CFG->dirroot.'/config.php')) { $result->status = REPORT_SECURITY_WARNING; $result->info = get_string('check_configrw_warning', 'report_security'); } else { $result->status = REPORT_SECURITY_OK; $result->info = get_string('check_configrw_ok', 'report_security'); } if ($detailed) { $result->details = get_string('check_configrw_details', 'report_security'); } return $result;}/** * Lists all users with XSS risk, it would be great to combine this with risk trusts in user table, * unfortunately nobody implemented user trust UI yet :-( * @param bool $detailed * @return object result */function report_security_check_riskxss($detailed=false) { global $CFG; $result = new object(); $result->issue = 'report_security_check_riskxss'; $result->name = get_string('check_riskxss_name', 'report_security'); $result->info = null; $result->details = null; $result->status = REPORT_SECURITY_WARNING; $result->link = null; $sqlfrom = "FROM (SELECT rcx.* FROM {$CFG->prefix}role_capabilities rcx JOIN {$CFG->prefix}capabilities cap ON (cap.name = rcx.capability AND ".sql_bitand('cap.riskbitmask', RISK_XSS)." <> 0) WHERE rcx.permission = ".CAP_ALLOW.") rc, {$CFG->prefix}context c, {$CFG->prefix}context sc, {$CFG->prefix}role_assignments ra, {$CFG->prefix}user u WHERE c.id = rc.contextid AND (sc.path = c.path OR sc.path LIKE ".sql_concat('c.path', "'/%'")." OR c.path LIKE ".sql_concat('sc.path', "'/%'").") AND u.id = ra.userid AND u.deleted = 0 AND ra.contextid = sc.id AND ra.roleid = rc.roleid"; $count = count_records_sql("SELECT COUNT(DISTINCT u.id) $sqlfrom"); $result->info = get_string('check_riskxss_warning', 'report_security', $count); if ($detailed) { $users = get_records_sql("SELECT DISTINCT u.id, u.firstname, u.lastname, u.picture, u.imagealt $sqlfrom"); foreach ($users as $uid=>$user) { $users[$uid] = fullname($user); } $users = implode(', ', $users); $result->details = get_string('check_riskxss_details', 'report_security', $users); } return $result;}/** * Verifies sanity of default user role. * @param bool $detailed * @return object result */function report_security_check_defaultuserrole($detailed=false) { global $CFG; $result = new object(); $result->issue = 'report_security_check_defaultuserrole'; $result->name = get_string('check_defaultuserrole_name', 'report_security'); $result->info = null; $result->details = null; $result->status = null; $result->link = "<a href=\"$CFG->wwwroot/$CFG->admin/settings.php?section=userpolicies\">".get_string('userpolicies', 'admin').'</a>';; if (!$default_role = get_record('role', 'id', $CFG->defaultuserroleid)) { $result->status = REPORT_SECURITY_WARNING; $result->info = get_string('check_defaultuserrole_notset', 'report_security'); $result->details = $result->info; return $result; } // first test if do anything enabled - that would be really crazy! $sql = "SELECT COUNT(DISTINCT rc.contextid) FROM {$CFG->prefix}role_capabilities rc WHERE rc.capability = 'moodle/site:doanything' AND rc.permission = ".CAP_ALLOW." AND rc.roleid = $default_role->id"; $anythingcount = count_records_sql($sql); // risky caps - usually very dangerous $sql = "SELECT COUNT(DISTINCT rc.contextid) FROM {$CFG->prefix}role_capabilities rc JOIN {$CFG->prefix}capabilities cap ON cap.name = rc.capability WHERE ".sql_bitand('cap.riskbitmask', (RISK_XSS | RISK_CONFIG | RISK_DATALOSS))." <> 0 AND rc.permission = ".CAP_ALLOW." AND rc.roleid = $default_role->id"; $riskycount = count_records_sql($sql); // default role can not have view cap in all courses - this would break moodle badly $viewcap = record_exists('role_capabilities', 'roleid', $default_role->id, 'permission', CAP_ALLOW, 'capability', 'moodle/course:view'); // it may have either no or 'user' legacy type - nothing else, or else it would break during upgrades badly $legacyok = false; $sql = "SELECT rc.capability, 1 FROM {$CFG->prefix}role_capabilities rc WHERE rc.capability LIKE 'moodle/legacy:%' AND rc.permission = ".CAP_ALLOW." AND rc.roleid = $default_role->id"; $legacycaps = get_records_sql($sql); if (!$legacycaps) { $legacyok = true; } else if (count($legacycaps) == 1 and isset($legacycaps['moodle/legacy:user'])) { $legacyok = true; } if ($anythingcount or $riskycount or $viewcap or !$legacyok) { $result->status = REPORT_SECURITY_CRITICAL; $result->info = get_string('check_defaultuserrole_error', 'report_security', format_string($default_role->name)); } else { $result->status = REPORT_SECURITY_OK; $result->info = get_string('check_defaultuserrole_ok', 'report_security'); } if ($detailed) { $result->details = get_string('check_defaultuserrole_details', 'report_security'); } return $result;}/** * Verifies sanity of guest role * @param bool $detailed * @return object result */function report_security_check_guestrole($detailed=false) { global $CFG; $result = new object(); $result->issue = 'report_security_check_guestrole'; $result->name = get_string('check_guestrole_name', 'report_security'); $result->info = null; $result->details = null; $result->status = null; $result->link = "<a href=\"$CFG->wwwroot/$CFG->admin/settings.php?section=userpolicies\">".get_string('userpolicies', 'admin').'</a>';; if (!$guest_role = get_record('role', 'id', $CFG->guestroleid)) { $result->status = REPORT_SECURITY_WARNING; $result->info = get_string('check_guestrole_notset', 'report_security'); $result->details = $result->info; return $result; } // first test if do anything enabled - that would be really crazy! $sql = "SELECT COUNT(DISTINCT rc.contextid) FROM {$CFG->prefix}role_capabilities rc WHERE rc.capability = 'moodle/site:doanything' AND rc.permission = ".CAP_ALLOW." AND rc.roleid = $guest_role->id"; $anythingcount = count_records_sql($sql); // risky caps - usually very dangerous $sql = "SELECT COUNT(DISTINCT rc.contextid) FROM {$CFG->prefix}role_capabilities rc JOIN {$CFG->prefix}capabilities cap ON cap.name = rc.capability WHERE ".sql_bitand('cap.riskbitmask', (RISK_XSS | RISK_CONFIG | RISK_DATALOSS))." <> 0 AND rc.permission = ".CAP_ALLOW." AND rc.roleid = $guest_role->id"; $riskycount = count_records_sql($sql); // it may have either no or 'guest' legacy type - nothing else, or else it would break during upgrades badly $legacyok = false; $sql = "SELECT rc.capability, 1 FROM {$CFG->prefix}role_capabilities rc WHERE rc.capability LIKE 'moodle/legacy:%' AND rc.permission = ".CAP_ALLOW." AND rc.roleid = $guest_role->id"; $legacycaps = get_records_sql($sql); if (!$legacycaps) { $legacyok = true; } else if (count($legacycaps) == 1 and isset($legacycaps['moodle/legacy:guest'])) { $legacyok = true; } if ($anythingcount or $riskycount or !$legacyok) { $result->status = REPORT_SECURITY_CRITICAL; $result->info = get_string('check_guestrole_error', 'report_security', format_string($guest_role->name)); } else { $result->status = REPORT_SECURITY_OK; $result->info = get_string('check_guestrole_ok', 'report_security'); } if ($detailed) { $result->details = get_string('check_guestrole_details', 'report_security'); } return $result;}/** * Verifies sanity of frontpage role * @param bool $detailed * @return object result */function report_security_check_frontpagerole($detailed=false) { global $CFG; $result = new object(); $result->issue = 'report_security_check_frontpagerole'; $result->name = get_string('check_frontpagerole_name', 'report_security'); $result->info = null; $result->details = null; $result->status = null; $result->link = "<a href=\"$CFG->wwwroot/$CFG->admin/settings.php?section=frontpagesettings\">".get_string('frontpagesettings','admin').'</a>';; if (!$frontpage_role = get_record('role', 'id', $CFG->defaultfrontpageroleid)) { $result->status = REPORT_SECURITY_INFO; $result->info = get_string('check_frontpagerole_notset', 'report_security'); $result->details = get_string('check_frontpagerole_details', 'report_security'); return $result; } // first test if do anything enabled - that would be really crazy! $sql = "SELECT COUNT(DISTINCT rc.contextid) FROM {$CFG->prefix}role_capabilities rc WHERE rc.capability = 'moodle/site:doanything'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -