在PHP中如何判断一个字符串是否已经通过htmlentities传递?它需要html_entity_decode?

How to tell if a string has been passed through htmlentities in PHP? And it needs html_entity_decode?

我们在通过 htmlentities 方法传递数据后将其保存在我们的数据库中,以避免任何注入攻击

并且在使用它的同时,我们 html_entity_decode 来取回原始值。在我们的代码中的某些情况下,由于我们的保存技术(很难解释),htmlentities 对同一块数据执行了 2-3 次。所以我们基本上想避免多次编码相同的字符串。

是否有可靠的方法来检测字符串是否已经通过 htmlentities 方法传递?

我想一种方法是检查编码字符串中的 " 之类的东西,但还有更可靠的方法吗?任何仅告诉我字符串是否已编码的内置方法?

我们正在使用 Laravel,也许其中的辅助方法可以帮助我们?

IMO 从根本上说这是错误的方法。存储原始数据,因为它来了。虽然它在数据库中,但它不会对您造成任何伤害。

仅当您正要将其放入 HTML 文档时才通过 htmlentities 传递它 - 因为这是它可能存在危险的唯一上下文。

这将保存所有编码和解码 - 您只需根据需要按需编码即可。

正如 ADyson 所提到的,您在整个系统中处理数据的方式不正确。

Laravel 的模板引擎“Blade”会自动通过 htmlspecialchars() 发送您的变量以防止 XSS 攻击。

来自documentation

Blade {{ }} statements are automatically sent through PHP's htmlspecialchars function to prevent XSS attacks.

这将保护您的站点免受潜在的 XSS 攻击,而无需在 运行 INSERT/SELECT 查询数据库时 encode/decode 您的数据。

假设您正在使用 Laravel 的内置 DB Builder / Eloquent,您的 SQL 查询也是 protected automatically:

The Laravel query builder uses PDO parameter binding to protect your application against SQL injection attacks. There is no need to clean strings being passed as bindings.