简短的回答:
始终根据适当的上下文进行消毒。验证业务案例是否需要它。
更长的答案:
验证
验证是为了确保数据的正确性和有用性。
如果您要求用户提供电话号码或银行帐号,请验证以确保它是数字和破折号,例如 123-456-789。如果您要求提供电子邮件地址,请验证以确保 @ 和点等。
您应该验证用户输入两次。
客户端验证是为了用户体验。如果用户的输入无效,您可以通知用户,而无需往返服务器。但是,可以绕过客户端验证,因此您也应该验证服务器端,以确保数据完整性。
消毒
清理是为了确保数据安全并防止代码注入。
您应该始终根据您使用输入数据的方式进行清理。
在将用户输入存储在数据库中然后将其写入屏幕的简单情况下,您需要对数据进行两次清理。
当您将用户输入写入数据库时,您首先要确保它不包含 SQL 注入,因此您需要对它进行适当的清理以进行 SQL 注入。
稍后,当您想从数据库中提取数据并显示它时,您需要在将其打印到屏幕上之前对其进行消毒以进行 HTML 和 Javascript 注入。
要回答您的评论:
永远不要相信用户输入。验证数据。即使是管理员也会犯错误。清理数据。保护您的网站免受代码注入的影响。
正确的逻辑应该是这样的:
输入:
原始输入-> 验证(客户端)-> 发送到服务器-> 再次验证(服务器端)-> SQL 清理-> 存储在数据库中。
输出:
从 DB 读取数据 -> 清理 HTML 和 JS -> 打印到屏幕。