$ _REQUEST变量会导致代码执行吗?

时间:2017-10-07 18:37:48

标签: php security phpmailer

嘿,我想知道每个人都应关心的$ _REQUEST变量背后是否隐藏着任何漏洞。假设我们有PHPMailer库,我们通过html表单标记调用mail.php:

    ...
    //mail.php

    //send email
    $email = $_REQUEST['email'] ;
    $name = $_REQUEST['name'] ;
    $subject = 'mail test';
    $message = $_REQUEST['message'] ;
    $tel = $_REQUEST['tel'];
    $formcontent=" From: $name \n e-mail: $email \n Telephone: $tel \n Message: $message";

    require 'PHPMailer/PHPMailerAutoload.php';
    ....

    $mail = new PHPMailer;
    $mail->Subject = $subject;
    $mail->Body = $formcontent;
    $mail->send();

    ...

实际上是否有人通过发送一些会导致任意代码执行或类似内容的“邪恶”字符来伪造有效负载?

1 个答案:

答案 0 :(得分:3)

我决定做出更详细的回答,因为安全很重要。

$_REQUEST不是问题,有人使用它是问题所在。 $_REQUEST只是$_GET$_POST$_COOKIE的总和。所以相同的原则适用于$_REQUEST

首先,如果您尝试遵循&#34的原则;不信任来自用户的任何数据" ,您将会知道下一步该做什么。

任何数据的重要部分,无论它来自何处,都是关于它到底的地方。因此,如果您将数据放入HTML模板并且不会逃避重要的HTML字符,那么这可能会导致网站损坏或被黑。如果数据传送到数据库或任何其他目的地,情况也是如此。

在你的情况下,你使用PHPMailer,我不知道有多少安全性在那里实现,如果PHPMailer没有做任何转义,可能是有人在邮件中添加了你不想要的东西。

$_REQUEST还有一个问题。因为它是$_GET$_POST$_COOKIE的总和,可能是因为您没有看到所有数据,或者您认为这是来自您的网址但来自一个Cookie。

如果例如$_GET$_COOKIE具有相同的密钥,则会出现这种情况,而不是只根据您的配置看到一个值。这就是为什么我更喜欢使用$_GET$_POST$_COOKIE,但其他主体仍然有效。