$_GET 的 FILTER_SANITIZE_* 函数

Which FILTER_SANITIZE_* function for $_GET

我需要清理来自 $_GET 变量的数据,但我不确定要使用列表中的哪一个

这是我的情况:

我正在构建一个请求处理程序 class,它应该 return 来自 $_GET$_POST 的变量。此值将用于其他 classes

这是我目前所做的(仍然是草稿

class RequestHandler
{
    protected $getRequest;
    protected $postRequest;
    protected $cookieRequest;
    protected $sessionRequest;

    public function __construct($getRequest = null, $postRequest = null, $cookieRequest = null, $sessionRequest = null)
    {
        if ($getRequest)
            $this->setGetRequest($getRequest);

        if ($postRequest)   
            $this->setPostRequest($postRequest);

        if ($cookieRequest)
            $this->setCookieRequest($cookieRequest);

        if ($sessionRequest)    
            $this->setSessionRequest($sessionRequest);
    }

    public function setGetRequest($getRequest)
    {
        $this->getRequest = $getRequest;
        return $this;
    }

    public function setPostRequest($postRequest)
    {
        $this->postRequest = $postRequest;
        return $this;
    }

    public function setCookieRequest($cookieRequest)
    {
        $this->cookieRequest = $cookieRequest;
        return $this;
    }

    public function setSessionRequest($sessionRequest)
    {
        $this->sessionRequest = $sessionRequest;
        return $this;
    }

    public function getGetRequest()
    {
        return $this->getRequest;
    }

    public function getPostRequest()
    {
        return $this->postRequest;
    }

    public function getCookieRequest()
    {
        return $this->cookieRequest;
    }

    public function getSessionRequest()
    {
        return $this->sessionRequest;
    }

}

然后我可以使用 class 之类的

$a = new RequestHandler($_GET, $_POST, $_COOKIE, $_SESSION);

我应该在哪里进行清理,在我的 setter 或我的构造函数中

您正在编写一个通用的 class 来从 HTTP 请求中获取数据。

没有合理的方法来清理它。

为了确保数据安全,您需要考虑两件事(并且在编写用于从 HTTP 请求中提取数据的通用 class 时您无法知道其中任何一件事):

数据应该是什么

数据应该是某人的出生日期吗?然后你需要检查它是否是一个有效的日期。

数据应该是某人的地址吗?那你need to be very careful about what you think is allowed.

数据应该是原始数据吗HTML?如果您计划将其放入 HTML 文档中,那么您将面临各种风险,您需要考虑您对发送数据的人的信任程度 and/or 使用 HTML Purifier 之类的东西限制可以使用哪些标签和属性。

数据应该是纯文本吗?嗯,它可能包括像 <' 这样的字符,它们在不同的地方有特殊的含义(例如 HTML 和 SQL)并且它们可能在上下文中完全合法地使用无论文本在谈论什么。你不能在不破坏人们想要说的内容的情况下完全过滤掉它们。

大多数时候,您会想要:

  • 允许非常范围狭窄的输入集
  • 不限制输入

数据去向

通常,您通过转义来确保数据安全。如何逃脱它取决于你把它放在哪里。

对于 SQL,您通常会使用带占位符的准备语句。对于 XML,您通常会使用 DOM 库。对于 HTML,您通常会使用 htmlspecialchars()。等等。


简而言之:

  • 不要关注进入程序的 securing/filtering 数据。
  • 在您知道数据应该是什么的程序中进行过滤。
  • 在将数据从 PHP 转移到其他语言或格式之前处理安全风险。