gpt4 book ai didi

php - 通过 PHP 从 SQL DB 获取 100 个最新的数据库条目

转载 作者:行者123 更新时间:2023-11-29 09:10:38 26 4
gpt4 key购买 nike

我对 php/SQL 很陌生(1 天),所以如果我以倒退的方式这样做,请原谅我。

下面的 php 旨在返回数据库中最近的 100 个条目。我尝试通过选择要返回的 100 个条目并按条目创建的日期(时间戳)进行排序来实现此目的。这会将最近的 100 个条目返回到数据库吗?还是我理解错了?

    $type   = isset($_GET['type']) ? $_GET['type'] : "global";
$offset = isset($_GET['offset']) ? $_GET['offset'] : "0";
$count = isset($_GET['count']) ? $_GET['count'] : "100";
$sort = isset($_GET['sort']) ? $_GET['sort'] : "date DESC";

// Localize the GET variables
$udid = isset($_GET['udid']) ? $_GET['udid'] : "";
$name = isset($_GET['name']) ? $_GET['name'] : "";

// Protect against sql injections
$type = mysql_real_escape_string($type);
$offset = mysql_real_escape_string($offset);
$count = mysql_real_escape_string($count);
$sort = mysql_real_escape_string($sort);
$udid = mysql_real_escape_string($udid);
$name = mysql_real_escape_string($name);

// Build the sql query
$sql = "SELECT * FROM $table WHERE ";

switch($type) {
case "global":
$sql .= "1 ";
break;
case "device":
$sql .= "udid = '$udid' ";
break;
case "name":
$sql .= "name = '$name' ";
break;
}

$sql .= "ORDER BY $sort ";
$sql .= "LIMIT $offset,$count ";

$result = mysql_query($sql,$conn);

if(!$result) {
die("Error retrieving scores " . mysql_error());
}
//echo $result;
$rows = array();
while($row = mysql_fetch_assoc($result)) {
$rows[] = $row;
}

最佳答案

这应该可行,尽管date是MySQL关键字,因此您需要将date括在反引号中或重命名该列。

此外,绝对请确保您在构建查询之前已清理这些输入。在没有任何卫生措施的情况下,根据来自 $_GET$_POST 的用户可编辑值构建查询是非常不安全的。

对于 WHERE 参数,您应该在这些参数上运行 mysql_real_escape_string() (我看到您正在运行,我不确定您之前是否运行过)。这已经足够了,因为您在查询中将这些值括在引号中,并且由于您要转义该字符串,因此任何突破这些引号的尝试都将不起作用。

对于像 ORDER BY 这样的东西,我会定义一个有效的允许值“列表”,并检查以确保您的参数位于该列表中。例如:

$valid_orderbys = array('`date` DESC', '`date` ASC', '`name` DESC', '`name` ASC');

if (in_array($_GET['sort'], $valid_orderbys))
{
// you're good, you can use this value
}
else
{
// unexpected value, either alert the user or
// use a default value you define
}

或者对于 LIMIT,您可以使用 PHP 的内置 is_numeric() 来验证您给出的值是数字,而不是精心设计的字符串。

仅仅转义 $tableORDER BYLIMIT 参数不够,因为它们是没有用引号引起来,因此有人可以恶意注入(inject) 值;删除表无论如何; --。这最终使您的查询类似于:

SELECT * FROM ; DROP TABLE whatever; --WHERE ...

查询以分号分隔,因此这里有三个查询。第一个失败,因为它无效,第二个成功删除表,第三个只是注释,所以什么也没有发生。但您可以看到,如果您让用户将他们想要的任何内容作为这些参数之一,那就是一个巨大的安全漏洞。 (我不确定将表名放在反引号中是否有帮助,如果您知道,请告诉我。但无论如何,您可以对 LIMITORDER 进行相同的攻击BY 参数。)

关于php - 通过 PHP 从 SQL DB 获取 100 个最新的数据库条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5680366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com