2012-11-02 55 views
-1

我试图找到在PHP中消毒请求的最佳方式。在PHP中消毒全局数组

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

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

当然,我可以创建功能,消毒这些变量,并通过调用类似Class::post('name'),或Class::get('name')一切都将是安全的。但是如果将来使用我的代码的人会忘记它,并使用临时$_POST['name']而不是我的功能呢?我可以提供,还是应该在这里提供一点安全性?

回答

0

当PHP读取它们时,变量基本上被“消毒”了。意思是如果我提交

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

然后,就PHP而言,它不会是一个问题 - 您将获得该字符串。

但是,将它从PHP传递到其他位置时,务必确保“别的东西”不会误解字符串。所以,如果它进入MySQL数据库,那么你需要根据MySQL规则(或使用准备好的语句,这将为你做这件事)逃避它。如果进入HTML,则需要将<编码为&lt;作为最小值。如果它进入JavaScript,那么你需要对其进行JSON编码,等等。

0

你可以做这样的事......不是万无一失的,但它的工作原理..

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

    $_POST[$key] = $val; 
} 

编辑:你会希望把这个作为靠近头,你可以得到。我通常把我的控制器放在控制器中,所以它自动地从__construct()执行。

0

将$ _POST数组替换为一个像数组一样进行缓冲的sanitizer对象。

2

从来没有一种万能的消毒方法。 “消毒”意味着你操纵一个值来符合某些特性。例如,您将某个应该是数字的内容投射到数字上。或者,您可以将<script>标签脱离应有的HTML。什么以及如何净化取决于价值应该是什么以及是否需要消毒。例如,为白名单标签清理HTML非常复杂。

因此,没有魔术Class::sanitize它适合一切。任何人使用你的代码需要认为关于他们正在尝试做什么。如果他们只是盲目地使用$_POST值,他们已经失败了,需要打开他们的编程器卡。

总是需要做的是根据上下文转义。但是,由于这取决于上下文,所以只有在必要时才会这样做。你不要盲目逃避所有的$_POST值,因为你不知道你在逃避。有关整个主题的更多背景信息,请参阅The Great Escapism (Or: What You Need To Know To Work With Text Within Text)