Server IP : 192.185.129.71 / Your IP : 18.117.244.233 Web Server : Apache System : Linux bh-ht-3.webhostbox.net 4.19.286-203.ELK.el7.x86_64 #1 SMP Wed Jun 14 04:33:55 CDT 2023 x86_64 User : svymadmin ( 4072) PHP Version : 7.4.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON Directory (0755) : /home4/svymadmin/public_html/vivekaexcel.edu.in/bkp/application/core/ |
[ Home ] | [ C0mmand ] | [ Upload File ] |
---|
<?php defined('BASEPATH') or exit('No direct script access allowed'); class App_Security extends CI_Security { /** * CSRF Verify * * @return CI_Security */ public function csrf_verify() { // If it's not a POST request we will set the CSRF cookie if (strtoupper($_SERVER['REQUEST_METHOD']) !== 'POST') { return $this->csrf_set_cookie(); } $exclude_uris = hooks()->apply_filters( 'csrf_exclude_uris', config_item('csrf_exclude_uris') ); // Check if URI has been whitelisted from CSRF checks if ($exclude_uris) { $uri = load_class('URI', 'core'); foreach ($exclude_uris as $excluded) { if (preg_match('#^' . $excluded . '$#i' . (UTF8_ENABLED ? 'u' : ''), $uri->uri_string())) { return $this; } } } // Check CSRF token validity, but don't error on mismatch just yet - we'll want to regenerate $valid = isset($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]) && is_string($_POST[$this->_csrf_token_name]) && is_string($_COOKIE[$this->_csrf_cookie_name]) && hash_equals($_POST[$this->_csrf_token_name], $_COOKIE[$this->_csrf_cookie_name]); // We kill this since we're done and we don't want to pollute the _POST array unset($_POST[$this->_csrf_token_name]); // Regenerate on every submission? if (config_item('csrf_regenerate')) { // Nothing should last forever unset($_COOKIE[$this->_csrf_cookie_name]); $this->_csrf_hash = null; } $this->_csrf_set_hash(); $this->csrf_set_cookie(); if ($valid !== true) { $this->csrf_show_error(); } log_message('info', 'CSRF token verified'); return $this; } /** * Show CSRF Error * * @return void */ public function csrf_show_error() { $isAjax = (! empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest'); if ($isAjax) { header($_SERVER['SERVER_PROTOCOL'] . ' 419 Page Expired'); die; } // parent::csrf_show_error(); $heading = ' 419 Page Expired!'; $message = 'Sorry, the page has expired, return to previous page and refresh to continue.'; show_error($message, 403, $heading); } public function xss_clean($str, $is_image = false) { // Is the string an array? if (is_array($str)) { foreach ($str as $key => &$value) { $str[$key] = $this->xss_clean($value); } return $str; } // Remove Invisible Characters $str = remove_invisible_characters($str); /* * URL Decode * * Just in case stuff like this is submitted: * * <a href="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">Google</a> * * Note: Use rawurldecode() so it does not remove plus signs */ if (stripos($str, '%') !== false) { // CUSTOM CODE $search = ['/\s%/i', '/%\s/i']; $replace = ['<p-tmp1></p-tmp1>', '<p-tmp2></p-tmp2>']; $str = preg_replace($search, $replace, $str); do { $oldstr = $str; $str = rawurldecode($str); $str = preg_replace_callback('#%(?:\s*[0-9a-f]){2,}#i', [$this, '_urldecodespaces'], $str); } while ($oldstr !== $str); unset($oldstr); // CUSTOM CODE $str = str_replace('<p-tmp1></p-tmp1>', ' %', $str); $str = str_replace('<p-tmp2></p-tmp2>', '% ', $str); } /* * Convert character entities to ASCII * * This permits our tests below to work reliably. * We only convert entities that are within tags since * these are the ones that will pose security problems. */ $str = preg_replace_callback("/[^a-z0-9>]+[a-z0-9]+=([\'\"]).*?\\1/si", [$this, '_convert_attribute'], $str); $str = preg_replace_callback('/<\w+.*/si', [$this, '_decode_entity'], $str); // Remove Invisible Characters Again! $str = remove_invisible_characters($str); /* * Convert all tabs to spaces * * This prevents strings like this: ja vascript * NOTE: we deal with spaces between characters later. * NOTE: preg_replace was found to be amazingly slow here on * large blocks of data, so we use str_replace. */ $str = str_replace("\t", ' ', $str); // Capture converted string for later comparison $converted_string = $str; // Remove Strings that are never allowed $str = $this->_do_never_allowed($str); /* * Makes PHP tags safe * * Note: XML tags are inadvertently replaced too: * * <?xml * * But it doesn't seem to pose a problem. */ if ($is_image === true) { // Images have a tendency to have the PHP short opening and // closing tags every so often so we skip those and only // do the long opening tags. $str = preg_replace('/<\?(php)/i', '<?\\1', $str); } else { $str = str_replace(['<?', '?' . '>'], ['<?', '?>'], $str); } /* * Compact any exploded words * * This corrects words like: j a v a s c r i p t * These words are compacted back to their correct state. */ $words = [ 'javascript', 'expression', 'vbscript', 'jscript', 'wscript', 'vbs', 'script', 'base64', 'applet', 'alert', 'document', 'write', 'cookie', 'window', 'confirm', 'prompt', 'eval', ]; foreach ($words as $word) { $word = implode('\s*', str_split($word)) . '\s*'; // We only want to do this when it is followed by a non-word character // That way valid stuff like "dealer to" does not become "dealerto" $str = preg_replace_callback('#(' . substr($word, 0, -3) . ')(\W)#is', [$this, '_compact_exploded_words'], $str); } /* * Remove disallowed Javascript in links or img tags * We used to do some version comparisons and use of stripos(), * but it is dog slow compared to these simplified non-capturing * preg_match(), especially if the pattern exists in the string * * Note: It was reported that not only space characters, but all in * the following pattern can be parsed as separators between a tag name * and its attributes: [\d\s"\'`;,\/\=\(\x00\x0B\x09\x0C] * ... however, remove_invisible_characters() above already strips the * hex-encoded ones, so we'll skip them below. */ do { $original = $str; if (preg_match('/<a/i', $str)) { $str = preg_replace_callback('#<a(?:rea)?[^a-z0-9>]+([^>]*?)(?:>|$)#si', [$this, '_js_link_removal'], $str); } if (preg_match('/<img/i', $str)) { $str = preg_replace_callback('#<img[^a-z0-9]+([^>]*?)(?:\s?/?>|$)#si', [$this, '_js_img_removal'], $str); } if (preg_match('/script|xss/i', $str)) { $str = preg_replace('#</*(?:script|xss).*?>#si', '[removed]', $str); } // CUSTOM CODE if (preg_match('/marquee|xss/i', $str)) { $str = preg_replace('#</*(?:marquee|xss).*?>#si', '[removed]', $str); } } while ($original !== $str); unset($original); /* * Sanitize naughty HTML elements * * If a tag containing any of the words in the list * below is found, the tag gets converted to entities. * * So this: <blink> * Becomes: <blink> */ $pattern = '#' . '<((?<slash>/*\s*)((?<tagName>[a-z0-9]+)(?=[^a-z0-9]|$)|.+)' // tag start and name, followed by a non-tag character . '[^\s\042\047a-z0-9>/=]*' // a valid attribute character immediately after the tag would count as a separator // optional attributes . '(?<attributes>(?:[\s\042\047/=]*' // non-attribute characters, excluding > (tag close) for obvious reasons . '[^\s\042\047>/=]+' // attribute characters // optional attribute-value . '(?:\s*=' // attribute-value separator . '(?:[^\s\042\047=><`]+|\s*\042[^\042]*\042|\s*\047[^\047]*\047|\s*(?U:[^\s\042\047=><`]*))' // single, double or non-quoted value . ')?' // end optional attribute-value group . ')*)' // end optional attributes group . '[^>]*)(?<closeTag>\>)?#isS'; // Note: It would be nice to optimize this for speed, BUT // only matching the naughty elements here results in // false positives and in turn - vulnerabilities! do { $old_str = $str; $str = preg_replace_callback($pattern, [$this, '_sanitize_naughty_html'], $str); } while ($old_str !== $str); unset($old_str); /* * Sanitize naughty scripting elements * * Similar to above, only instead of looking for * tags it looks for PHP and JavaScript commands * that are disallowed. Rather than removing the * code, it simply converts the parenthesis to entities * rendering the code un-executable. * * For example: eval('some code') * Becomes: eval('some code') */ $str = preg_replace( '#(alert|prompt|confirm|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)\((.*?)\)#si', '\\1\\2(\\3)', $str ); // Same thing, but for "tag functions" (e.g. eval`some code`) // See https://github.com/bcit-ci/CodeIgniter/issues/5420 $str = preg_replace( '#(alert|prompt|confirm|cmd|passthru|eval|exec|expression|system|fopen|fsockopen|file|file_get_contents|readfile|unlink)(\s*)`(.*?)`#si', '\\1\\2`\\3`', $str ); // Final clean up // This adds a bit of extra precaution in case // something got through the above filters $str = $this->_do_never_allowed($str); /* * Images are Handled in a Special Way * - Essentially, we want to know that after all of the character * conversion is done whether any unwanted, likely XSS, code was found. * If not, we return TRUE, as the image is clean. * However, if the string post-conversion does not matched the * string post-removal of XSS, then it fails, as there was unwanted XSS * code found and removed/changed during processing. */ if ($is_image === true) { return ($str === $converted_string); } return $str; } /** * CSRF Set Cookie * * @codeCoverageIgnore * @return CI_Security */ public function csrf_set_cookie() { $expire = time() + $this->_csrf_expire; $secure_cookie = (bool) config_item('cookie_secure'); $samesite = config_item('sess_cookie_samesite'); $path = config_item('cookie_path'); $domain = config_item('cookie_domain'); if ($secure_cookie && ! is_https()) { return false; } if (PHP_VERSION_ID < 70300) { // In PHP < 7.3.0, there is a "hacky" way to set the samesite parameter $samesite = ''; if (! empty($samesite)) { $samesite = '; samesite=' . $samesite; } setcookie($this->_csrf_cookie_name, $this->_csrf_hash, $expire, $path . $samesite, $domain, $secure_cookie, true); } else { // PHP 7.3 adds another function signature allowing setting of samesite $params = [ 'expires' => $expire, 'path' => $path, 'domain' => $domain, 'secure' => $secure_cookie, 'httponly' => true, // Enforce HTTP only cookie for security ]; if (! empty($samesite)) { $params['samesite'] = $samesite; } setcookie($this->_csrf_cookie_name, $this->_csrf_hash, $params); } log_message('info', 'CSRF cookie sent'); return $this; } }