如何从提交的内容中去除恶意 HTML(XXS 等)?

发布于 2024-10-13 23:10:54 字数 160 浏览 2 评论 0 原文

我有一个内容提交表单,其中包含多个输入字段,所有这些字段在提交时都会直接输入到数据库中。当请求此内容时,将打印该内容。

我意识到这是一个安全问题。

如何仅去除恶意 HTML (XSS),同时仍允许格式化标签(bi 等)?

I have a content submission form that contains multiple fields for input, all of which, when submitted, are entered directly into the database. When this content is requested, it is printed.

I have realized this is a security issue.

How can I strip malicious HTML (XSS) only, while still allowing formatting tags (b, i etc.)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

掀纱窥君容 2024-10-20 23:10:54

@pst 是正确的...您需要明确允许某些标签。但问题是输入可能遍布各处,因此您需要使用像 HTML Tidy (链接到 Source Forge 项目) 将其放入您可以 DOMDocument 的位置::loadHTML 清理后的文档。

您应该使用 HTML Tidy 来清理您的输入并将其置于投诉状态,以便您可以显式允许某些标记。在永久存储之前,应从已清理的内容中删除其他所有内容。 (注意:出于性能原因,不要将 BLOB 存储在数据库中,而是将它们存储在文件系统中,并使用安全位置(不在 Web 根目录中的位置)中的文件路径链接到它们。

祝你好运。

@pst is correct...you need to explicitly allow certain tags. But the problem is that the input can be all over the place therefore you'll need to use a library like HTML Tidy (link to Source Forge Project) to get it into a place where you can then DOMDocument::loadHTML the cleaned document.

You should use HTML Tidy to clean your input and get it into a complaint state so you can then explicitly allow certain tags. Everything else should be removed from your cleaned content before its permanently stored. (NOTE: for performance reasons do not store BLOBs in your database, store them in your file system and link to them with a file path in a secure location - a location that is not in your web root).

Good luck.

兮子 2024-10-20 23:10:54

首先在输入上运行 htmlspecialchars,然后针对允许的标签撤消它(例如,将 替换为 < /代码>)。

First run htmlspecialchars on the input and then undo it for the allowed tags (for example, replace <b> with <b>).

东风软 2024-10-20 23:10:54

使用 mysql_stripslashes()、htmlspecialchars() 和 urldecode(),对于整数值,您可能只需进行 int 类型转换。

Use mysql_stripslashes(), htmlspecialchars() and urldecode(), for integer values you can probably just int typecast.

孤城病女 2024-10-20 23:10:54

严格定义您将允许哪些“无辜”html 标签 - 例如 。然后运行正则表达式以仅接受您想要的那些,同时拒绝所有其他。

Strictly define which "innocent" html tags you are going to allow - like <strong> or <em>. Then run a regex to accept only those you want while rejecting all others.

深空失忆 2024-10-20 23:10:54

我认为对输入进行编码会有所帮助......

对于 PHP 我相信它是:

htmlspecialchars

I think encoding the input would help...

For PHP I believe it is:

htmlspecialchars
随风而去 2024-10-20 23:10:54

有几种方法可以处理这个问题。

首先我们要明确一点:要以安全的方式执行此操作,不能在 javascript 中完成,只能在服务器端完成 - 使用 javascript 安全地强制输入卫生注定会失败

  1. 组成的字符进行编码当您输出用户生成的数据时

,请更改一些字符以确保其安全。即字符 <>& 应更改为 <> 和 &

如果应该允许用户编辑文本,这是最好的方法,因为您实际上并没有更改存储中的文本,并且您可以让用户通过 textarea 更改未修改的文本

  1. 在存储用户生成的数据时对组成 html 的字符进行编码 执行

与上面相同的操作,但在将数据存储到数据库之前执行此操作。

这有一个性能优势,因为您不需要每次输出时都对其进行编码,但它不会让您的用户编辑未修改的文本,这可能是一个严重的缺点,具体取决于您正在构建的内容

  1. 。输出或存储

在输出或存储之前删除 <> 字符 - 在我看来这不是一个很好的解决方案,因为它是对用户的不必要的更改输入,但有些人更喜欢它。

There are several ways to handle this.

First off lets be clear: to do this in a secure manner, it cannot be done in javascript, only on the serverside - using javascript to securely enforce input sanitation is doomed to fail

  1. Encode the chars that make up html when you output user generated data

When the user generated data is outputted on your webpage, change a few of the charachters to make it secure. Namely the characters <, > and & should be changed to <, > and & respectively.

This is the best way to do it, if the user should be allowed to edit the text, since you don't actually alter the text in storage, and you can let the user change the unmodified text via a textarea

  1. Encode the chars that make up html when you store the user generated data

Do the same as above, but do it before you store the data in your db.

This has a performance upside, since you don't need to encode it every time you output it, but it will not let your users edit the unmodified text, which can be a serious downside, depending on what you are building

  1. Strip the characters before output or storage

Strip the < and > characters before either output or storage - this is not a very good solution in my opinion, since it is an unnecessary altering of user input, but some people prefer it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文