【问题标题】:Sanitizing URLs being inserted into a WordPress MySQL database清理插入到 WordPress MySQL 数据库中的 URL
【发布时间】:2017-12-24 03:37:57
【问题描述】:

我正在为 Wordpress 编写一个插件,其中我有自己的自定义表来存储从远程 API 中提取的相关数据。我需要存储的元素之一是 URL,它是我数据库中的 TEXT 字段。

由于我看到很多 cmets 说不要在 Wordpress 插件中使用标准的 mysql_mysqli_ 函数,我想知道在插入 URL 之前转义 URL 的最佳方法是什么?使用esc_url() 是否足够了,或者我还需要做什么?

    case "Create":
    {
        $tag = $_POST['product_tag'];
        $name = $_POST['product_name'];
        $asin = $_POST['product_id'];

        $response = getPrice("com", $asin);

        $result = $wpdb->insert( $table_name, array(
            'tag' => $tag,
            'name' => $name,
            'asin' => $asin,
            'price' => $response['price'],
            'url' => esc_url($response['url'])
        ));

        if ($result !== FALSE)
            echo "Successfully inserted new Amazon Product.";
        else
            echo "An Error occurred.";

        break;
    }

【问题讨论】:

标签: php mysql wordpress sanitization mysql-real-escape-string


【解决方案1】:

通常,您只需在数据库中按原样插入一个 URL,并且只在呈现它时关心安全问题。当然,这假设您正在正确地做事,就像您在这里明确调用 insert 函数一样,并将数据作为关联数组发送。

真正的风险在于人们绕过 WPDB 并直接插入内容,而且通常使用字符串连接很糟糕。

应该显示这些值时调用esc_url。由于您可能会不时更改允许的 URL,限制它们或根据需要更改打开它们,因此最好将它们保留在数据库中,并根据具体情况准备显示。

【讨论】:

  • 谢谢,这很有道理!我想清理更多的是对最终用户提供的数据的关注。由于这是直接来自 Amazon API 并被插入,我将只使用 esc_url 来代替。
  • 您进行过滤和预处理,例如修剪用户数据的前导和尾随空格,然后将其转义到您保存它的任何上下文中。MySQL 使用一种方法,CSV 使用另一种方法,JSON 使用另一种方法仍然。 HTML 只是另一个上下文,您可以在必要时使用该上下文的方法,例如htmlspecialchars。正确使用 WPDB 很好,它可以解决 99% 的安全问题。您可以对 API 生成的数据做的唯一另一件事是验证它实际上是一个 URL,而不是一些空字符串或错误消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 2012-06-27
  • 2019-06-06
  • 2016-11-22
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多