PHP - очиститель HTML - привет w<o>rld / world учебные стэптэги

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

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

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

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

Существует ли в Интернете простое учебное пособие "Здравствуй, мир" для очистителя HTML, в котором показано, как очистить строку, удалив из нее все плохое.

Я также рассматриваю только использование меток полосы:

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

10 ответов

Решение

Я использовал 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 в выводе.

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

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

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

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

Посмотрите на их метод xss_clean

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

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

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;
}

Самый простой способ удалить все не алфавитно-цифровые символы из строки, я думаю, это использовать 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]", "");

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

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

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

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

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

"Простой анализатор HTML 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"

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

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

mysql_reql_escape_string( htmlentities( strip_tags($str) ));
Другие вопросы по тегам