验证用户输入?

时间:2010-09-03 18:33:19

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

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

感谢任何可以解释的人。

干杯!

3 个答案:

答案 0 :(得分:2)

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

“在将HTML插入我的数据库之前,或者当我去显示它时,我应该转义HTML吗?”

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

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

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

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

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

答案 1 :(得分:1)

mysql_real_escape_string()是数据库操作所需的全部内容。它将确保恶意用户无法将某些内容嵌入到会“破坏”您的查询的数据中。

当你正在向客户端/浏览器发送内容时,

htmlentities()htmlspecialchars()开始发挥作用。如果你想清理潜在的恶意HTML,你最好使用HTMLPurifier,它会将数据剥离到基岩并用漂白剂将其压缩并正确重建。

答案 2 :(得分:0)

如果你在HTML出现时逃避HTML,没有理由担心数据库中存在恶意JavaScript代码。只要确保你总是逃避数据库中出现的任何事情。