0

我在其中调用我的主页 framework_ui.php 我需要 auth.php ,其中我有一个过滤器功能。

function filter($data)
{
   // normalize $data because of get_magic_quotes_gpc
   $dataNeedsStripSlashes = get_magic_quotes_gpc();
   if ($dataNeedsStripSlashes) {
       $data = stripslashes($data);
   }
   // normalize $data because of whitespace on beginning and end
   $data = trim($data);
   // strip tags
   $data = strip_tags($data);
   // replace characters with their HTML entitites
   $data = htmlentities($data);
   // mysql escape string    
   $data = mysql_real_escape_string($data);
   return $data;
}

在每个带有 get 和 post 变量的页面上,我都会执行以下操作:(并调用我的 framework.php)

// filter GET values
foreach ($_GET as $key => $value) {
    $get[$key] = filter($value);
}
// filter post
foreach ($_POST as $key => $value) {
    $post[$key] = filter($value);
} 

如果我将上述函数设为并在每个页面上调用它,该函数是否仍能正常运行?

function filter_all() {
// filter GET values
foreach ($_GET as $key => $value) {
    $get[$key] = filter($value);
}
// filter post
foreach ($_POST as $key => $value) {
    $post[$key] = filter($value);
}
}

我知道这不是最安全的方法,但是我想知道这种事情是否可能并且不会对我的代码产生负面影响。

4

2 回答 2

2

您的 filter_all() 函数不返回任何内容,并且它不会修改 $_GET 和 $_POST 全局变量,因此在您的函数完成运行这些原始变量后,您的 foreach 循环将实际上是相同的。如果您打算使用它们,则应该直接操作 $_GET/$_POST 或全局 $get/$post 或返回两者的某种组合。除此之外,您的计划并没有什么负面影响。

如果您打算每次都这样做,那么最好不要创建一个函数,而只包含一个文件(如您的 framework_ui.php),它只是执行循环并过滤变量。

zerkms 是正确的,尽管您的过滤器功能并不理想,因为它不安全,事实上,如果您计划重新显示用户提交的信息(以及许多其他事情),mysql_real_escape_string 会导致问题。

引用 OWASP ESAPI 项目页面:

不要编写自己的安全控制!在为每个 Web 应用程序或 Web 服务开发安全控制时重新发明轮子会导致时间浪费和大量安全漏洞。OWASP 企业安全 API (ESAPI) 工具包可帮助软件开发人员防范与安全相关的设计和实施缺陷。http://code.google.com/p/owasp-esapi-php/

于 2012-07-18T22:31:01.133 回答
1

您只需进行一些调整以确保“过滤”值可用于其余代码。有几种方法可以做到这一点,将它们标记为global或返回它们;可能第二种选择通常被认为更清洁。这是一个例子:

function filter_all() {
    $get  = array();
    $post = array();

    // filter GET values
    foreach ($_GET as $key => $value) {
        $get[$key] = filter($value);
    }
    // filter post
    foreach ($_POST as $key => $value) {
        $post[$key] = filter($value);
    }
    return array(
            'get'  => $get,
            'post' => $post);
}

$aFilteredInput = filter_all();
$get  = $aFilteredInput['post'];
$post = $aFilteredInput['post'];
于 2012-07-18T22:26:19.460 回答