Php 分页-如何进行&x27;是否不允许用户进一步查看现有页面?
抱歉,如果问题的标题太糟糕,我是php新手,我不知道是否有一个特定的名称 我只有2条记录,我将分页限制为每页仅显示1条记录,然后我将有2个页面,如果我在URL上写入,Php 分页-如何进行&x27;是否不允许用户进一步查看现有页面?,php,sql,pdo,pagination,get,Php,Sql,Pdo,Pagination,Get,抱歉,如果问题的标题太糟糕,我是php新手,我不知道是否有一个特定的名称 我只有2条记录,我将分页限制为每页仅显示1条记录,然后我将有2个页面,如果我在URL上写入,&tab=-2,&tab=-1,&tab=0,&tab=3,&tab=4,我可以在当前代码上访问这些页面,&tab=5我可以转到该页面,在该页面上我将看不到任何记录,因为正如我所说,我只有2页 我的问题: 1。有任何安全问题吗? 2。如何不允许用户进一步访问现有页面? 这是我的分页代码: <?php if(empty($_
&tab=-2
,&tab=-1
,&tab=0
,&tab=3
,&tab=4
,我可以在当前代码上访问这些页面,&tab=5
我可以转到该页面,在该页面上我将看不到任何记录,因为正如我所说,我只有2页
我的问题:
1。有任何安全问题吗?
2。如何不允许用户进一步访问现有页面?
这是我的分页代码:
<?php
if(empty($_GET['tab'])){}else{$page = $_GET['tab'];}
if(isset($page)){$page = $_GET['tab'];}else{$page = 1;}
$maximoVEP = 1;
$startVEP = (($maximoVEP * $page) - $maximoVEP);
$title = 'Asic';
$stmtVEP = $db->prepare("SELECT count(*) FROM table WHERE data = 'vm' AND title = :title");
$stmtVEP->bindValue(':title', $title, PDO::PARAM_STR);
$stmtVEP->execute();
$total = $stmtVEP->fetchColumn();
$total_pages = ceil($total/$maximoVEP);
echo '<nav aria-label="Page navigation example">';
echo '<ul class="pagination paginationEp ml-1 mr-1">';
if ($page >= 2){
echo '<li class="page-item">';
echo '<a class="page-link" href="?p=';
echo htmlentities($slug, \ENT_QUOTES, "UTF-8", false);
echo '&tab='.($page-1).'"><i class="fas fa-angle-left"></i> ANTERIOR</a>';
echo '</li>';
}
echo '<li class="page-item">';
echo '<a class="page-link" href="';
echo htmlentities($slug, \ENT_QUOTES, "UTF-8", false);
echo '"><i class="fas fa-list-ul"></i></i></a>';
echo '</li>';
if ($page < $total_pages){
echo '<li class="page-item">';
echo '<a class="page-link" href="?p=';
echo htmlentities($slug, \ENT_QUOTES, "UTF-8", false);
echo '&tab='.($page+1).'">PRÓXIMO <i class="fas fa-angle-right"></i></a>';
echo '</li>';
}
echo '</nav>';
$conn = null;
?>
验证甚至尝试将来自用户输入或来自应用程序外部的任何内容列入白名单是一种很好的做法,在这种情况下,
$\u GET['tab']
并将其分配给$page
因此,您需要确保它是一个正整数,并且小于总页数。
您可以使用条件检查是否为数值($page)
并且在计算之后
$total_pages
您可以使用另一个条件来检查$page>=1&&$page是否将计数移动到$startVEP
计算上方。然后只需检查以确保$page
不超过$total\u pages
,即可将请求的$page
锁定到可用的最高页面
此外,还要检查以确保请求的页面为正值,否则将页面强制为1
例子:
实际上不存在安全风险,因为偏移量高于可用值,并且您使用的是准备好的语句。
唯一的潜在问题是$total_pages
可能是0
@Natalie若要将分页放置在记录下方,您需要更改操作顺序,以响应其下方的导航。我建议使用一个函数来完成这一点:,这样您就可以在其他模板上使用分页函数。
$stmtUTP = $db->prepare("SELECT `id`, `title` FROM table WHERE data = 'vm' ORDER BY id DESC LIMIT :start, :max");
$stmtUTP->bindValue(':start', $startVEP, PDO::PARAM_INT);
$stmtUTP->bindValue(':max', $maximoVEP, PDO::PARAM_INT);
$stmtUTP->execute();
//applies to null, 0, false, empty string
//will default to 1 if empty or not a numeric value
$page = (empty($_GET['tab']) ? 1 : (int) $_GET['tab']);
if ($page <= 0) {
//force a positive page value
$page = 1;
}
$maximoVEP = 1;
$title = 'Asic';
$stmtVEP = $db->prepare("SELECT count(id) FROM table WHERE data = 'vm' AND title = :title");
$stmtVEP->bindValue(':title', $title, PDO::PARAM_STR);
$stmtVEP->execute();
$total = $stmtVEP->fetchColumn();
$total_pages = ceil($total/$maximoVEP);
if ($page > $total_pages) {
//limit requested page to the maximum number of pages
$page = $total_pages;
}
$startVEP = (($maximoVEP * $page) - $maximoVEP);
//...
$_GET['tab'] = not a number: 1
$_GET['tab'] = -1: 1
$_GET['tab'] = -2: 1
$_GET['tab'] = -0: 1
$_GET['tab'] = 0: 1
$_GET['tab'] = 1: 1
$_GET['tab'] = 2: 2
$_GET['tab'] = 3: 2
$_GET['tab'] = 4: 2