如果手动添加了不正确的URL参数,则将页面转移到新URL-PHP

如果手动添加了不正确的URL参数,则将页面转移到新URL-PHP,php,mysql,security,http-headers,Php,Mysql,Security,Http Headers,我有一个删除页面,显示MySQL数据库中的用户记录 delete功能是用一个PHP准备好的语句完成的,执行该语句后,用户被引导回index.PHP(它显示了所有用户的表) 在下面代码中处理删除记录的$\u POST请求上方,我有一个if语句,用于检查“id”url参数,如果它不存在,它会将您发送回index.php。我是这样设置的,因此如果有人将id=45url参数更改为delete=45,出于安全原因,它会将它们从页面中发送出去 如果用户键入不同的url参数值(数据库中不存在),例如id=49

我有一个删除页面,显示MySQL数据库中的用户记录

delete功能是用一个PHP准备好的语句完成的,执行该语句后,用户被引导回index.PHP(它显示了所有用户的表)

在下面代码中处理删除记录的$\u POST请求上方,我有一个if语句,用于检查“id”url参数,如果它不存在,它会将您发送回index.php。我是这样设置的,因此如果有人将
id=45
url参数更改为
delete=45
,出于安全原因,它会将它们从页面中发送出去

如果用户键入不同的url参数值(数据库中不存在),例如
id=49
,它会使用添加了位置字符串的
header()
方法将用户发送到错误页面/不同页面,有没有办法做到这一点

我尝试了
标题(“位置:“.$\u服务器[“HTTP\u REFERER]”)
我认为这将有效地将页面重新生成为url参数更改之前的页面,但我收到错误消息
未定义索引:HTTP\u REFERER

任何帮助都将不胜感激

注意:代码下面有一个指向delete.php页面截图的链接

安娜


下面屏幕截图中的表格是如何创建的

<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>firstname</th>
            <th>email</th>
        </tr>
    </thead>
    <tbody>
    <?php 

        $query = "SELECT * FROM users WHERE ID = $the_id";
        $select_posts = mysqli_query($connection, $query);

        while ( $row = mysqli_fetch_assoc($select_posts) ) {

            $user_id = htmlspecialchars($row['ID']);
            $firstname = htmlspecialchars($row['firstname']);
            $email = htmlspecialchars($row['email']);

            echo "<tr>";
            echo "<td>$user_id</td>";
            echo "<td>$firstname</td>";
            echo "<td>$email</td>";
            echo "</tr>";
        }
    ?>
    </tbody>
</table>

身份证件
名字
电子邮件
!php中的st方法 在PHP中,您可以使用
header()
语句中的
$\u SERVER[“HTTP\u REFERER”]
变量,如下所示

header('Location: ' . $_SERVER["HTTP_REFERER"] );
exit;
在header()语句后面加一个exit或代码执行,这是一个好主意,它将像往常一样在脚本的其余部分继续执行

第二种方法脚本

<button onclick="goBack()">Go Back</button>
function goBack() {
window.history.back();
}
返回
函数goBack(){
window.history.back();
}

我希望您能得到问题的答案。

首先使用重定向解决问题:

如果浏览器不提供“Referer”头,重定向将失败,并出现“Undefined index:HTTP\u Referer”错误

你可以做的是:

  • 检查标题是否可用(使用
    isset()
  • 如果存在,就使用它
  • 在另一种情况下使用默认错误链接
  • 如果您使用的是PHP的现代版本(我希望您是),那么可以使用
    ??
    操作符:

    
    
    注意:我个人更喜欢将用户发送到错误url,而不是“返回”,但这取决于您

    第二步解决不存在ID的问题:

    一旦你得到一个ID,你想检查它是否存在,你只需要执行一个SELECT,看看它是否返回了任何记录,使用类似于
    mysqli\u num\u rows
    或它的OO对应项。 完整的代码段如下所示:

    什么说“推荐人”存在?它是否仍然指向您的页面

    • 黑客复制了URL,对其进行了修改,然后将其粘贴到一个新窗口中。没有可“返回”的页面

    • 黑客不知何故让“推荐人”进入他的页面


    你需要假设任何错误都可能意味着一切都是错误的。黑客不应该被发送到404类页面以外的任何地方。

    如果我理解正确…如果$get[]与表中的任何内容不匹配,您正在尝试转移用户的注意力…您可以使用mysqli\u num\u行。。。 下面的代码将转移用户,或者如果没有与id匹配的行,您可以打印其他结果

    <?php 
    
            $query = "SELECT * FROM users WHERE ID = $the_id";
            $select_posts = mysqli_query($connection, $query);
            $num_rows = mysqli_num_rows($select_posts);
    
            if($num_rows==0) {
                    echo "something else"; OR header("Location: errorpage.php");
                             }
                else {
    
           //your while() code here 
                     }
        ?>
    
    
    
    永远不要信任“HTTP\u REFERER”,也不要在防火墙和日志案例之外使用它。“因此,如果url参数不是
    id=
    它只是停留在同一页上,没有任何更改?”-确切地说,停留在什么“同一页”上?如果我试图在我的浏览器中导航到
    yourscriptname.php?foo=bar
    ,那么您现在到底想做什么?Hi@CBroe-我希望这样,如果用户键入的id值与页面上显示的id值不同,它会重定向到不同的页面,或者使用原始值再次加载页面(虽然简单的重新定向就可以了)。我添加了delete.php页面的图像,这样您就可以看到ID值在文档中是如何显示的,并对问题进行了编辑(希望如此)关于我正在尝试做的事情,我更清楚一点。我很感激对php不熟悉,我可能没有正确地处理这个问题。为什么重要呢,无论我是通过单击链接到达delete.php?id=95
    ,还是我可能手动键入该链接?你认为这与安全性有关吗?谁可以删除该链接?那么你真的是从一个完全错误的角度来处理这个问题了-这种检查应该在你执行实际删除时发生,而不是绑定到任何显示触发它的表单的页面上。@CBroe因为当他们在url中手动输入数字时,它会从屏幕上删除表,看起来很奇怪。当我尝试这个方法时正确的网站,你会这样做,要么什么都没发生,要么你被发送回主页。这不起作用。除非我误解了你的答案?我在问题的初始代码块的“其他”部分使用了你的代码。这就是你的意思吗?嗨@Anna_p,应该起作用,我已经更新了我的回复,将代码包含在其中。不,这不起作用'也不起作用。它只是有同样的问题。如果有人在url参数中键入一个不存在的id值,表就会消失。它不会重定向。对!这只是解决了缺少
    $\u GET['id'的问题
    ,我将修改我的回复,包括检查id是否存在。这仍然不起作用。我似乎在倒退。另外,当“htmlspecialchars()”将所有数据转换为strin时,为什么我需要在从数据库读取数据时使用准备好的语句
    <?php 
    
            $query = "SELECT * FROM users WHERE ID = $the_id";
            $select_posts = mysqli_query($connection, $query);
            $num_rows = mysqli_num_rows($select_posts);
    
            if($num_rows==0) {
                    echo "something else"; OR header("Location: errorpage.php");
                             }
                else {
    
           //your while() code here 
                     }
        ?>