【问题标题】:how to safely pass variable in php with url rewriting?如何通过 url 重写安全地在 php 中传递变量?
【发布时间】:2013-12-16 11:30:20
【问题描述】:

我有一个链接缩略图列表。每个缩略图都有一个与一个变量的链接。

<a href="index.php?id=1"><img src="thumb1.jpg">
<a href="index.php?id=2"><img src="thumb2.jpg">

等等……

现在,我已更新网站以使用 url 重写。想法是我有这样的链接

<a href="gallery/?id=1"><img src="thumb1.jpg">
<a href="gallery/?id=2"><img src="thumb2.jpg">

或类似的东西。

在登录页面上,我使用$id 执行MySQL 查询并显示具有该ID 的图库中的所有图片。

$pictures = mysql_query("SELECT * FROM t_gallery where id=$id",$db);

可以做到吗,主要的是,我如何防止传递的 id 构成安全威胁?

干杯, 亚历克斯

【问题讨论】:

    标签: php variables url rewrite


    【解决方案1】:

    url-rewriting 部分本身并没有真正引入任何新的安全威胁,问题是mysql_* 函数的使用(已弃用)并且没有转义$id 请求变量。

    如果您害怕 SQL 注入(应该如此),请在查询中使用 $id 变量之前对其进行转义,或者使用准备好的语句(然后切换到 mysqli 或 PDO,您应该在mysql_* 被弃用的任何原因!)。

    始终验证并转义您将在数据库查询中使用的任何内容。

    【讨论】:

    • 我怎样才能逃脱它?我对此不是很熟悉...我没有在数据库中输入任何内容,只是阅读,但是正如您所说,我害怕sql注入。另一件事,当我使用 gallery/?id=2 作为链接时,变量不会传递给其他文件。我该怎么做?
    • 好吧,没有看到你的重写规则(可能在 .htaccess 文件中),我不知道为什么没有传递参数。我再次建议转到 PDO 或 mysqli 并使用准备好的语句,在这种情况下无需转义。但如果你坚持使用已弃用的 mysql 函数,mysql_real_escape_string 函数可能就是你要找的。如果您希望 $id 是一个数字,您可以随时使用if(is_numeric($id)) 进行检查,因为如果是,您实际上不必逃避它。 Sql 注入适用于任何类型的查询,而不仅仅是插入。
    • 是的,它始终是数字。 is_numeric 函数添加,mysqli 添加。我只需要传递变量:)。重写工作(是的,在 htaccess 中)所以当它找到特定的页面 ID 时,它会重写 url,例如 index.php?page_id=300 变成 /gallery-thumbs/ 和 index.php?page_id=301 变成 /gallery/。现在,我只需要将 id 形式 /gallery-thumbs/ 传递给 /gallery/
    • 如果答案为您提供了您之后的信息,请将答案标记为正确! :)
    【解决方案2】:

    请注意SQL injection vulnerabilities,并确保清理任何用户输入或考虑使用prepared statements

    【讨论】:

      【解决方案3】:

      对于特定的实现,我留下这段封装的代码

      function ControllerAction($id=null) {
        // I like to formalize on entry; this is supposed to be an absolute integer and nothing else
        $id = abs((int)$id);
        $q = 'SELECT * FROM t_gallery where id = ?'; // placeholder
        // use PDO, it's safe and very comfortable
        $pdo = get_pdo_connection($whatever_you_need);
        // prepare it because it has placeholders, and because there is external input comming in
        $stmt = $pdo->prepare($q);
        // execute it
        $stmt->execute(array($id)); // read the reference documentation to understand this clearly
        // now the stmt object holds the results
        return $stmt->fetchObject();// whatever you like here, I like to make a DAO
      }
      

      在这个例子中,简单的传入参数已经准备好使用,但我仍然使用准备好的语句来保持一致性(我自己的代码约定)

      警告:这使用了某种形式的半途而废的 MVC/MVP/MVVM(我不再确定)类型架构

      • 如果您使用 Url Rewriting 来进一步实施您的 SEO 链接,您实际上可以像这样制作您的 href URL

        protocol://host/controller/action/getParam1/getParam2
        // usage
        http://yourhost/browsethumbs/aNumber
        

      【讨论】:

        猜你喜欢
        • 2020-04-03
        • 2016-09-30
        • 1970-01-01
        • 2012-11-29
        • 2018-02-26
        • 1970-01-01
        • 2012-09-30
        • 1970-01-01
        • 2019-11-10
        相关资源
        最近更新 更多