PHP - 清理所有数据?

时间:2010-10-29 16:55:58

标签: php security

我正在制作一个可以由第三方开发者扩展的CMS。在过去,我遇到了新手开发人员一起忽视安全性的问题。当他们将模块放在我的网站上时,他们可能会破坏用户网站。

我想创建一个全局对象。这将使用已清理的副本覆盖所有全局变量。这可能会导致问题,因此该对象还将提供获取未经过数据处理的数据的选项。

这样,默认情况下,开发人员理论上可以做这样的事情,它的效果不会像通常那样糟糕。 (显然,这仍然可能导致问题,但不会丢弃表,也不会暴露数据。)

mysql_query("INSERT INTO users (`name`) VALUES ('{$_POST['name']}')");

这并不能防止有意破坏事物的开发者。但是,它有助于消除基本错误。

将按如下方式访问结束对象。

$_POST['key']; // Provides Sanitized version of the post key.
$obj->post('key'); // Provides Sanitized version of the post key.
$obj->post_raw('key'); // Provide unsanitized version of the post key.

人们对这种方法有何看法?是否有一个经证实的“逃避所有”功能可以实现这一目标?

4 个答案:

答案 0 :(得分:2)

你基本上是在谈论重新实现magic_quotes_gpc。当Zend做到这一点时,情况并不好。

最大的问题是1)不同形式的数据保护对于不同的环境是必要的,2)如果有人太过于使用基本数据安全,那么他们绝对太多一个菜鸟,以了解您的自动保护机制应用于哪些数据,以及哪些数据没有。 (他们将从您的机制不能和不能触摸的地方获取数据;将此作为给定。)

答案 1 :(得分:1)

不,具有通用的消毒功能真的很难。它始终是特定用途的。因此,让我推荐别的东西:

http://sourceforge.net/p/php7framework/wiki/input/

它基本上用对象覆盖超全局$ _GET,$ _POST。这可以防止原始访问,如果没有使用适当的过滤器,您会收到通知或记录错误。您仍然需要考虑使用哪个过滤器,但至少可以使用此方法来强制共同开发人员花费几秒钟来考虑它。这也很容易申请:

 $_GET->text["comment"]

 mysql_query("SELECT '{$_REQUEST->sql[field]}'");

 $_POST->nocontrol->utf7->xss->text["text"];

也可以预定义特定输入变量名称的过滤器列表。或者使用$_POST->xss->nocontrol->always();为所有旧数组访问设置一个过滤器它需要一些习惯,但它确实是最简单的API,仅适用于您描述的情况。

答案 2 :(得分:0)

您可能需要查看http://code.google.com/p/inspekt/,这几乎已经完成了您所描述的内容。

答案 3 :(得分:0)

安全是一个非常复杂和微妙的主题恕我直言。

我不确定您是否应该允许不安全地访问数据。我只访问已清理的内容,并强制使用预准备的语句。​​