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


Do I always need to validate request variables

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

假设我只是想回显一个请求变量,或者我正在使用它发送电子邮件,是否需要对其进行验证或消毒?我一直听到人们说,在使用它之前,应该检查所有用户输入,但如果我不做以上任何一项,它真的会构成威胁吗?

我不推荐它。我的规则是-永远不要相信用户的输入。比方说你在一个团队里工作。正如您所写的,您构建了一个简单的表单,将数据提交到php文件,然后再通过邮件发送。3周后,另一位队友想要使用这种形式。他假设php文件中的数据是干净的。他不知道你没有过滤。这是解决麻烦的办法。

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

你要用用户提供的数据做的一切都取决于你要使用它的上下文。在你的一句话中,你已经谈到了3个不同的上下文(db、file、include)。所有这些都需要一种不同的策略来防止特定情况下的事情发生。

假设我只是想回显一个请求变量,或者我正在使用它发送电子邮件,是否需要对其进行验证或消毒?

除了验证和清理之外,您还可以做更多的事情。是的,你应该处理这个案例(顺便说一句,这是另一个上下文)。基本上,您应该处理所有用户数据,就好像它是恶意的一样。即使你"只是echo"。当你"只是echo ing"的时候,我可以做很多事情。

考虑到我们是在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标志来缓解,imho也应该这样做)。

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

这就有可能将病毒或其他令人讨厌的东西转移到一边。

<!--

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

我一直听到人们说,在使用之前,应该检查所有用户输入

这在很大程度上是错误的。一旦你知道要如何处理一段数据,你只需要决定如何处理它。这是因为你想在不同的情况下防止不同的事情发生。一些示例包括(但不限于):目录遍历、代码注入、sql注入、xss、csrf。

所有上述攻击媒介都需要不同的策略来预防。

但如果我不做任何上述,它真的会构成威胁吗

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