如何在不丢失 HTML 和删除 JS /SQL 的情况下清理字符串

How to sanitize a string without losing HTML and removing JS /SQL

我正在使用富文本编辑器接受来自客户端的具有 HTML 内容的输入数据。

在服务器端,我使用基于 PHP 的服务器并清理传入数据。

是否有内置 PHP 功能,它保留 HTML 代码并删除 XSS + SQL 注入代码的 Javascript。

据我所知,不存在这样的内置功能。

来自 http://php.net/manual/en/filter.filters.sanitize.php doesn't look to cover your request. You may take a look at http://php.net/manual/en/book.filter.php 的清理过滤器,但没有设置过滤 HTML 的过滤器。

我知道您不需要外部库,但我认为这是一个可以帮助您解决所面临问题的库:http://htmlpurifier.org/

关于 SQL 注入你应该使用 PDO with prepared statements。这样一来,您发送到数据库的字符串与您想要的字符串完全相同,您无需使用它来转义。

关于 XSS - 你应该看看 XSS Filter Evasion Cheat Sheet by owasp. There are several things you can do here - you can allow only known tags (and strip all the rest, using php's strip_tags 函数)。请注意,它不会阻止元素属性内部的 XSS(检查作弊 sheet link)。
您可以使用 DOMDocument parser in order to walk through all the elements and check their attributes and keep/remove whatever you want. Check this 获取更多信息。

如果你使用一些已知的框架,它们中的大多数都有一个内置的 xss 过滤器,所以你可以使用它(或者 take a look 在代码中并从中学习)。

使用准备好的语句和参数化查询来防止SQL injections

如果您只想允许某些标签保存在您的数据库中,您可以使用 strip_tags()。它使您可以允许某些 HTML 标签。但是,评论和 PHP 标签将始终被删除。

$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
// Allow <p> and <a>
echo strip_tags($text, '<p><a>');