1

我知道这个话题已经被广泛讨论,因为我已经阅读并阅读了超过 15 篇关于该主题的帖子,但仍然找不到我的问题的答案。

我正在寻找一种功能来清理表单中的数据。由于绝对没有 HTML 是可以接受的,我该如何转义所有 html 实体,以便用户绝对不能注入任何东西?我不需要白名单,因为不允许输入 HTML。

此外,不需要运行 mysql_real_escape_string,因为我不使用 MySQL 数据库。我使用 MongoDB。我只是存储名字,姓氏,电话号码,基本的东西。没有 HTML。但是我仍然不希望用户能够输入<script>whatever</script>他们的名字,当它显示给他们时,它会解析它。

我想到了HTML PurifierhtmLAWED,但它们似乎对我想做的事情来说太多了。我只是构建一个花哨的 preg_replace 函数吗?

4

7 回答 7

2

没有通用的“使其安全”过滤器。字符串仅在放入特定上下文时才危险。

例如,如果上下文是一个纯文本文档,你真的不用担心。

如果上下文是文本节点(不在尖括号内),则htmlspecialchars就足够了。指定正确的字符集/编码,即服务器发送的 http 标头中的字符集/编码。

   <p><?= htmlspecialchars($input, ENT_QUOTES, 'UTF-8'); ?></p>

但是,如果您需要在尖括号内输出,则使上下文类似于 html 属性,例如:

<p <?= htmlspecialchars($input, ENT_QUOTES, 'UTF-8'); ?>   ></p>
or
<p title="<?= htmlspecialchars($input, ENT_QUOTES, 'UTF-8'); ?>"   ></p>

在许多情况下,“使其安全”的任务变得极其困难(旧版浏览器有一些绝对令人困惑的错误,这些错误违背了软件开发人员的普遍期望)。如果您不站在巨人的肩膀上并使用 htmlpurifier 之类的东西,那您将是愚蠢的。

于 2012-10-25T15:32:18.217 回答
0

我不是这类事情的专家,但你不能str_replace尖括号吗?

于 2012-10-25T14:58:13.857 回答
0

我会说使用 preg_replace 但你需要小心可能出现在一个人的名字中的重音和其他不常见的字符。

于 2012-10-25T15:01:35.710 回答
0

定义清理:您要转义尖括号还是要删除 HTML 标记?

逃走看看

htmlentities() 

删除看看

strip_tags()
于 2012-10-25T15:06:01.897 回答
0

我喜欢使用的一种只是格式化所有 HTML 特殊字符的方式,以便将它们从 HTML 页面的流程中删除:

htmlspecialchars($string);

它从来没有让我失望过,解决了必须使用复杂而缓慢的替换功能等问题,这也意味着用户可以>在他们的用户名或评论等中使用而不被删除(即互联网上非常有效的用户名是>3)。

于 2012-10-25T15:07:22.880 回答
0

看看 PHP 的数据过滤怎么样,http ://php.net/manual/en/book.filter.php

Sanatize:http ://php.net/manual/en/filter.filters.sanitize.php

如果您真的想要一个可靠且安全的库,请查看 OWASP 的 ESAPI for PHP

不要编写自己的安全控制!在为每个 Web 应用程序或 Web 服务开发安全控制时重新发明轮子会导致时间浪费和大量安全漏洞。OWASP 企业安全 API (ESAPI) 工具包可帮助软件开发人员防范与安全相关的设计和实施缺陷。

于 2012-10-25T15:09:31.583 回答
0

使用 php 5.3 的 filter_input http://php.net/manual/en/function.filter-input.php

$string = filter_input(INPUT_POST, 'string', FILTER_SANITIZE_SPECIAL_CHARS);

这很像 $_POST['string'] 但内置了清洁器。

于 2012-10-25T15:15:13.217 回答