【问题标题】:PHP: How to mass replace $_POST[...] with strip_tags($_POST[...])PHP:如何用 strip_tags($_POST[...]) 批量替换 $_POST[...]
【发布时间】:2011-04-03 12:51:05
【问题描述】:

我目前正从一次严重的 XSS 攻击中恢复过来,并意识到我从未对我网站上的几个表单上的输入进行清理。我使用 Notepad++ 的 Find In Files 功能在我的所有 PHP 文件中搜索 $_POST,并获得了近 5,000 个结果。现在,我真的不想去手动将strip_tags 添加到这些结果中的每一个,但是全部替换并不能解决问题……而且我完全是个菜鸟,比如正则表达式。

有什么办法可以让这件事变得不那么乏味吗?

【问题讨论】:

    标签: php forms input sanitize strip-tags


    【解决方案1】:

    只需使用array_map()

    $Clean = array_map('strip_tags', $_POST);
    

    或者如果你想让它回到$_POST变量:

    $_POST = array_map('strip_tags', $_POST);
    

    尽管使用不同的变量并将文件中所有出现的$_POST 更改为$Clean,这可能是一个更好的主意。

    【讨论】:

      【解决方案2】:

      嗯,我认为array_walk_recursive 可以解决问题:

      function custom_strip(&$val, $index) {
         $val = strip_tags($val);
      }
      array_walk_recursive($_POST, 'custom_strip');
      

      【讨论】:

        【解决方案3】:

        你可以把它放在一个文件中(例如safe.php)

        foreach ($_POST as $key => $value) {
          $_POST[$key] = is_array($key) ? $_POST[$key]: strip_tags($_POST[$key]);
        }
        

        然后将 require_once("safe.php"); 放入每个 php 文件(或所有 php 文件已包含的文件)
        这是一个丑陋的黑客......但它可以节省你的时间。

        【讨论】:

        • 太棒了。这正是我想要的。
        • 当表单字段名称如foo[bar]foo[] PHP 会自动转换为数组时,这将无法防止XSS。
        • @Tgr:是的,这绝对会像你说的那样失败,但我认为他有根据自己的需要定制的想法
        【解决方案4】:

        非常简单。把它放在你的每个文件的顶部,或者放在一个公共的头文件中,每次都在开始时调用它:

        function mystriptag(&$item)
        {
            $item = strip_tags($item);
        }
        
        array_walk($_POST, mystriptag);
        

        【讨论】:

        • 当表单字段的名称如foo[bar]foo[] PHP 自动转换为数组时,这将无法防止XSS。
        【解决方案5】:

        你可以只用array_mapstrip_tags$_POST,但是编写一个自定义函数来从中获取数据要好得多:

        function post_data($name) {
            global $post_cache;
            if (in_array($name, $post_cache)) {
                return $post_cache[$name];
            }
            $val = $_POST[$name];
            if (is_string($val)) {
                $val = strip_tags($val);
            } else if (is_array($val)) {
                $val = array_map('strip_tags', $val);
            }
            $post_cache[$name] = $val;
            return $val;
        }
        

        这将使您的代码更具可读性(其他研究它的人通常会认为$_POST['foo'] 是表单字段foo 中的数据,而不是您已经预处理过的数据),不会导致您出现插件或库问题它尝试直接访问 $_POST ,可以轻松地向$_POST 预处理添加更多逻辑(启用magic quotes 时不转义是一种常见的逻辑),而无需查找代码中使用过POST数据的所有位置,并且当您意识到有一些 POST 字段确实需要 HTML 标记时,可以让您免于头疼。一般来说,直接更改任何超全局变量是一个非常糟糕的主意。

        此外,最好在输出上而不是输入上清理数据。不同的用途需要不同的方法,例如,如果你使用

        <div class="user_photo">
           <img src="<?php echo photo_path($user_id) ?>" alt="<?php echo $user_name ?>" />
        </div>
        

        那么$user_name 是XSS 攻击向量,strip_tags 根本无济于事;你需要htmlspecialchars。如果将用户数据用作 URL,则需要另一种方法来防御 javascript: URL 等。

        【讨论】:

          猜你喜欢
          • 2016-01-28
          • 2014-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多