微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过PHP从SQL DB获取100个最新的DB条目

如何解决通过PHP从SQL DB获取100个最新的DB条目

| 我是PHP / sql的新手(第一天),所以如果我以向后的方式进行操作,请原谅我。 下面的这个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;
}
    

解决方法

尽管ѭ1是MySQL关键字,这应该可以工作,因此您需要将ѭ1括在反引号中或重命名该列。 另外,在建立查询之前,请务必确保已清除这些输入。在没有卫生的情况下,根据
$_GET
$_POST
的用户可编辑值构建查询是非常不安全的。 对于
WHERE
参数,您应该在那些参数上运行
mysql_real_escape_string()
(我看到的是,我不确定您之前是否有过)。这样就足够了,因为您要将这些值包装在查询中的引号中,并且由于要转义该字符串,因此任何企图突破那些引号的尝试都将无效。 对于诸如“ 7”之类的东西,我将定义一个有效的允许值“列表”,并检查以确保您的参数在该列表中。例如:
$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()
来验证所提供的值是数字,而不是精心制作的字符串。 仅跳过
$table
ORDER BY
LIMIT
参数是不够的,因为它们没有用引号引起来,因此有人可以恶意注入in14ѭ值。最终使您的查询类似:
SELECT * FROM ; DROP TABLE whatever; --WHERE ...
查询由分号分隔,因此这里有三个查询。第一个失败是因为它无效,第二个成功删除了表,第三个只是注释,因此什么也没有发生。但是您可以看到,如果让用户抛出他们想要的任何内容作为这些参数之一,那将是一个巨大的安全漏洞。 (我不确定将表名括在反引号中是否有帮助,有人知道了吗?请在任何情况下都可以对attack9ѭ和
ORDER BY
参数进行相同的攻击。)     ,如果每个记录都有一个唯一的自动递增ID(如您所愿),则,18 to会更有效。     ,实际上,您已经对了。您只应查看指定的列,而不要使用*。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?