0

我正在尝试找到在 PHP 中清理请求的最佳方法。

从我读到的内容中,我了解到只有在显示 GET 变量时才应该对其进行清理,而不是在“请求流”开始时进行清理。发布变量(不是来自数据库)。

我可以在这里看到几个问题:

当然,我可以创建清理这些变量的函数,并通过调用类似Class::post('name'), 或者Class::get('name')一切都是安全的。但是,如果将来使用我的代码的人会忘记它并使用casual $_POST['name'] 而不是我的函数怎么办?我可以提供,还是应该在这里提供一些安全性?

4

4 回答 4

3

从来没有一种万能的消毒方法。“清理”意味着您操纵一个值以符合某些属性。例如,您将应该是数字的东西转换为数字。或者你<script>从假定的 HTML 中去除标签。清理什么以及如何清理取决于价值应该是什么以及您是否需要进行清理。例如,为白名单标签清理 HTML 非常复杂。

因此,没有什么魔法Class::sanitize可以同时适用于所有事物。任何使用您的代码的人都需要考虑他们想要做什么。如果他们只是盲目地$_POST按原样使用值,他们已经失败了,需要上交他们的程序员卡。

始终需要做的是根据上下文进行转义。但由于这取决于上下文,因此您只在必要时才这样做。你不会盲目地逃避所有$_POST的价值观,因为你不知道你在逃避什么。有关整个主题的更多背景信息,请参阅The Great Escapism(或:使用文本中的文本需要知道的内容)。

于 2012-11-02T15:03:01.343 回答
0

当 PHP 读取变量时,这些变量基本上被“清理”了。意思是如果我要提交

"; exec("some evil command"); $blah="

那么就 PHP 而言,这不会是一个问题 - 你会得到那个文字字符串。

但是,当将它从 PHP 传递给其他东西时,确保“其他东西”不会误解字符串是很重要的。因此,如果它要进入 MySQL 数据库,那么您需要根据 MySQL 规则对其进行转义(或使用准备好的语句,这将为您执行此操作)。如果要进入 HTML,则至少需要进行<编码&lt;。如果它要进入 JavaScript,那么您需要对它进行 JSON 编码,依此类推。

于 2012-11-02T15:00:07.040 回答
0

你可以做这样的事情......不是万无一失的,但它有效..

foreach($_POST as $key => $val)
{
  //do sanitization
  $val = Class::sanitize($val);

  $_POST[$key] = $val;
}

编辑:你想把它放在尽可能靠近标题的地方。我通常将我的放在控制器中,以便它__construct()自动执行。

于 2012-11-02T15:00:31.243 回答
0

将 $_POST 数组替换为行为类似数组的 sanitizer 对象。

于 2012-11-02T15:01:08.493 回答