url在wp_safe_remote_get

时间:2016-02-10 16:42:04

标签: php wordpress woocommerce

我使用woocommerce v3 API开发应用程序。

我想通过remote_url推送图片。

我的网址:http://tshirt-previewer.internal.teezily.com/media/W1siZiIsIjIwMTUvMTAvMjgvMTQvNTAvMzMvNGQ0NmVhYzAtYmVlNC00Y2IzLTlkN2QtZDM5ZmJlNzFmMWM5L0dJNjQwMDBfZnJvbnQucG5nIl0sWyJwIiwicHJldmlld3MiLDIwLCJyb3lhbCBibHVlIix7InBvc2l0aW9uX3giOjM2LCJwb3NpdGlvbl95IjoxLCJ3aWR0aCI6NjIsImhlaWdodCI6NjIsImRlc2lnbl91cmwiOiJodHRwczovL3RlZXppbHktcGx1cy5zMy5hbWF6b25hd3MuY29tL3VwbG9hZHMvZGVzaWduL3BpY3R1cmUvMzM3Ny9pbWFnZS0xMjAweDE2MDAuanBnIn1dXQ/GI64000_front.png?sha=989266d5133de145

但我无法通过Product API更新将其上传到Woocommerce

我在代码中发现了wp_safe_remote_get从Wordpress下载图像的问题。但是这种方法认为我的网址不安全。

为什么不安全? 我可以添加一些whitlist系统,以避免将此URL视为不安全吗?

3 个答案:

答案 0 :(得分:1)

Wordpress代码似乎对使用wp_safe_remote_get()提取的网址进行同一主机检查。

以下是来源:https://github.com/WordPress/WordPress/blob/c73a812109e1a64ecf21b6a198f949c58d1f2674/wp-includes/http.php

重要的部分是wp_http_validate_url函数,特别是第524-530行,它们在这里:

$parsed_home = @parse_url( get_option( 'home' ) );
if ( isset( $parsed_home['host'] ) ) { 
    $same_host = ( strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] ) || 'localhost' === strtolower( $parsed_url['host'] ) );
} else {
    $same_host = false;
}

如果$same_hostfalse,则该方法会将网址视为不安全。

我看不到白名单。如果你想避免这个问题,你可能需要编辑代码才能使用wp_remote_get()

更新:前面的参数是错误的。即使端口不正常,代码也会返回url。

答案 1 :(得分:0)

如果网址的主机包含以下某个符号,则该网址将被拒绝::#?[]

如果无法检索此图片,请尝试删除?sha=989266d5133de145

答案 2 :(得分:0)

我一直尝试在实时服务器上传您的图片,我使用woocommerce v3 API方法,一切正常。也许您需要重新检查您的应用程序功能,服务器,防火墙,增加超时http等,问题可能来自图像服务器。

https://github.com/woothemes/woocommerce/blob/master/includes/api/class-wc-api-products.php#L2333

protected function upload_image_from_url( $image_url, $upload_for = 'product_image' ) {
        $file_name  = basename( current( explode( '?', $image_url ) ) );
        $wp_filetype    = wp_check_filetype( $file_name, null );
        $parsed_url     = @parse_url( $image_url );
        // Check parsed URL.
        if ( ! $parsed_url || ! is_array( $parsed_url ) ) {
            throw new WC_API_Exception( 'woocommerce_api_invalid_' . $upload_for, sprintf( __( 'Invalid URL %s', 'woocommerce' ), $image_url ), 400 );
        }
        // Ensure url is valid.
        $image_url = str_replace( ' ', '%20', $image_url );
        // Get the file.
        $response = wp_safe_remote_get( $image_url, array(
            'timeout' => 10
        ) );
        if ( is_wp_error( $response ) || 200 !== wp_remote_retrieve_response_code( $response ) ) {
            throw new WC_API_Exception( 'woocommerce_api_invalid_remote_' . $upload_for, sprintf( __( 'Error getting remote image %s', 'woocommerce' ), $image_url ), 400 );
        }
...

根据您的问题wp_safe_remote_get,我们可以调整这些功能,只是为了测试wp_safe_remote_get以按网址上传图片。

这里是wp_safe_remote_get

的图片响应标题
Array
(
    [headers] => Array
        (
            [content-disposition] => filename="GI64000_front.png"
            [content-length] => 934080
            [content-type] => image/png
            [etag] => "6f19381f5b2ae0657f6e7945d7ca4bac05e3ad3a"
            [server] => nginx
            [expires] => Mon, 20 Mar 2017 19:20:54 GMT
            [last-modified] => Sun, 20 Mar 2016 19:20:54 GMT
            [connection] => close
            [date] => Wed, 23 Mar 2016 00:19:28 GMT
            [content-encoding] => gzip
        )

    [body] => �PNG
... I skip this part ...

[response] => Array
        (
            [code] => 200
            [message] => OK
        )

    [cookies] => Array
        (
        )

    [filename] => 
)