我是否总是需要验证请求变量

时间:2014-10-11 17:01:35

标签: php

我是否总是需要验证用户输入,即使我实际上没有将它们保存到数据库,文件或使用它们来包含文件等。

说我只想回应一个请求变量,或者我用它来发送电子邮件,有没有必要验证或消毒它?我总是听到有人说在做任何事情之前应该检查所有用户输入,但如果我没有做上述任何事情,它是否会造成任何威胁?

2 个答案:

答案 0 :(得分:0)

我不推荐它。 我的规则是 - 永远不要信任用户的输入。 让我们说你的团队工作。 正如你所写,你构建了一个简单的表单,将数据提交到php文件,而不是邮寄它。 3周后,另一位队友想要使用该表格。 他假设php文件中的数据是干净的。他不知道你不过滤它。 这是一个麻烦的裂缝。

答案 1 :(得分:0)

  

我是否总是需要验证用户输入,即使我实际上没有将它们保存到数据库,文件或使用它们来包含文件等。

您要使用用户提供的数据执行的所有操作都取决于您要使用它的上下文。在你的单句中,你已经在谈论3种不同的上下文(db,file,include)。所有人都需要一个不同的策略来防止特定情境的发生。

  

说我只想回应一个请求变量,或者我用它来发送电子邮件,有没有必要验证或消毒它?

除了验证和消毒之外,您还可以做更多的事情。是的,你应该处理这种情况(这是另一个背景btw)。基本上,您应该处理所有用户数据,就好像它是恶意的一样。即使你是"只是echo它"。当你是echo"时,我可以做很多事情。

考虑到我们在HTML页面的上下文中,我可以(例如但不限于):

<script>location.href='http://example.com/my-malicious-page'</script>

例如,您可以使用登录表单的网站的精确副本。

<script>var cookies = document.cookie; // send cookieinfo to my domain</script>

可用于获取当前域的所有Cookie(可能包括您的会话Cookie)。 (请注意,这可以通过在cookie上设置仅http标志来减轻这种情况。)

<script>document.querySelector('body')[0].appendChild('my maliscious payload containing all kinds of nasty stuff');</script>

这使得有可能对病毒或其他令人讨厌的病毒产生负面影响。

<!--

搞砸你的布局/网站。有几种方法可以做到这一点。

  

我总是听到有人说在使用它之前应该检查所有用户输入

这大多是错的。一旦你知道要用它做什么,你只需要决定如何处理一段数据。这是因为你想在不同的情况下防止不同的事情。一些例子是(但不限于):目录遍历,代码注入,sql注入,xss,csrf。

所有上述攻击媒介都需要不同的策略来阻止它们。

  

但如果我没有做上述任何一项

,它实际上是否构成任何威胁

是完全如上所述。所有来自第三方的数据(这意味着用户输入以及外部服务以及来自数据库的数据)都应被视为传染病。