在sql字符串中使用url变量

时间:2013-02-09 12:03:22

标签: php sql

我正在使用一个简单的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和预处理语句的优点,但这是一个仅供内部使用的小应用程序,因此过度复杂化会产生反作用!

4 个答案:

答案 0 :(得分: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."'");

答案 1 :(得分:0)

您正在引用变量:

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

因此$orderby字面上会包含文字$_GET["orderby"]

您应将其更改为:

$orderby = $_GET["orderby"];

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

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

但是,无论您使用何种类型的数据库函数(mysql_*函数都已弃用),这都容易受到SQL注入攻击。在这种情况下,避免sql注入的唯一方法是使用允许的orderby字符串的白名单,并检查它。

答案 2 :(得分:0)

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

SELECT * FROM table ORDER BY'。$ _ GET [“orderby”]。'

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

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

echo $sql;

答案 3 :(得分:0)

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

永远不要让用户知道您的表格,无论是列名还是表名。