⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filterinput.php

📁 Joomla!是一套获得过多个奖项的内容管理系统(Content Management System, CMS)。Joomla!采用PHP+MySQL数据库开发
💻 PHP
📖 第 1 页 / 共 2 页
字号:
		$preTag		= null;		$postTag	= $source;		$currentSpace = false;		$attr = '';	 // moffats: setting to null due to issues in migration system - undefined variable errors		// Is there a tag? If so it will certainly start with a '<'		$tagOpen_start	= strpos($source, '<');		while ($tagOpen_start !== false)		{			// Get some information about the tag we are processing			$preTag			.= substr($postTag, 0, $tagOpen_start);			$postTag		= substr($postTag, $tagOpen_start);			$fromTagOpen	= substr($postTag, 1);			$tagOpen_end	= strpos($fromTagOpen, '>');			// Let's catch any non-terminated tags and skip over them			if ($tagOpen_end === false) {				$postTag		= substr($postTag, $tagOpen_start +1);				$tagOpen_start	= strpos($postTag, '<');				continue;			}			// Do we have a nested tag?			$tagOpen_nested = strpos($fromTagOpen, '<');			$tagOpen_nested_end	= strpos(substr($postTag, $tagOpen_end), '>');			if (($tagOpen_nested !== false) && ($tagOpen_nested < $tagOpen_end)) {				$preTag			.= substr($postTag, 0, ($tagOpen_nested +1));				$postTag		= substr($postTag, ($tagOpen_nested +1));				$tagOpen_start	= strpos($postTag, '<');				continue;			}			// Lets get some information about our tag and setup attribute pairs			$tagOpen_nested	= (strpos($fromTagOpen, '<') + $tagOpen_start +1);			$currentTag		= substr($fromTagOpen, 0, $tagOpen_end);			$tagLength		= strlen($currentTag);			$tagLeft		= $currentTag;			$attrSet		= array ();			$currentSpace	= strpos($tagLeft, ' ');			// Are we an open tag or a close tag?			if (substr($currentTag, 0, 1) == '/') {				// Close Tag				$isCloseTag		= true;				list ($tagName)	= explode(' ', $currentTag);				$tagName		= substr($tagName, 1);			} else {				// Open Tag				$isCloseTag		= false;				list ($tagName)	= explode(' ', $currentTag);			}			/*			 * Exclude all "non-regular" tagnames			 * OR no tagname			 * OR remove if xssauto is on and tag is blacklisted			 */			if ((!preg_match("/^[a-z][a-z0-9]*$/i", $tagName)) || (!$tagName) || ((in_array(strtolower($tagName), $this->tagBlacklist)) && ($this->xssAuto))) {				$postTag		= substr($postTag, ($tagLength +2));				$tagOpen_start	= strpos($postTag, '<');				// Strip tag				continue;			}			/*			 * Time to grab any attributes from the tag... need this section in			 * case attributes have spaces in the values.			 */			while ($currentSpace !== false)			{				$attr			= '';				$fromSpace		= substr($tagLeft, ($currentSpace +1));				$nextSpace		= strpos($fromSpace, ' ');				$openQuotes		= strpos($fromSpace, '"');				$closeQuotes	= strpos(substr($fromSpace, ($openQuotes +1)), '"') + $openQuotes +1;				// Do we have an attribute to process? [check for equal sign]				if (strpos($fromSpace, '=') !== false) {					/*					 * If the attribute value is wrapped in quotes we need to					 * grab the substring from the closing quote, otherwise grab					 * till the next space					 */					if (($openQuotes !== false) && (strpos(substr($fromSpace, ($openQuotes +1)), '"') !== false)) {						$attr = substr($fromSpace, 0, ($closeQuotes +1));					} else {						$attr = substr($fromSpace, 0, $nextSpace);					}				} else {					/*					 * No more equal signs so add any extra text in the tag into					 * the attribute array [eg. checked]					 */					if ($fromSpace != '/') {						$attr = substr($fromSpace, 0, $nextSpace);					}				}				// Last Attribute Pair				if (!$attr && $fromSpace != '/') {					$attr = $fromSpace;				}				// Add attribute pair to the attribute array				$attrSet[] = $attr;				// Move search point and continue iteration				$tagLeft		= substr($fromSpace, strlen($attr));				$currentSpace	= strpos($tagLeft, ' ');			}			// Is our tag in the user input array?			$tagFound = in_array(strtolower($tagName), $this->tagsArray);			// If the tag is allowed lets append it to the output string			if ((!$tagFound && $this->tagsMethod) || ($tagFound && !$this->tagsMethod)) {				// Reconstruct tag with allowed attributes				if (!$isCloseTag) {					// Open or Single tag					$attrSet = $this->_cleanAttributes($attrSet);					$preTag .= '<'.$tagName;					for ($i = 0; $i < count($attrSet); $i ++)					{						$preTag .= ' '.$attrSet[$i];					}					// Reformat single tags to XHTML					if (strpos($fromTagOpen, '</'.$tagName)) {						$preTag .= '>';					} else {						$preTag .= ' />';					}				} else {					// Closing Tag					$preTag .= '</'.$tagName.'>';				}			}			// Find next tag's start and continue iteration			$postTag		= substr($postTag, ($tagLength +2));			$tagOpen_start	= strpos($postTag, '<');		}		// Append any code after the end of tags and return		if ($postTag != '<') {			$preTag .= $postTag;		}		return $preTag;	}	/**	 * Internal method to strip a tag of certain attributes	 *	 * @access	protected	 * @param	array	$attrSet	Array of attribute pairs to filter	 * @return	array	Filtered array of attribute pairs	 * @since	1.5	 */	function _cleanAttributes($attrSet)	{		// Initialize variables		$newSet = array();		// Iterate through attribute pairs		for ($i = 0; $i < count($attrSet); $i ++)		{			// Skip blank spaces			if (!$attrSet[$i]) {				continue;			}			// Split into name/value pairs			$attrSubSet = explode('=', trim($attrSet[$i]), 2);			list ($attrSubSet[0]) = explode(' ', $attrSubSet[0]);			/*			 * Remove all "non-regular" attribute names			 * AND blacklisted attributes			 */			if ((!preg_match('/[a-z]*$/i', $attrSubSet[0])) || (($this->xssAuto) && ((in_array(strtolower($attrSubSet[0]), $this->attrBlacklist)) || (substr($attrSubSet[0], 0, 2) == 'on')))) {				continue;			}			// XSS attribute value filtering			if ($attrSubSet[1]) {				// strips unicode, hex, etc				$attrSubSet[1] = str_replace('&#', '', $attrSubSet[1]);				// strip normal newline within attr value				$attrSubSet[1] = preg_replace('/[\n\r]/', '', $attrSubSet[1]);				// strip double quotes				$attrSubSet[1] = str_replace('"', '', $attrSubSet[1]);				// convert single quotes from either side to doubles (Single quotes shouldn't be used to pad attr value)				if ((substr($attrSubSet[1], 0, 1) == "'") && (substr($attrSubSet[1], (strlen($attrSubSet[1]) - 1), 1) == "'")) {					$attrSubSet[1] = substr($attrSubSet[1], 1, (strlen($attrSubSet[1]) - 2));				}				// strip slashes				$attrSubSet[1] = stripslashes($attrSubSet[1]);			}			// Autostrip script tags			if (JFilterInput::checkAttribute($attrSubSet)) {				continue;			}			// Is our attribute in the user input array?			$attrFound = in_array(strtolower($attrSubSet[0]), $this->attrArray);			// If the tag is allowed lets keep it			if ((!$attrFound && $this->attrMethod) || ($attrFound && !$this->attrMethod)) {				// Does the attribute have a value?				if ($attrSubSet[1]) {					$newSet[] = $attrSubSet[0].'="'.$attrSubSet[1].'"';				} elseif ($attrSubSet[1] == "0") {					/*					 * Special Case					 * Is the value 0?					 */					$newSet[] = $attrSubSet[0].'="0"';				} else {					$newSet[] = $attrSubSet[0].'="'.$attrSubSet[0].'"';				}			}		}		return $newSet;	}	/**	 * Try to convert to plaintext	 *	 * @access	protected	 * @param	string	$source	 * @return	string	Plaintext string	 * @since	1.5	 */	function _decode($source)	{		// entity decode		$trans_tbl = get_html_translation_table(HTML_ENTITIES);		foreach($trans_tbl as $k => $v) {			$ttr[$v] = utf8_encode($k);		}		$source = strtr($source, $ttr);		// convert decimal		$source = preg_replace('/&#(\d+);/me', "utf8_encode(chr(\\1))", $source); // decimal notation		// convert hex		$source = preg_replace('/&#x([a-f0-9]+);/mei', "utf8_encode(chr(0x\\1))", $source); // hex notation		return $source;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -