防止来自GET变量

时间:2015-08-08 09:21:02

标签: php mysqli

我有一个变量,它从URL获取值。

if (isset($_GET['page'])) {
    $getPage = $_GET['page'];
} else {
    $getPage = "";
}

if ($getPage == "" || $getPage == "1") {
    $page = 0;
} else {
    $page = ($getPage * 6) - 6;
}

获得此值后,它会向数据库发送查询,以询问信息。如何确保输入数字并且不超过可用数量?

以下是查询:

$query = "SELECT * FROM dbname LIMIT $page,6 ";
$select_all_list_items = mysqli_query($connection, $query);

现在,如果我手动更改网址并输入超过网页数量的数字,则不显示任何内容,或者如果我在其中输入字母则显示错误。在这两种情况下,我都希望将用户重定向回第一页。

3 个答案:

答案 0 :(得分:1)

首先,您需要从数据库中检索总页数:

$countQuery = 'SELECT COUNT(*) FROM dbname';
$countResult = mysqli_query($connection, $countQuery);
$countResultRow = mysqli_fetch_row($countResult);
$numPages = intval($countResultRow[0]);

然后,您需要对get变量实施一些检查:

if ($numPages < 0) {
    throw new Exception('No pages to show!');
}

if (!is_numeric($getPage)) {
    $getPage = 1;
}

if ($getPage > $numPages) {
    $getPage = 1;
}

if ($getPage < 1) { 
    $getPage = 1;
}

小心地将GET值直接传递到SQL查询中,这是一个安全风险,因为它可能导致通过URL操作数据库。有关“转义”数据预查询的详细信息,请阅读有关SQL注入的信息。

答案 1 :(得分:1)

要检查数字输入和无效页码,

$pageCount = $totalRecords / $recordsPerPage;
/* where $totalRecords is count of total records from db and $recordsPerPage is total rows per page */
if(!is_numeric($_GET['page']) || $_GET['page']>$pageCount){
    $getPage = "1";
}

答案 2 :(得分:0)

像这样的东西

 $page = 1;  //default page 1
 if(isset($_GET['page']) && preg_match('/[a-z]/i', $_GET['page'])){
    // if set and alpha
    header('Location: url of first page');
    exit;
 }else{
    //not sure of this part but ( that's what the OP has so i'll go with it )
    $page = ( $_GET['page'] * 6 ) - 6;  ///could be 0 on page 1 6*1-6, just saying
 }

就个人而言,我首先运行一个查询来计算总行数,将每行的行数除以总页数,然后在if语句中使用...等等。