如果手动添加了不正确的URL参数,则将页面转移到新URL-PHP
我有一个删除页面,显示MySQL数据库中的用户记录 delete功能是用一个PHP准备好的语句完成的,执行该语句后,用户被引导回index.PHP(它显示了所有用户的表) 在下面代码中处理删除记录的$\u POST请求上方,我有一个if语句,用于检查“id”url参数,如果它不存在,它会将您发送回index.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
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()
)李>
??操作符:
注意:我个人更喜欢将用户发送到错误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
}
?>