我正在制作一个可以由第三方开发者扩展的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.
人们对这种方法有何看法?是否有一个经证实的“逃避所有”功能可以实现这一目标?
答案 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)
安全是一个非常复杂和微妙的主题恕我直言。
我不确定您是否应该允许不安全地访问数据。我只访问已清理的内容,并强制使用预准备的语句。