php - 验证用户输入?

标签 php validation mysql-real-escape-string html-entities

我对某件事感到很困惑,想知道是否有人可以解释一下。

在 PHP 中,我验证用户输入,所以 htmlentitiies,mysql_real_escape_string 在插入数据库之前使用,而不是在所有东西上使用,因为我更喜欢尽可能使用正则表达式,尽管我发现它们很难使用。现在显然我将使用 mysql_real_escape_string 作为数据进入数据库但不确定我是否应该仅在从数据库获取数据并将其显示在网页上时才使用 htmlentities() 因为这样做之前会改变一个人输入的数据没有保持它的原始形式,如果我以后想将该数据用于其他用途,可能会导致问题。

例如,我有一个包含 3 个字段名称、主题和消息的留言簿。现在很明显,这些字段可以包含任何东西,比如 js 标签中的恶意代码,基本上任何东西,现在让我感到困惑的是,假设我是一个恶意的人,我决定使用 js 标签和一些恶意的 js 代码并提交表单,现在基本上我有恶意我的数据库中无用的数据。现在通过在将恶意代码输出到网页(留言簿)时使用 htmlentities,这不是问题,因为 htmlentities 已将其转换为安全的等效代码,但同时我在数据库中有无用的恶意代码,我不想拥有。

所以在说完所有这些之后,我的问题是我是否应该接受这样一个事实,即数据库中的某些数据可能是恶意的、无用的数据,只要我在输出上使用 htmlentities,一切都会好起来的,还是我应该做其他事情?

我读了很多书说在接收数据时过滤数据并在输出数据时转义数据以便保留原始形式,但他们只给出了例子,比如确保一个字段只是一个使用已经内置到 php 等中的函数的 int 但我从来没有发现任何关于确保像留言簿这样的东西,你希望用户在其中键入他们想要的任何东西,但也没有找到任何东西,除了 mysql_real_escape_string() 之外,如何过滤这些数据以确保它不会破坏数据库查询?

最后有人能帮我解决这个困惑并告诉我我应该做什么以及什么是最佳实践吗?

感谢任何可以解释的人。

干杯!

最佳答案

这是一个很长的问题,但我认为您实际上要问的是:

“我应该在将 HTML 插入我的数据库之前转义它,还是在我要显示它时转义它?”

这个问题的普遍接受的答案是,当您要向用户显示它时,您应该转义 HTML(通过 htmlspecialchars),并且在放置它之前进入数据库。

原因是这样的:数据库存储数据。您输入的内容就是用户输入的内容。当您调用 mysql_real_escape_string 时,它不会改变插入数据库的内容;它只是避免将用户的输入解释为 SQL 语句。 htmlspecialchars 对 HTML 做同样的事情;当您打印用户的输入时,它将避免将其解释为 HTML。如果您要在插入之前调用 htmlspecialchars,那么您就不再忠实了。

您应该始终努力获得尽可能高的保真度。由于将“恶意”代码存储在数据库中没有任何危害(事实上,它为您节省了一些空间,因为转义的 HTML 比未转义的 HTML 更长!),并且您将来可能想要那个 HTML(如果您对用户评论使用 XML 解析器,或者有一天让受信任的用户在他们的评论中包含 HTML 的子集,或者类似的东西,会怎么样?),为什么不让它成为现实呢?

您还询问了一些其他类型的输入验证(整数约束等)。您的数据库模式应该强制执行这些,它们也可以在应用程序层进行检查(最好是通过 JS 输入,然后再在服务器端检查)。

另一方面,使用 PHP 进行数据库转义的最佳方法可能是使用 PDO,而不是直接调用 mysql_real_escape_string。 PDO 具有更高级的功能,包括类型检查。

关于php - 验证用户输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3638592/

相关文章:

c# - 我可以拦截通过 HTTP 上传到 IIS7 的文件并根据验证标准拒绝上传吗?

forms - 在 Angular 中使用 ControlValueAccessor 继承验证

php - MySQL 独特数据

php - Foreach 通过多维数组嵌套

php - 如何根据同一辆公交车选择路线记录

c# - 使用 Entity Framework 在 WPF MVVM 中进行验证

php - Mysql 真正的转义字符串不适用于 textarea 撇号在插入时出现语法错误

php - 设置每节动态数据集的 mysql 查询

php - 有人可以清楚地解释为什么mysqli_prepare()/bind_param()比real_escape_string()更好吗?

php - 转到编辑页面时选中复选框 - PHP HTML