代码之家  ›  专栏  ›  技术社区  ›  Tarik

array\u map/array\u walk不断报告无效回调、未找到和/或未定义

php
  •  0
  • Tarik  · 技术社区  · 15 年前

    我只是想要一个更优雅的自动化解决方案来验证我的表单。在PHP.net我找到一个很酷的 class 从SQL注入页中删除脚本。这是代码(已修改)。它应该经过我的检查 $_POST 数组并应用验证函数。

    class secure
    {   
        function secureSuperGlobalPOST($v)
        {
        $_POST[$v] = htmlspecialchars(stripslashes($_POST[$v]));
        $_POST[$v] = str_ireplace("script", "blocked", $_POST[$v]);
        $_POST[$v] = mysql_escape_string($_POST[$v]);
        return $_POST[$v];
        }
    
        function secureGlobals()
        {
        // This was originally array_walk; I'm just trying to figure out what's up...
        array_map('secureSuperGlobalPOST', $_POST);
        }
    }
    
    // This last line is attempt at using it. This was not provided with the code.
    secure::secureGlobals();
    

    所以我得到一个错误:

    _警告:array\u map()要求参数1是有效的回调,在C:\wamp\www\mysite中找不到函数'secureSuperGlobalPOST'或函数名无效\寄存器.php第19行”_

    我一直在寻找,但我不明白为什么它是无效的,找不到(它在同一个类中),或者为什么它是无效的名称(它的确切名称是相同的!)。

    2 回复  |  直到 14 年前
        1
  •  8
  •   bcosca    15 年前

    将secureSuperGlobalPOST声明为静态并使用:

    return array_map('self::secureSuperGlobalPOST', $_POST);
    

    或:

    return array_map(array('self','secureSuperGlobalPOST'), $_POST);
    

    return array_map(array('secure','secureSuperGlobalPOST'), $_POST);
    

    但您仍然必须在上一条语句中捕获返回值。

    $result=secure::secureGlobals();
    
        2
  •  3
  •   NullUserException Mark Roddy    15 年前

    那是因为 secureSuperGlobalPOST 不是全局函数。

    您必须将其从类中取出,或者将其设置为静态方法并使用:

    array_map('secure::secureSuperGlobalPOST', $_POST);
    

    顺便说一下,您使用回调的方式不正确。更好的方法是:

    function secureVar($v)
    {
        return mysql_escape_string(htmlspecialchars(
                   str_ireplace("script", "blocked", $v)));
    }
    

    array_walk($_POST, 'secure::secureVar');
    array_walk($_GET,  'secure::secureVar');
    

    所以你可以重复使用代码。


    我想指出的另一点是,这不是避免XSS的正确方法。这是懒惰的方式。你不应该那样做。如果你的用户输入了一个文本说:“我读了你的脚本”?因为它是,它会被转换成“我读你的封锁”。

    推荐文章