$_GET 的 FILTER_SANITIZE_* 函数
Which FILTER_SANITIZE_* function for $_GET
我需要清理来自 $_GET
变量的数据,但我不确定要使用列表中的哪一个
FILTER_SANITIZE_ENCODED
FILTER_SANITIZE_STRING
FILTER_SANITIZE_URL
这是我的情况:
我正在构建一个请求处理程序 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 转移到其他语言或格式之前处理安全风险。
我需要清理来自 $_GET
变量的数据,但我不确定要使用列表中的哪一个
FILTER_SANITIZE_ENCODED
FILTER_SANITIZE_STRING
FILTER_SANITIZE_URL
这是我的情况:
我正在构建一个请求处理程序 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 转移到其他语言或格式之前处理安全风险。