PHP中多个GET变量的故障排除


Troubleshooting multiple GET variables In PHP

这可能是一个非常简单的问题,但我不知道这里做错了什么。。。

为了解释清楚,我在下面举了一个非常简单的例子:

<ul>
    <li><a href="test.php?link1=true">Link 1</a></li>
    <li><a href="test.php?link2=true">Link 2</a></li>
    <li><a href="test.php?link3=true">Link 3</a></li>
</ul>
<?php 
    if(isset($_GET['link1'])) {
        if(($_GET['link1']) == 'true') {
            echo 'This Is Link 1';
        }
    }
    if(isset($_GET['link2'])) {
        if(($_GET['link2']) == 'true') {
            echo 'This Is Link 2';
        }
    }
    if(isset($_GET['link3'])) {
        if(($_GET['link3']) == 'true') {
            echo 'This Is Link 3';
        }
    }
?>

这是一个test.php页面,在这里我为$_GET设置了3个不同的参数,并相应地显示内容,现在一切都很完美,唯一不明白的是如何阻止这种url,比如

如果用户点击链接1,url将为:

http://localhost/test.php?link1=true

这个url的输出是这是链接1

现在,如果我将此url更改为:

http://localhost/test.php?link3=true&link2=true&link1=true

我得到的输出是这是链接1这是链接2这是链接3

现在这在这里是可以的,但如果有人把这个和see的表格一个接一个地打出来,那就很烦人了,有什么办法可以阻止这种篡改吗?

使用elseif而不是单独的if语句。这样,只会执行一个(第一个条件为true)。

<?php 
if(isset($_GET['link1'])) {
    if(($_GET['link1']) == 'true') {
        echo 'This Is Link 1';
    }
} elseif(isset($_GET['link2'])) {
    if(($_GET['link2']) == 'true') {
        echo 'This Is Link 2';
    }
} elseif(isset($_GET['link3'])) {
    if(($_GET['link3']) == 'true') {
        echo 'This Is Link 3';
    }
}
?>

一种更稳健的方法可能是为每个链接使用相同的参数名称,但改变值。例如

<a href="test.php?link=link1">Link 1</a>
<a href="test.php?link=link2">Link 2</a>
<a href="test.php?link=link3">Link 3</a>

这样,即使有人在查询字符串中指定了多个值,也只能使用其中一个值。

您使用的是连续的if语句,因此可以满足所有情况,并且可以响应所有输出。

if(isset($_GET['link3'])) {
    if(($_GET['link3']) == 'true') {
        echo 'This Is Link 3';
    }
}
// Nothing stops the next if working here.

您可以查看switch语句并检查第一个语句,或者使用相同的?link=并在每个链接中向其传递不同的数据,以便只满足一个if语句。