我一直在用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');
}
}
但它不起作用。
答案 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()
将返回不匹配的数组,这意味着我们可以跟踪什么是“假”。