PHP 和 MySQL - 在向用户显示之前从我的数据库中提取数据时,我是否应该验证/清理我的数据?

Dwa*_*der 0 php database security validation sanitization

在将所有数据插入数据库之前,我会对其进行验证和清理。在显示它之前从数据库中提取它时对其进行验证是否被认为是好的或多余的策略?

这归结为对您自己的代码的信任程度。在一种极端情况下,如果我知道只有我会使用客户端界面并且永远不会出错,我可以完全放弃验证。另一方面,我可以验证每个班级的数据,以防我与其他人一起工作而他们忘记正确完成工作。但在这种特殊情况下,一般的好做法是什么?

Art*_*nix 5

输入验证应该是一个是/否命题。您不应该修改输入并保存它。

您应该在从数据库中提取之后和显示之前使用 Htmlentities。这是因为最好在故障点使用数据之前清理数据。这就是准备好的语句如此有效的原因,因为没有您依赖的外部代码。

假设您忘记清理 1 个表单中的 1 个字段,那么当您将该数据输出给其他用户时,您将无法从执行输出的代码中看到该错误(假设它不在同一个文件中)。

清理和最终结果之间的代码越少越好。

现在并不是说保存所有内容并稍后验证。以电子邮件为例,您应该在保存之前验证其格式是否正确。

但是对于其他事情,您不想修改用户输入。进行文件上传。有些人会更改文件名以对其进行清理,替换空格等。这很好,但我更喜欢创建自己的文件名,然后向他们显示原始文件名,而我在服务器上使用的是他们用户名的哈希值和文件名。他们永远不知道这一点,我得到了干净的文件名。

您开始修改用户数据,维护它就变成了一件苦差事。您可能必须取消修改它,以便他们可以对其进行编辑......等等。这意味着如果您在输出时清理它,那么您将做更多的工作。

\n<br>标签替换用户行返回的简单行为为例。用户输入文本字段,然后将其更改为 html 并保存。(除了安全原因不这样做)当用户想要编辑数据时,您必须<br>将它们替换为\n以便他们可以编辑它。出于安全原因,现在您已经决定该字段中的原始 HTML 是可以的,并且只会输出原始字段,允许某人添加他们自己的 HTML。所以通过修改用户数据,我们为自己创造了更多的工作,并且我们假设数据是干净的,然后在我们输出时插入它。当我们输出它时,我们看不到它是如何清理的。

所以答案是这取决于数据和你正在做的卫生。

希望这是有道理的。

  • 是的,DB 并不关心其中是否包含 HTML,您只是不想向其他用户展示它,因为它可以在他们的浏览器上执行 javascript。如果您更改它,那么您可能必须将其更改回来,以便他们可以对其进行编辑。 (2认同)