如何防止用户创建虚假的$ _GET值?

时间:2019-07-15 21:04:25

标签: php get

我一直在用PHP OOP创建我的第一个大项目。 用户提交动态创建的表单时,数据将保存在$_GET数组(va,vb,vc,vd)中。 但是以这种形式输入的文本数取决于数据库结果(可能只有va,可能是va和vb,可能是va,vb和vc等)。这些值是进行计算所必需的。 问题是-如果用户伪造这些$_GET元素来更改文本输入或链接的名称怎么办?计算将是错误的,否则它们将返回错误。 我尝试在创建动态表单时保存正确的元素,然后将其与$_GET元素进行比较,如下所示:

foreach ($_GET as $value) {
    $search = false;
    foreach ($_SESSION['correctVars'] as $var) {
        if (array_key_exists($var, $_GET)) {
            $search = true;
        }
    }
    if ($search === false) {
        exit('WRONG DATA');
    }
}

但它不起作用。

2 个答案:

答案 0 :(得分:0)

过早,我可能想念一个更好的主意,但是:

$_GET = array('va'=>'1', 'vb'=>'7' );

$correctVars = array('va', 'vb', 'vc', 'vd');

$x=count(array_intersect_key($_GET, array_flip($correctVars))); 

if($x != count($_GET)){
    echo 'bad data';
}

我们获得了也允许的get中的键计数。如果所有get的计数都不匹配,则表明数据有问题。

您可以通过在此处测试2个get数组版本来对其进行测试:http://ideone.com/v2sUv1

答案 1 :(得分:0)

您可以使用array_diff仅获取无效键,然后执行您想要的操作,在我的示例中,我告诉用户这些参数是语音输入,但是您可以使用逻辑来die()或重定位等等。

<?php
    # input url -> localhost/index.php?trey=awesome&bake=not&mum=cool
    $getKeys = array_keys($_GET);
    $allowedKeys = ['mum'];

    $diff = array_diff($getKeys, $allowedKeys);

    if (count($diff) > 0) {
        echo 'Bad params: '. implode(', ', $diff);
    }

array_diff()将返回不匹配的数组,这意味着我们可以跟踪什么是“假”。