$ _GET的FILTER_SANITIZE_ *函数

时间:2015-02-18 16:16:33

标签: php sanitization

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

  • FILTER_SANITIZE_ENCODED

  • FILTER_SANITIZE_STRING

  • FILTER_SANITIZE_URL

这是我的情况:

我正在构建一个请求处理程序类,它应该从$_GET$_POST返回变量。此值将用于其他类

这是我到目前为止所做的事情(仍然草稿

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;
    }

}

然后我可以使用像

这样的类
$a = new RequestHandler($_GET, $_POST, $_COOKIE, $_SESSION);

在我的二传手或我的构造函数中,我应该在哪里进行这种卫生

1 个答案:

答案 0 :(得分:3)

您正在编写通用类以从HTTP请求中获取数据。

没有理智的方法来消毒它。

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

数据应该是什么

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

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

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

数据应该是纯文本吗?好吧,它可能包含<'等字符,这些字符在各个地方都有特殊含义(例如HTML和SQL),它们可能完全合法地用于文本所讨论的任何内容。你无法完全过滤掉它们而不会破坏人们想说的话。

大多数情况下,你会想要:

  • 允许非常窄输入
  • 对输入没有限制

数据的去向

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

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


简而言之:

  • 当数据进入您的程序时,请不要专注于保护/过滤数据。
  • 在您的程序中进行过滤,了解数据应该是什么。
  • 在将数据从PHP移动到其他语言或格式之前处理安全风险。