验证用户输入?

PHP*_*VER 5 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()之外如何过滤这些数据以确保它不会破坏数据库查询?

请有人请最终为我解决这个困惑并告诉我应该做什么以及最佳做法是什么?

感谢任何可以解释的人.

干杯!

Bor*_*lid 2

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

“我应该在将 HTML 插入数据库之前或在显示它时对其进行转义吗?”

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

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

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

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

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