将变量作为URL参数传递-安全问题?

时间:2016-03-24 作者:Jon

我需要确保我没有在我的网站上打开安全漏洞。我有一个名为“Communities”的自定义帖子类型和一个名为“Floor Plans”的自定义帖子类型,需要在单个Floorplan帖子的URL中添加一个参数。

我的目标是,当从社区单个帖子中选择Floorplan帖子对象时,它会将社区名称(即单个社区帖子标题)附加到URL,以便在下一页上使用。因此,启用查询变量:

    <?php

    //* Enable queryvars (functions.php)

    add_filter(\'query_vars\', \'parameter_queryvars\' );
    function parameter_queryvars( $qvars )
    {
    $qvars[] = "community";
    return $qvars;
    }
我有一个名为“动态楼层平面”的模板部分,它位于单个社区帖子底部的一个循环中。我正在获取当前社区页面的single\\u post\\u标题,并将其传递到URL,以便使用$\\u GET可以使用它

我们选择此方法的原因是“平面布置图”帖子类型有一个规范/默认版本,该版本与特定于社区的对应类型具有相同的属性。为了避免出现post关系情况(在某些情况下会给用户提供完全错误的数据),社区版本只需能够在非常特定的实例中使用这些查询字符串。

  <?php

  //* dynamic-floor-plans template part (placed in loop on communities page)

  global $post;
  $string = strtolower(single_post_title( null, false ));
  $slug = str_replace(\' \',\'-\',$string);
  ?>

     <div class="card-button">
      <a class="small expanded secondary button" 
        href="<?php echo get_the_permalink() . \'?community=\' . $slug ?>">View Floorplan</a>
   </div>
现在,这完全奏效了。我可以使用$\\u GET在随后选择的floorplan单页上获取社区变量,前端的工作似乎很好:

    <?php
    //*  Single Floorplans Template

    $community = $_GET["community"];

    ?>
      <h1 class="entry-title"><?php echo $title ?></h1>
      <h4>
        <?php if ($community) { ?> 
          At <?php echo $community; }  ?>
     </h4>
     ...
我只是忍不住觉得这不符合犹太教,或者有一种更安全的方法来做到这一点。

我会被剥削吗?我也可以包括循环本身的函数,但我认为这段代码足以开始评估。

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

通过URL传递非私有/非保护/非敏感的值被广泛使用,这是一种更可靠的方法,可以将值从一个页面传递到另一个页面。原因是,$_SERVER[\'HTTP_REFERER\'] 完全不可靠,永远不可信任。在许多情况下,它也可以是空值。查看以下两个帖子了解更多详细信息

  • Get default permalink structure from pretty URL's

  • Archive page for taxonomy of custom post type

    $_SERVER[\'HTTP_REFERER\'].

    请注意,WordPress通过URL传递了许多查询变量,以便知道在哪个页面上显示哪些数据。但是,您应该注意,虽然通过URL传递值非常可靠,但它可能会受到危害,因此应该NEVER EVER 安全对待。黑客喜欢通过URL传递恶意代码,如果黑客将恶意代码与您的自定义查询var一起传递,而您仍在使用,则您的站点和/或db可能会受到严重危害。

    别误会我的意思,使用$_GET 传递数据的全局变量确实是在两个页面之间传递数据的好方法,这并没有什么错。但您需要记住,任何用户通过ANY 表单类型、文本区域、URL、Cookie,基本上任何需要任何类型输入或任何来自客户端应用程序的数据的东西,都可能被破坏,而且很可能被破坏。你永远不能相信任何人,甚至你自己。ALL INCOMING DATA 必须ALWAYS 根据预期的数据类型进行清理、验证和/或转义。这应该是你的第一要务,也是你名单上最重要的黄金法则。

    只要你遵守这条黄金法则,你就会相对安全,我说的是相对安全,因为没有一段代码是安全的。在实际操作数据之前,先清理数据并对其进行静态验证(如果可以的话),这样可以保护您免受许多“软”攻击。

    WordPress有很多内置功能,可以根据您的需要和预期的数据类型来处理卫生、转义和验证数据。一定要检查this article in the codex 关于这个话题。或者,PHP中也有可用的过滤器。对于超级全球选手,我倾向于filter_input() 因为它负责检查var是否已设置,如果已设置,则返回值。您还可以filter/sanitize the value

    示例

    $community = filter_input( 
        INPUT_GET,             // Super global to use, in this case $_GET
        \'community\',           // The var to get a value from
        FILTER_SANITIZE_STRING // Type of filter to apply, here sanitize the value as a string
    );
    
    if ( $community ) {
        /**
         * $community have a value, so $_GET["community"] is set. 
         * It is also safe to use now as the value was sanitized when we
         * queried the value with filter_input
    }
    

相关推荐

如何让`wp-list-table`显示我在Custom-Post中的`Custom-Fields`

一切都好吗<我需要wp-list-table 也要显示custom-fields 在每个custom-post 我有,但我不知道如何做到这一点,在这幅图中,它显示了带有字段的表格:Title, Author and Publication Date: 我想要的是能够选择custom-fields 将出现,例如以下示例Title, Carta, Naipe, Author, and Date of Publication: