17

我只是在研究使用 HTML Purifier 来确保对用户输入的字符串(表示人名)进行清理。

我不想允许任何 html 标签、脚本、标记等 - 我只想要字母、数字和普通标点字符。

HTML Purifier 可用的选项数量之多令人望而生畏,据我所知,这些文档似乎没有开始/中间或结尾

见:http ://htmlpurifier.org/docs

是否有针对 HTML Purifier 的简单的 hello world 在线教程,该教程展示了如何清理字符串以去除其中的所有不良内容。

我也在考虑只使用条形标签:

或 PHP 的内置数据清理

4

10 回答 10

9

我一直在使用 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_Configas的实例$config
  3. 根据需要设置配置设置,使用$config->set().
  4. 创建一个实例HTMLPurifier,传递$config给它。
  5. 用于$filter->purify()您的输入。

但是,对于不需要在输出中允许任何 HTML 的东西来说,这完全是矫枉过正。

于 2011-10-19T22:41:32.027 回答
0

我一直认为 Codeigniter 的 xss 清洁课程非常好,但最近我转向了 Kohana。

看看他们的 xss_clean 方法

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

于 2010-08-16T16:39:06.353 回答
0

您应该根据内容进行输入验证 - 例如,宁可使用一些正则表达式作为名称

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

此验证应该可以很好地完成工作。然后在页面上打印时使用首选htmlspecialchars转义输出。

于 2010-04-27T08:12:05.683 回答
0

您可以使用 htmlspecialchars() 之类的东西来保留用户输入的字符,而无需浏览器解释。

于 2010-04-30T11:33:36.570 回答
0

HTMLpurifier 在行动。您可以选择写入和<?php echo "HELLO";?>输入并检查输出。 fnameWORLDlname

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

于 2018-09-26T14:21:50.433 回答
-1

我认为从字符串中删除所有非字母数字字符的最简单方法是使用 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]", "");

于 2010-04-21T08:39:23.253 回答
-1

如果您试图逃避代码注入攻击,只需像用户输入的那样隐藏数据并存储和打印它。

例如:如果您想避免 MySQL 中的 SQL 注入问题,请使用该mysql_real_escape_string()函数或类似功能来清理 SQL 语句。*

另一个例子:将数据写入 HTML 文档,用 解析数据html_entities(),这样数据看起来就像是用户输入的一样。

于 2010-04-29T16:11:12.883 回答
-1

为简单起见,您可以使用strip_tags(),或将出现的 <、> 和 &分别替换为&lt;&gt;&amp;。这绝对不是最好的解决方案,而是最快的。

于 2010-05-24T10:59:39.407 回答
-2

一周前发现的……喜欢它。

“一个用 PHP5+ 编写的简单的 PHP HTML DOM 解析器,支持无效的 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"

您还可以遍历和删除单个标签等。文档和示例非常好......我发现它在很多地方都很容易使用。:-)

于 2010-05-27T01:05:26.927 回答
-2

我通常在发送到我的数据库之前清理所有用户输入,如下所示

mysql_reql_escape_string( htmlentities( strip_tags($str) ));
于 2010-05-17T17:04:58.053 回答