#523058 by catch, pwolanin, sun, and smk-ka, and jrchamp: Optimize check_plain().
parent
3e8344b5c4
commit
07151b0c82
|
@ -1163,11 +1163,36 @@ function drupal_unpack($obj, $field = 'data') {
|
||||||
/**
|
/**
|
||||||
* Encode special characters in a plain-text string for display as HTML.
|
* Encode special characters in a plain-text string for display as HTML.
|
||||||
*
|
*
|
||||||
* Uses drupal_validate_utf8 to prevent cross site scripting attacks on
|
* Also validates strings as UTF-8 to prevent cross site scripting attacks on
|
||||||
* Internet Explorer 6.
|
* Internet Explorer 6.
|
||||||
|
*
|
||||||
|
* @param $text
|
||||||
|
* The text to be checked or processed.
|
||||||
|
* @return
|
||||||
|
* An HTML safe version of $text, or an empty string if $text is not
|
||||||
|
* valid UTF-8.
|
||||||
|
* @see drupal_validate_utf8().
|
||||||
*/
|
*/
|
||||||
function check_plain($text) {
|
function check_plain($text) {
|
||||||
return drupal_validate_utf8($text) ? htmlspecialchars($text, ENT_QUOTES) : '';
|
// We do not want to use drupal_static() since PHP version will never change
|
||||||
|
// during a request.
|
||||||
|
static $php525;
|
||||||
|
|
||||||
|
if (!isset($php525)) {
|
||||||
|
$php525 = version_compare(PHP_VERSION, '5.2.5', '>=');
|
||||||
|
}
|
||||||
|
// We duplicate the preg_match() to validate strings as UTF-8 from
|
||||||
|
// drupal_validate_utf8() here. This avoids the overhead of an additional
|
||||||
|
// function call, since check_plain() may be called hundreds of times during
|
||||||
|
// a request. For PHP 5.2.5+, this check for valid UTF-8 should be handled
|
||||||
|
// internally by PHP in htmlspecialchars().
|
||||||
|
// @see http://www.php.net/releases/5_2_5.php
|
||||||
|
// @todo remove this when support for either IE6 or PHP < 5.2.5 is dropped.
|
||||||
|
|
||||||
|
if ($php525) {
|
||||||
|
return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
|
||||||
|
}
|
||||||
|
return (preg_match('/^./us', $text) == 1) ? htmlspecialchars($text, ENT_QUOTES, 'UTF-8') : '';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -311,6 +311,42 @@ class CommonURLUnitTest extends DrupalUnitTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests for the check_plain() and filter_xss() functions.
|
||||||
|
*/
|
||||||
|
class CommonXssUnitTest extends DrupalUnitTestCase {
|
||||||
|
|
||||||
|
public static function getInfo() {
|
||||||
|
return array(
|
||||||
|
'name' => 'String filtering tests',
|
||||||
|
'description' => 'Confirm that check_plain() and filter_xss() work correctly, including invalid multi-byte sequences.',
|
||||||
|
'group' => 'System',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check that invalid multi-byte sequences are rejected.
|
||||||
|
*/
|
||||||
|
function testInvalidMultiByte() {
|
||||||
|
$text = check_plain("Foo\xC0barbaz");
|
||||||
|
$this->assertEqual($text, '', 'check_plain() rejects invalid sequence "Foo\xC0barbaz"');
|
||||||
|
$text = check_plain("Fooÿñ");
|
||||||
|
$this->assertEqual($text, "Fooÿñ", 'check_plain() accepts valid sequence "Fooÿñ"');
|
||||||
|
$text = filter_xss("Foo\xC0barbaz");
|
||||||
|
$this->assertEqual($text, '', 'filter_xss() rejects invalid sequence "Foo\xC0barbaz"');
|
||||||
|
$text = filter_xss("Fooÿñ");
|
||||||
|
$this->assertEqual($text, "Fooÿñ", 'filter_xss() accepts valid sequence Fooÿñ');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check that special characters are escaped.
|
||||||
|
*/
|
||||||
|
function testEscaping() {
|
||||||
|
$text = check_plain("<script>");
|
||||||
|
$this->assertEqual($text, '<script>', 'check_plain() escapes <script>');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class CommonSizeTestCase extends DrupalUnitTestCase {
|
class CommonSizeTestCase extends DrupalUnitTestCase {
|
||||||
protected $exact_test_cases;
|
protected $exact_test_cases;
|
||||||
protected $rounded_test_cases;
|
protected $rounded_test_cases;
|
||||||
|
|
Loading…
Reference in New Issue