我已经使用PHP一段时间了,我开始问自己,我是否养成了良好的习惯。
其中一个是我相信过度使用PHP清理方法,例如,一个用户通过表单注册,我得到以下帖子变量:
$_POST['name']
,$_POST['email']
和$_POST['captcha']
。现在,我通常做的事情显然是清理我要放入MySQL的数据,但是在比较验证码时,我也会对它进行清理。
因此我相信我误解了PHP消毒,我很好奇,当你需要消毒数据时除了使用它在MySQL中放置东西时还有其他任何情况(注意我知道还需要消毒以防止XSS攻击)。而且,我的习惯是消毒几乎所有来自用户输入的变量,这是一个糟糕的变量吗?
答案 0 :(得分:3)
每当您在某个地方存储数据时,如果该数据将被(毫无戒心的)用户读取/可用,那么您必须对其进行清理。因此,应该注意可能改变用户体验(不一定只是数据库)的东西。通常,所有用户输入都被认为是不安全的,但您会在下一段中看到某些内容可能仍会被忽略,但我不建议这样做。
仅在客户端上进行消毒只是为了获得更好的用户体验(用户体验,考虑表单的JS验证 - 从安全的角度来看,它是无用的,因为它很容易避免,但它可以帮助非恶意用户拥有更好地与网站互动)但基本上,它不会造成任何伤害,因为一旦会话结束,数据(好的或坏的)就会丢失。你总是可以为你自己(在你的机器上)销毁一个网页,但问题是有人可以为他人做这件事。
更直接地回答您的问题 - 永远不要担心过度使用它。安全而不是遗憾总是更好,成本通常不会超过几毫秒。
答案 1 :(得分:3)
您需要搜索的术语是FIEO。滤波器输入,转义输出。
如果你不理解这个基本原则,你很容易混淆自己。
想象一下,PHP是中间的人,用左手接收并用右边开出。
用户使用您的表单并填写日期表单,因此它应该只接受数字,也许是破折号。例如NNNNN-NN-NN。如果你得到的东西与之不符,那就拒绝它。
这是过滤的一个例子。
下一个PHP,用它做一些事情,让我们把它存储在Mysql数据库中。
要保护Mysql不受SQL注入的影响,因此您使用PDO或Mysqli的预处理语句来确保即使您的过滤器失败,也不能允许对您的数据库进行攻击。这是Escaping的一个示例,在这种情况下是为SQL存储转义。
稍后,PHP从您的数据库中获取数据并将其显示在HTML页面上。因此,您需要转义下一个媒体HTML的数据(这是您可以允许XSS攻击的地方)。
在你的头脑中,你必须划分每个PHP'保护'函数分为这两个系列中的一个或另一个,Filtering或Escaping。
Freetext字段当然比过滤日期更复杂,但没关系,坚持原则,你就可以了。