1

我正在使用一个简单的 sql 查询来输出一个通过 sql 语句排序的表。我想在 url 中传递一个变量(以避免必须创建多个 sql 语句),该变量在 sql 字符串中设置 ORDER BY 属性,我不确定这是否可能。这就是我想出的,虽然代码有效,但它不起作用。

function list_entries() 
{
    db_connect();

    $orderby = $_GET["orderby"];
    $sql = mysql_query("SELECT * FROM astaro ORDER BY '".$orderby."'");

    while($row = mysql_fetch_array($sql)) {
        echo "Table Outputs - I trimmed this because it's not important";

    }
    echo "</table>";
    db_disconnect();
}

我也知道 pdo 和prepared statements 的优点,但这是一个仅供内部使用的小型应用程序,因此过度复杂化会适得其反!

4

4 回答 4

0

我不确定,但应该是:

代替 :

$orderby = '$_GET["orderby"]'; $sql = mysql_query("SELECT * FROM table ORDER BY '.$orderby.'");

到 :

$orderby = $_GET["orderby"]; 
$sql = mysql_query("SELECT * FROM table ORDER BY '".$orderby."'");
于 2013-02-09T12:06:27.223 回答
0

您正在引用变量:

$orderby = '$_GET["orderby"]';

所以$orderby会从字面上包含文本$_GET["orderby"]

您应该将其更改为:

$orderby = $_GET["orderby"];

而且你不应该在 sql 语句中引用变量:

$sql = mysql_query("SELECT * FROM astaro ORDER BY ".$orderby);

但是,无论您使用哪种数据库函数(这些mysql_*函数已弃用),这都容易受到 sql 注入的影响。在这种情况下,避免 sql 注入的唯一方法是使用允许orderby字符串的白名单并对其进行检查。

于 2013-02-09T12:08:36.333 回答
0

这里的问题是您的查询最终实际上是

SELECT * FROM table ORDER BY '.$_GET["orderby"].'

$_GET['oderby'] 实际上是按字面意思写出来的,不要用引号括起来。像这样的代码实际上是您正在寻找的:

$orderby = $_GET["orderby"];
$sql = ("SELECT * FROM table ORDER BY '.$orderby.'");

echo $sql;
于 2013-02-09T12:09:19.563 回答
0

您使用数据库的方式存在安全漏洞。请尝试学习 PDO 并删除已弃用的 mysql 驱动程序,因为它将在下一个 PHP 版本中删除。

永远不要让用户知道有关您的表的任何信息,无论是列名还是表名。

于 2013-02-09T12:10:35.680 回答