PHP - очиститель HTML - привет w <o>rld - PullRequest
16 голосов
/ 20 апреля 2010

Я просто пытаюсь использовать HTML-очиститель, чтобы обеспечить очистку введенной пользователем строки (которая представляет собой имя человека).

Я не хочу разрешать какие-либо html-теги, сценарии, разметку и т. Д. Мне нужны буквенные, цифровые и обычные знаки пунктуации.

Огромное количество параметров, доступных для очистителя HTML, устрашает, и, насколько я могу судить, у документов, похоже, нет начала / середины или конца

см .: http://htmlpurifier.org/docs

Существует ли в Интернете простое учебное пособие по Приветственному миру для очистителя HTML, в котором показано, как очистить строку, удалив из нее все плохое. Я также рассматриваю только использование меток полосы:

или PHP для очистки встроенных данных

Ответы [ 10 ]

9 голосов
/ 20 октября 2011

Я использовал HTMLPurifier для санации выходных данных редактора форматированного текста, и в итоге получил:

include_once('htmlpurifier/library/HTMLPurifier.auto.php');

$config = HTMLPurifier_Config::createDefault();
$config->set('Core', 'Encoding', 'UTF-8');
$config->set('HTML', 'Doctype', 'HTML 4.01 Transitional');

if (defined('PURIFIER_CACHE')) {
    $config->set('Cache', 'SerializerPath', PURIFIER_CACHE);
} else {
    # Disable the cache entirely
    $config->set('Cache', 'DefinitionImpl', null);
}

# Help out the Purifier a bit, until it develops this functionality
while (($cleaner = preg_replace('!<(em|strong)>(\s*)</\1>!', '$2', $input)) != $input) {
    $input = $cleaner;
}

$filter = new HTMLPurifier($config);
$output = $filter->purify($input);

Основные достопримечательности:

  1. Включитеавтозагрузчик.
  2. Создайте экземпляр HTMLPurifier_Config как $config.
  3. Установите необходимые параметры конфигурации с помощью $config->set().
  4. Создайте экземпляр HTMLPurifier, передав ему $config.
  5. Используйте $filter->purify() в качестве входных данных.

Однако, это полностью излишне для чего-то, что не должно допускать никакого HTML в выводе.

0 голосов
/ 26 сентября 2018

HTMLpurifier в действии.Вы можете написать <?php echo "HELLO";?> в fname и WORLD в lname и проверить вывод.

<?php
include( 'htmlpurifier/htmlpurifier/library/HTMLPurifier.auto.php');
?>
<form method="post">
<input type="text" name="fname" placeholder="first name"><br>
<input type="text" name="lname" placeholder="last name"><br>
<input type="submit" name="submit" value="submit">
</form>
        
<?php
if(isset($_POST['submit']))
{
    $fname=$_POST['fname'];
    $lname=$_POST['lname'];
    
    $config = HTMLPurifier_Config::createDefault();
    $purifier = new HTMLPurifier($config);
    $fname = $purifier->purify($fname);
    
    $config = HTMLPurifier_Config::createDefault();
    $purifier = new HTMLPurifier($config);
    $lname = $purifier->purify($lname);

    echo "First name is: ".$fname."<br>";
    echo "Last name is: ".$lname;
}
0 голосов
/ 16 августа 2010

Я всегда думал, что класс очистки Codeigniter xss был довольно хорошим, но недавно я обратился к Kohana.

Взгляните на их метод xss_clean

http://github.com/kohana/core/blob/c443c44922ef13421f4a3af5b414e19091bbdce9/classes/kohana/security.php

0 голосов
/ 24 мая 2010

Для простоты вы можете либо использовать strip_tags(), либо заменить вхождения <,> и & на &lt;, &gt; и &amp; соответственно. Это определенно не лучшее решение, но самое быстрое.

0 голосов
/ 27 мая 2010

Нашел это неделю назад ... ЛЮБЛЮ.

«Простой синтаксический анализатор PHP HTML DOM, написанный на PHP5 +, поддерживает недопустимый HTML и предоставляет очень простой способ обработки HTML-элементов». http://simplehtmldom.sourceforge.net/

// Example
$html = str_get_html("<div>foo <b>bar</b></div>");
$e = $html->find("div", 0);

echo $e->tag; // Returns: " div"
echo $e->outertext; // Returns: " <div>foo <b>bar</b></div>"
echo $e->innertext; // Returns: " foo <b>bar</b>"
echo $e->plaintext; // Returns: " foo bar"

Вы также можете циклически проходить и удалять отдельные теги и т. Д. Документы и примеры довольно хороши ... Я нашел, что их легко использовать во многих местах. : -)

0 голосов
/ 17 мая 2010

Я обычно очищаю весь пользовательский ввод перед отправкой в ​​мою базу данных со следующим

mysql_reql_escape_string( htmlentities( strip_tags($str) ));
0 голосов
/ 30 апреля 2010

Вы можете использовать что-то вроде htmlspecialchars (), чтобы сохранить символы, введенные пользователем без интерпретации браузером.

0 голосов
/ 29 апреля 2010

Если вы пытаетесь избежать атак с использованием кода, просто скопируйте данные, сохраните и распечатайте их, как ввели пользователь.

Например: если вы хотите избежать проблем с SQL-инъекцией в MySQL, используйте функцию mysql_real_escape_string() или аналогичную для очистки предложения SQL. *

Другой пример: запись данных в HTML-документ, проанализируйте данные с помощью html_entities(), чтобы данные выглядели как введенные пользователем.

0 голосов
/ 27 апреля 2010

Вы должны сделать проверку входных данных на основе содержимого - например, вместо имени используйте несколько регулярных выражений

'/([A-Z][a-z]+[ ]?)+/' //ascii only, but not problematic to extend

эта проверка должна хорошо выполнять работу. А затем экранируйте вывод при печати на странице с предпочтительными htmlspecialchars .

0 голосов
/ 21 апреля 2010

Самый простой способ удалить все не алфавитно-цифровые символы из строки, я думаю, это использовать RegEx.Replace () следующим образом:

Regex.Replace (stringToCleanUp, "[\ W]", "");

Хотя \ w (нижний регистр) соответствует любому символу «слова», что эквивалентно [a-zA-Z0-9_] \ W соответствует любому не-словесному символу, т.е. ничего не соответствует \ w. Приведенный выше код будет использовать \ W (заглавные буквы) и заменять результаты ничем.

В качестве альтернативы, если вы не хотите разрешить подчеркивание, вы можете использовать [^ a-zA-Z0-9], например так:

Regex.Replace (stringToCleanUp, "[^ a-zA-Z0-9]", "");

...