web/wp-content/plugins/slideshow-jquery-image-gallery/classes/SlideshowPluginSecurity.php
changeset 194 32102edaa81b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/slideshow-jquery-image-gallery/classes/SlideshowPluginSecurity.php	Mon Nov 19 18:26:13 2012 +0100
@@ -0,0 +1,141 @@
+<?php
+/**
+ * The SlideshowPluginSecurity class contains functions for sanitizing in- and output.
+ *
+ * @author Stefan Boonstra
+ * @since 2.1.16
+ * @updated 2.1.16
+ */
+class SlideshowPluginSecurity {
+
+	/**
+	 * @since 2.1.16
+	 * @var array List of allowed element tags
+	 */
+	private static $allowedElements = array(
+		'b' => array('endTag' => true, 'attributes' => 'default'),
+		'br' => array('endTag' => false),
+		'div' => array('endTag' => true, 'attributes' => 'default'),
+		'h1' => array('endTag' => true, 'attributes' => 'default'),
+		'h2' => array('endTag' => true, 'attributes' => 'default'),
+		'h3' => array('endTag' => true, 'attributes' => 'default'),
+		'h4' => array('endTag' => true, 'attributes' => 'default'),
+		'h5' => array('endTag' => true, 'attributes' => 'default'),
+		'h6' => array('endTag' => true, 'attributes' => 'default'),
+		'i' => array('endTag' => true, 'attributes' => 'default'),
+		'li' => array('endTag' => true, 'attributes' => 'default'),
+		'ol' => array('endTag' => true, 'attributes' => 'default'),
+		'p' => array('endTag' => true, 'attributes' => 'default'),
+		'span' => array('endTag' => true, 'attributes' => 'default'),
+		'strong' => array('endTag' => true, 'attributes' => 'default'),
+		'sub' => array('endTag' => true, 'attributes' => 'default'),
+		'sup' => array('endTag' => true, 'attributes' => 'default'),
+		'table' => array('endTag' => true, 'attributes' => 'default'),
+		'tbody' => array('endTag' => true, 'attributes' => 'default'),
+		'td' => array('endTag' => true, 'attributes' => 'default'),
+		'tfoot' => array('endTag' => true, 'attributes' => 'default'),
+		'th' => array('endTag' => true, 'attributes' => 'default'),
+		'thead' => array('endTag' => true, 'attributes' => 'default'),
+		'tr' => array('endTag' => true, 'attributes' => 'default'),
+		'ul' => array('endTag' => true, 'attributes' => 'default')
+	);
+
+	/**
+	 * @since 2.1.16
+	 * @var array List of attributes allowed in the tags
+	 */
+	private static $defaultAllowedAttributes = array(
+		'class',
+		'id',
+		'style'
+	);
+
+	/**
+	 * Similar to the htmlspecialchars($text) function, except this function
+	 * allows the exceptions defined in this class.
+	 *
+	 * @since 2.1.16
+	 * @updated 2.1.16
+	 */
+	static function htmlspecialchars_allow_exceptions($text){
+		$text = htmlspecialchars(htmlspecialchars_decode($text));
+
+		$allowedElements = self::$allowedElements;
+
+		// Loop through allowed elements decoding their HTML special chars and allowed attributes.
+		if(is_array($allowedElements) && count($allowedElements) > 0){
+			foreach($allowedElements as $element => $attributes){
+
+				$position = 0;
+
+				while(($position = stripos($text, $element, $position)) !== false){ // While element tags found
+
+					$openingTag = '<';
+					$encodedOpeningTag = htmlspecialchars($openingTag);
+
+					if(substr($text, $position - strlen($encodedOpeningTag), strlen($encodedOpeningTag)) == $encodedOpeningTag){ // Check if an opening tag '<' can be found before the tag name
+
+						// Replace encoded opening tag
+						$text = substr_replace($text, '<', $position - strlen($encodedOpeningTag), strlen($encodedOpeningTag));
+						$position -= strlen($encodedOpeningTag) - strlen($openingTag);
+
+						// Get the position of the first element closing tag
+						$closingTag = '>';
+						$encodedClosingTag = htmlspecialchars($closingTag);
+						$closingTagPosition = stripos($text, $encodedClosingTag, $position);
+
+						// Replace encoded closing tag
+						if($closingTagPosition !== false)
+							$text = substr_replace($text, '>', $closingTagPosition, strlen($encodedClosingTag));
+
+						$elementAttributes = null;
+						if(isset($attributes['attributes']) && is_array($attributes['attributes']))
+							$elementAttributes = $attributes['attributes'];
+						elseif(isset($attributes['attributes']) && $attributes['attributes'] == 'default')
+							$elementAttributes = self::$defaultAllowedAttributes;
+						else
+							continue;
+
+						if(!is_array($elementAttributes))
+							continue;
+
+						$tagText = substr($text, $position, $closingTagPosition - $position);
+
+						// Decode allowed attributes
+						foreach($elementAttributes as $attribute){
+
+							$attributeOpener = $attribute . '=' . htmlspecialchars('"');
+
+							$attributePosition = 0;
+							if(($attributePosition = stripos($tagText, $attributeOpener, $attributePosition)) !== false){ // Attribute was found
+
+								$attributeClosingPosition = 0;
+								if(($attributeClosingPosition = stripos($tagText, htmlspecialchars('"'), $attributePosition + strlen($attributeOpener))) === false) // If no closing position of attribute was found, skip.
+									continue;
+
+								// Open the attribute
+								$tagText = str_ireplace($attributeOpener, $attribute . '="', $tagText);
+
+								// Close the attribute
+								$attributeClosingPosition -= strlen($attributeOpener) - strlen($attribute . '="');
+								$tagText = substr_replace($tagText, '"', $attributeClosingPosition, strlen(htmlspecialchars('"')));
+							}
+
+						}
+
+						// Put the attributes of the tag back in place
+						$text = substr_replace($text, $tagText, $position, $closingTagPosition - $position);
+					}
+
+					$position++;
+				}
+
+				// Decode closing tags
+				if(isset($attributes['endTag']) && $attributes['endTag'])
+					$text = str_ireplace(htmlspecialchars('</' . $element . '>'), '</' . $element . '>', $text);
+			}
+		}
+
+		return $text;
+	}
+}
\ No newline at end of file