array_map / array_walk保持报告无效回调,未找到和/或未定义

时间:2010-08-16 18:40:45

标签: php

我只想要一个更优雅的自动化解决方案来进行表单验证。在PHP.net上,我从SQL注入页面找到了一个很酷的class脚本。这是代码(修改过)。我想通过我的$_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_map()要求参数1是有效的回调函数,找不到函数'secureSuperGlobalPOST'或在第19行的C:\ wamp \ www \ mysite \ register.php中找到无效的函数名”_

我一直在寻找,但我无法弄清楚为什么它不会有效,没有找到(它在同一个类中),或者为什么它会是无效的名称(它的名称相同!)。

2 个答案:

答案 0 :(得分:8)

将secureSuperGlobalPOST声明为static并使用:

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

或:

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

如果您不希望secureGlobalPOST成为静态方法:

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

但你仍然必须在上一个陈述中捕捉到返回值。

$result=secure::secureGlobals();

答案 1 :(得分:3)

那是因为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的正确方法。这是懒惰的方式。你不应该这样做。如果您的用户输入的文字说“我读过您的剧本”,该怎么办?事实上,它会被转换为“我读你的被封锁”。