Php 验证用户输入?

Php 验证用户输入?,php,validation,mysql-real-escape-string,html-entities,Php,Validation,Mysql Real Escape String,Html Entities,我对一些事情很困惑,不知道是否有人能解释一下 在PHP中,我验证用户输入,以便在插入数据库之前使用HTMLEntities、mysql\u real\u escape\u字符串,而不是所有内容,因为我更喜欢在可能的情况下使用正则表达式,尽管我发现它们很难使用。现在很明显,当数据进入数据库时,我将使用mysql\u real\u escape\u字符串,但不确定是否应该使用htmlentities()只有当我从数据库中获取数据并将其显示在网页上时,如果我想在以后将该数据用于其他用途,则更改由未保留

我对一些事情很困惑,不知道是否有人能解释一下

在PHP中,我验证用户输入,以便在插入数据库之前使用HTMLEntities、mysql\u real\u escape\u字符串,而不是所有内容,因为我更喜欢在可能的情况下使用正则表达式,尽管我发现它们很难使用。现在很明显,当数据进入数据库时,我将使用mysql\u real\u escape\u字符串,但不确定是否应该使用htmlentities()只有当我从数据库中获取数据并将其显示在网页上时,如果我想在以后将该数据用于其他用途,则更改由未保留其原始形式的人员输入的数据可能会导致问题

例如,我有一个留言簿,上面有三个字段:名称、主题和消息。现在很明显,这些字段可以包含类似于js标记中的恶意代码的任何内容,现在让我困惑的是,假设我是一个恶意的人,我决定使用js标记和一些恶意js代码并提交表单,现在我的数据库中基本上有恶意的无用数据。现在,在将恶意代码输出到网页(留言簿)时使用htmlentities,这不是问题,因为htmlentities已将其转换为安全等价物,但与此同时,我在数据库中有无用的恶意代码,我不希望有这些代码

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

我读过很多书,说在接收数据时过滤数据,在输出数据时转义数据,以便保留原始表单,但他们只给出了一些示例,例如使用php中内置的函数确保字段仅为int等,但我从未找到任何关于确保像留言簿这样的用户可以访问的内容键入他们想要的任何内容,以及除了mysql\u real\u escape\u string()之外如何过滤这些数据以确保它不会破坏DB查询

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

感谢所有能解释的人


干杯

mysql\u real\u escape\u string()
是数据库操作所需的全部。它将确保恶意用户不能在数据中嵌入会“破坏”您的查询的内容


htmlentities()
htmlspecialchars()
在将内容发送到客户端/浏览器时发挥作用。如果您想清除可能存在敌意的HTML,最好使用它,它会将数据剥离到底层,用漂白剂冲洗并正确重建数据。

这是一个很长的问题,但我认为您实际提出的问题归结为:

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

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

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

您应该始终努力获得最大的保真度表示。既然在数据库中存储“恶意”代码不会造成伤害(事实上,它为您节省了一些空间,因为转义的HTML比未转义的HTML长!),而且您将来可能需要该HTML(如果您在用户评论上使用XML解析器,或者有朝一日让受信任的用户在他们的评论中拥有HTML的子集,或者类似的东西),为什么不让它成为现实呢

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


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

如果在HTML出现时转义,那么就没有理由担心数据库中有恶意JavaScript代码。只要确保你总是能逃脱数据库中的任何东西。

哇,谢谢你,马克B,我从来没想到我会得到这么快的回复。谢谢你的输入,我将检查该链接,但这也已经清除了一切。谢天谢地,我的网站非常小,所以不用担心,但至少我现在可以在需要的地方更改代码,基本上做我认为我需要做的事情,就像你的确认一样。我现在很自信,我已经走上了正轨:)显然,如果其他人想添加任何其他建议,请这样做。注:伟大的网站希望我在很久以前就发现了它,刚刚注册:)开始研究数据安全性和完整性永远不会太早。其实没什么大不了的,但你越早养成习惯,把任何来自外界的东西当作有毒废物处理,就越好。作为一个附加的安全层,您可能希望使用PDO和准备好的语句进行调查,除非您必须构建不符合其范围的查询。感谢Marc和其他人,真的回答了我所有的问题和更多,我从这篇文章中学到了allot,现在至少可以轻松地说:)你们都帮了我很大的忙,所以谢谢你们。嗨,马克,我想让你们知道