在PHP中使用isset和filter_input正确的方法

时间:2014-05-19 07:25:45

标签: php isset superglobals

我正在为一些简单的功能开发基本API。我正在捕捉如下的输入:

if ($action == 'delete' && isset($_POST['targetId']) && isset($_POST['userId'])) {
//The isset causes "Do not access Superglobal _POST array directly" warning in Netbeans
        $userId = filter_input(INPUT_POST, 'userId');
        $beamId = filter_input(INPUT_POST, 'targetId');
}

我是否应该使用filter_input来检查是否设置了值?像:

if ($action == 'delete' && filter_input(INPUT_POST, 'targetId') && filter_input(INPUT_POST, 'userId')) {

}

我不是在考虑这里的选择,而是对最安全和防黑客的最正确的解决方案感到满意。

编辑:是的,上述信息将用作SQL的输入

3 个答案:

答案 0 :(得分:7)

另一个解决方案可能是使用filter_has_var()。

if (filter_has_var(INPUT_POST, "userId") {
    //occurs when $_POST['userId'] is set or not null
}

更多信息:Official documentation

答案 1 :(得分:3)

filter_input用于清理或检查输入的数据类型。它用于确保您期望的数据采用所需的格式,并且您可以使用所需的过滤器对其进行清理。在您的情况下,isset将检查是否设置了所需的变量(或不是NULL)。所以两者都有不同的用例。我没有看到直接在POST项目上使用isset但是我建议使用filter_input以便也可以验证数据。

答案 2 :(得分:2)

未经过滤的输入的主要问题主要是代码注入。这是一个问题,您将输入用作SQL语句的一部分或输出回用户(JavaScript)。

因此,没有必要只检查是否输入了值。最好是保持一致并首先使用filter_input填充变量,然后使用这些变量来检查字段是否已填充,如果您将在稍后的脚本中使用该值。