2010-09-03 176 views
5

我对某事感到很困惑,并在想如果有人能解释。验证用户输入?

在PHP中,我验证用户输入,所以htmlentitiies,mysql_real_escape_string在插入数据库之前使用,而不是一切,因为我喜欢使用正则表达式虽然我可以尽管我发现它们很难使用。现在很明显我会使用mysql_real_escape_string作为数据进入数据库,但不知道应该使用htmlentities()只有当从数据库获取数据并在网页上显示它时,才会手动更改由某人输入的数据不保留它的原始形式,这可能会导致问题,如果我想稍后使用该数据用于其他事情。

因此,例如,我有一个留言簿3字段的名称,主题和消息。现在显然这些字段可以包含任何类似js标记中的恶意代码基本上任何东西,现在让我困惑的是让我说我​​是一个恶意的人,我决定使用js标记和一些恶意代码并提交表单,现在基本上我有恶意无用的数据在我的数据库中。现在,在将恶意代码输出到网页(留言簿)时使用htmlentities并不是问题,因为htmlentities已将其转换为安全等效形式,但同时我在数据库中没有无用的恶意代码,我宁愿没有这些代码。

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

我读了很多关于过滤接收到数据的书籍,并在输出时将其转义出来,以便保留原始形式,但他们只是提供了一些例子,例如确保字段仅仅是使用已内置于php等中的函数的int类型,但是我从来没有发现任何关于确保类似于留言簿的地方,您希望用户输入他们想要的任何内容,而且还会如何从mysql_real_escape_string()中过滤这些数据以确保它不会中断数据库查询?

难道有人请最后关闭这个困惑,告诉我我应该做什么以及最佳做法是什么?

感谢任何能解释的人。

干杯!

回答

2

这是一个长期的问题,但我想你实际上问归结为:“我应该逃避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

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

htmlentities()htmlspecialchars()在您将内容发送到客户端/浏览器时起作用。如果你想清理潜在的敌对HTML,你最好使用HTMLPurifier,它将数据剥离到基岩并用漂白剂将其压缩并正确重建。

+0

哇,谢谢Marc B,从来不知道我会得到如此快速的回复。感谢您的输入,我将检查该链接,但也已清除所有内容。谢天谢地,我的网站非常小,所以不用担心,但至少我现在可以在需要的地方更改我的代码,并且基本上做了我认为我需要做的事情,因为您的确认以及我现在感到自信,我现在在仪式轨道上:) 显然,如果其他人想要添加任何其他建议,请做。 PS:很棒的网站希望我发现它很久以前,只是注册:) – PHPLOVER 2010-09-03 18:43:00

+0

从事数据安全性和完整性工作永远不会太早。实际上没有那么多,但是你越早养成将外部来自有毒废物的东西处理的习惯越好。作为附加的安全层,您可能希望使用PDO进行调查并准备好语句,除非您必须构建不符合其范围的查询。 – 2010-09-03 19:05:02

+0

感谢Marc和其他人一样,真的已经回答了我所有的问题多,我从做这个帖子学到配发及心情放松现在至少:) 你们都得到了很大的帮助,这么说感谢大家。 – PHPLOVER 2010-09-03 20:26:57

0

没有理由担心其在数据库中的恶意JavaScript代码,如果你逃脱HTML出来时。只要确保你总是可以逃脱任何来自数据库的东西。