কোনও HTTP অনুরোধ ইউআরআই ফিল্টার?


10

আমি HTTP API এর মাধ্যমে যে কোনও HTTP অনুরোধ ইউআরআই ফিল্টার করতে চাই।

ব্যবহারের ক্ষেত্রে:

  1. ওয়ার্ডপ্রেস আপডেট চেক http://api.wordpress.org/core/version-check/1.6/ এ যায় , তবে https://api.wordpress.org/core/version-check/1.6/ খুব কার্যকর হয় এবং আমি চাই সর্বদা এটি ব্যবহার করতে।
  2. নতুন ওয়ার্ডপ্রেস ফাইলটি http://wordpress.org/wordpress-3.4.2.zip থেকে নেওয়া হয়েছে , তবে https://wordpress.org/wordpress-3.4.2.zip কাজ করে।
  3. কখনও কখনও আমি অনুরোধগুলি ডিবাগ করতে এবং অস্থায়ীটিকে আমার স্থানীয় সার্ভারে একটি কাস্টম ডোমেনে পুনর্নির্দেশ করতে চাই।
  4. কিছু প্লাগইন অন্যান্য সার্ভারগুলিতে অনুরোধ করে এবং বাহ্যিক সার্ভার ডাউন হয়ে গেলে আমি এই অনুরোধগুলি প্রতিস্থাপন করতে চাই।

আপডেটের অনুরোধগুলি আপাতত সর্বাধিক গুরুত্বপূর্ণ, কারণ এখনও অনুপযুক্ত বাগ 16778 ( আরও তথ্য ) রয়েছে এবং এইচটিটিপিএস অনুরোধগুলি ম্যান-ইন-মধ্য-আক্রমণের ঝুঁকি কমিয়ে দেয়।

আমি পুঙ্খানুপুঙ্খভাবে অনুসন্ধান করেছি , আমি মূল কোডটি অধ্যয়ন করেছি ... তবে দু'বছর আগে ন্যাসিনের মতো শেষ করেছি:

আমি নিশ্চিতভাবে ভেবেছিলাম আপনি কোনও এইচটিটিপি অনুরোধের ইউআরএল ফিল্টার করতে পারবেন তবে এখন আমি এটি খুঁজে পাচ্ছি না।

আমি কি থেকে বাতিল হলাম? আমি কি? :)


WP- তে সিআরএল ডিবাগিং অনুসন্ধান করা যে কারও জন্য এই উত্তরটির লিঙ্কিং এখানে।
কায়সার

উত্তর:


9

উত্তরের চেয়ে কম নয়, তবে আমার অভিজ্ঞতা থেকে সরাসরি জিনিসগুলির একটি তালিকা - এটি সম্ভবত আপনি কিছু উপেক্ষা করেছেন।

অনুরোধ এবং এর ফলাফলগুলি ডিবাগ করা হচ্ছে

আপডেট প্রক্রিয়াটির খুব গভীরভাবে ডিগগিন ছাড়াই, তবে ডাব্লুপি এইচটিটিপিআইপি WP_HTTPক্লাসটি ব্যবহার করে । এটি একটি দুর্দান্ত জিনিসও সরবরাহ করে: একটি ডিবাগ হুক।

do_action( 'http_api_debug', $response, 'response', $class, $args, $url );

$responseএমন কোনও WP_Errorবস্তুও হতে পারে যেখানে সম্ভবত আপনাকে আরও বলে।

নোট: একটি সংক্ষিপ্ত পরীক্ষা থেকে, এই ফিল্টার শুধুমাত্র (কিছু কারণে) কাজ যেমন স্থাপন করতে যদি মনে হয় ঘনিষ্ঠ যেখানে আপনি আসলে অনুরোধ করছেন। সুতরাং আপনাকে নীচের ফিল্টারগুলির মধ্যে একটি কলব্যাকের মধ্যে থেকে কল করতে হবে।

WP_HTTP শ্রেণি যুক্তি

ক্লাসের আর্গুমেন্টগুলি নিজেই ফিল্টারযোগ্য, তবে আফিকের কেউ কেউ WP কীভাবে প্রয়োজনীয় তা অনুমান করে অভ্যন্তরীণ পদ্ধতিগুলি দ্বারা পুনরায় সেট করে।

apply_filters( 'http_request_args', $r, $url );

আর্গুমেন্টগুলির মধ্যে একটি হ'ল ssl_verify, যা ডিফল্টরূপে সত্য (তবে আপডেট করার সময় আমার পক্ষে বড় সমস্যা হয় - উদাহরণস্বরূপ - গিটহাব)। সম্পাদনা: একটি পরীক্ষার অনুরোধ ডিবাগ করার পরে, আমি আর একটি যুক্তি খুঁজে পেয়েছি যা এসএসএল সেট করা আছে কিনা তা যাচাই করতে সেট করা আছে true। একে বলা হয় sslverify(আন্ডারস্কোর বিচ্ছিন্ন না করে)। এটি খেলায় কোথায় এসেছিল, তা যদি বাস্তবে ব্যবহৃত হয় বা পরিত্যক্ত হয় এবং আপনি যদি এর মানকে প্রভাবিত করার সুযোগ পান তবে কোনও ধারণা নেই। আমি 'http_api_debug'ফিল্টার ব্যবহার করে এটি পেয়েছি ।

সম্পূর্ণ কাস্টম

আপনি পুরো "ইন্টার্নাল" ওভাররাইড করে "কাস্টম সেটআপ" দিয়ে যেতে পারেন। তার জন্য একটি ফিল্টার আছে।

apply_filters( 'pre_http_request', false, $r, $url );

প্রথম আরগটি সত্য হিসাবে সেট করা দরকার। আপনি ভিতরে আর্গুমেন্ট $rএবং এর ফলাফলের সাথে ইন্টারঅ্যাক্ট করতে পারেন তার চেয়ে বেশি parse_url( $url );

প্রক্সি

আর একটি জিনিস যা কাজ করতে পারে তা হ'ল একটি কাস্টম প্রক্সি দিয়ে সমস্ত কিছু চালানো। এটিতে আপনার কিছু সেটিংস দরকার wp-config.php। আমি এর আগে কখনও চেষ্টা করে দেখিনি, তবে আমি কিছুক্ষণ আগেই ধ্রুবকগুলির মধ্যে দিয়ে দৌড়েছি এবং কিছু উদাহরণের সংক্ষিপ্তসার করেছি যা কাজ করা উচিত এবং আমার একদিন প্রয়োজন হলে কিছু মন্তব্য অন্তর্ভুক্ত করা হয়েছে। আপনাকে সংজ্ঞা দিতে হবে WP_PROXY_HOSTএবং WP_PROXY_PORTএকটি মিনিট হিসাবে। বিন্যাস. অন্য কিছুই কাজ করবে না এবং এটি কেবল আপনার প্রক্সি বাইপাস করবে।

# HTTP Proxies
# Used for e.g. in Intranets
# Fixes Feeds as well
# Defines the proxy adresse.
define( 'WP_PROXY_HOST',          '127.0.84.1' );
# Defines the proxy port.
define( 'WP_PROXY_PORT',          '8080' );
# Defines the proxy username.
define( 'WP_PROXY_USERNAME',      'my_user_name' );
# Defines the proxy password.
define( 'WP_PROXY_PASSWORD',      'my_password' );
# Allows you to define some adresses which
# shouldn't be passed through a proxy.
define( 'WP_PROXY_BYPASS_HOSTS',  'localhost, www.example.com' );

সম্পাদনা

WP_HTTPক্লাস সাধারণত হিসাবে কাজ করে বেস (বিভিন্ন পরিস্থিতিতে জন্য বাড়ানো হবে না) বর্গ। ব্যাপ্ত WP_HTTP_*ক্লাস আছে Fsockopen, Streams, Curl, Proxy, Cookie, Encoding। আপনি যদি 'http_api_debug'অ্যাকশনটিতে একটি কলব্যাক হুক করেন তবে তৃতীয় যুক্তি আপনাকে জানাবে যে আপনার অনুরোধের জন্য কোন শ্রেণিটি ব্যবহৃত হয়েছিল।

WP_HTTP_curlক্লাসের ভিতরে , আপনি request()পদ্ধতিটি খুঁজে পাবেন । এই পদ্ধতিটি এসএসএল আচরণ বন্ধ করতে দুটি ফিল্টার সরবরাহ করে: একটি স্থানীয় অনুরোধের জন্য 'https_local_ssl_verify'এবং একটি দূরবর্তী অনুরোধের জন্য 'https_ssl_verify'। ডাব্লু সম্ভবত সংজ্ঞায়িত করবে localযেমন localhostএবং আপনার কাছ থেকে বিনিময়ে কি পেতে get_option( 'siteurl' );

সুতরাং আমি যা করব তা হ'ল আপনি এই অনুরোধটি করার আগে নীচের অধিকারটি চেষ্টা করে দেখতে (বা নিকটতম অনুরোধে আবদ্ধ একটি কলব্যাক থেকে:

add_filter( 'https_ssl_verify', '__return_true' );

# Local requests should be checked with something like
# 'localhost' === $_SERVER['HTTP_HOST'] or similar
# add_filter( 'https_local_ssl_verify', '__return_true' );

সিডিনোট: বেশিরভাগ ক্ষেত্রে WP_HTTP_curlপ্রক্সিগুলি হ্যান্ডেল করতে ব্যবহৃত হবে।


1
আহ, আমি মনে করি আপনি আমার প্রশ্নের উত্তর অপ্রত্যক্ষভাবে দিয়েছেন: আমি pre_http_requestঅনুরোধটি বাতিল করতে, অনুরোধটি বাতিল করতে এবং এটি সঠিক URL সহ পুনরায় পাঠাতে পারি। আজ রাতে চেষ্টা করবে।
ফুসিয়া

8

@ কায়সারের দরকারী উত্তরের ভিত্তিতে আমি এমন কিছু কোড লিখেছি যা ভাল মনে হচ্ছে। এই কারণেই আমি এটিকে উত্তর হিসাবে চিহ্নিত করেছি।

আমাকে আমার সমাধানটি ব্যাখ্যা করতে দাও ...

যুক্তিটা

যখন এটিপি-র মাধ্যমে প্রেরিত একটি অনুরোধ তা চলে WP_Http::request()। এর সাথে এই পদ্ধতিটি ...

@ টডো এই কোডটি রিফ্যাক্টর।

… এর শিরোনামে। আমি আর একমত হতে পারি না।

এখন, কিছু ফিল্টার আছে। আমি pre_http_requestআমার প্রয়োজনের জন্য অপব্যবহার করার সিদ্ধান্ত নিয়েছি :

add_filter( 'pre_http_request', 't5_update_wp_per_https', 10, 3 );

আমরা তিন আর্গুমেন্ট এখানে পাবেন: false, $r, $url

  • falseএর প্রত্যাশিত রিটার্ন মান apply_filters()। আমরা যদি অন্য কোনও কিছু পাঠিয়ে দিই, ওয়ার্ডপ্রেস তত্ক্ষণাত বন্ধ হয়ে যায় এবং মূল অনুরোধটি প্রেরণ করা হবে না।

  • $rএই অনুরোধের জন্য আর্গুমেন্টগুলির একটি অ্যারে। আমাদের এক মিনিটের মধ্যে এগুলিও পরিবর্তন করতে হবে।

  • $urlহয় - অবাক! - ইউআরএল।

সুতরাং আমাদের কলব্যাকে t5_update_wp_per_https()আমরা ইউআরএলটি দেখি এবং এটি যদি আমাদের URL ফিল্টার করতে হয় তবে আমরা "না" ( ) না বলে ওয়ার্ডপ্রেসকে NO না বলে বলি false

এখানে চিত্র বর্ণনা লিখুন

পার্শ্ব দ্রষ্টব্য: এটি অনুসরণ করে আপনি এর সাথে সমস্ত HTTP অনুরোধগুলি আটকাতে পারবেন:
add_filter( 'pre_http_request', '__return_true' );

এর পরিবর্তে আমরা আমাদের নিজস্ব অনুরোধটিকে আরও ভাল ইউআরএল এবং সামান্য সামঞ্জস্য করা যুক্তিগুলি দিয়ে পাঠাচ্ছি ( $r, $argsপাঠযোগ্যতার জন্য নামকরণ করা হয়েছে)।

কোড

দয়া করে ইনলাইন মন্তব্যগুলি পড়ুন, সেগুলি গুরুত্বপূর্ণ।

<?php
/**
 * Plugin Name: T5 Update WP per HTTPS
 * Description: Forces update checks and downloads for WP to use HTTPS.
 * Plugin URI:  http://wordpress.stackexchange.com/questions/72529/filter-any-http-request-uri
 * Version:     2012.11.14
 * Author:      Thomas Scholz
 * Author URI:  http://toscho.de
 * Licence:     MIT
 * License URI: http://opensource.org/licenses/MIT
 */

add_filter( 'pre_http_request', 't5_update_wp_per_https', 10, 3 );

/**
 * Force HTTPS requests for update checks and new WP version downloads.
 *
 * @wp-hook pre_http_request
 * @param   bool   $false
 * @param   array  $args
 * @param   string $url
 * @return  FALSE|array|object FALSE if everything is okay, an array of request
 *                            results or an WP_Error instance.
 */
function t5_update_wp_per_https( $false, $args, $url )
{
    // Split the URL into useful parts.
    $url_data = parse_url( $url );

    // It is already HTTPS.
    if ( 'https' === strtolower( $url_data['scheme'] ) )
        return FALSE;

    // Not our host.
    if ( FALSE === stripos( $url_data['host'], 'wordpress.org' ) )
        return FALSE;

    // Make that an HTTPS request.
    $new_url = substr_replace( $url, 'https', 0, 4 );

    // WP_Http cannot verify the wordpress.org certificate.
    $args['sslverify'] = FALSE;

    // It is slow. We wait at least 30 seconds.
    30 > $args['timeout'] and $args['timeout'] = 30;

    // Get an instance of WP_Http.
    $http    = _wp_http_get_object();

    // Get the result.
    $result = $http->request( $new_url, $args );

    /* prepend this line with a '#' to debug like a boss.
    print '<pre>'
    . htmlspecialchars( print_r( $result, TRUE ), ENT_QUOTES, 'utf-8', FALSE )
    . '</pre>';
    die();
    /**/

    return $result;
}

পরীক্ষাগুলো

ওয়ার্ডপ্রেস ব্যবহৃত প্লাগইন ছাড়া:

  • http://api.wordpress.org/core/version-check/1.6/ আপডেট চেকগুলির জন্য, এবং
  • http://wordpress.org/wordpress-3.4.2.zip নতুন ফাইল ডাউনলোড করতে।

আমি দুটি স্থানীয় ইনস্টলেশনের, একটি একক সাইট এবং উইন 7 এ একটি বহু-সাইটে সেটআপ একটি আপডেট আমি সেট জোর করে সঙ্গে এটি পরীক্ষিত $wp_versionমধ্যে wp-includes/version.phpথেকে 1এবং TwentyEleven সংস্করণ 1.3

নেটওয়ার্ক ট্র্যাফিকটি দেখার জন্য আমি ওয়্যারশার্ক ব্যবহার করেছি : এটি নিখরচায়, এটি উইন্ডোজ এবং লিনাক্সে চলে এবং এটি কিছু কার্যকর ফিল্টার সরঞ্জাম সরবরাহ করে।

এইচটিটিপিএস দেখা কিছুটা কঠিন: আপনি কেবল এনক্রিপ্ট হওয়া ডেটা দেখতে পাচ্ছেন ... এটি সর্বোপরি ধারণা। আমার প্লাগইনটি এটি করা উচিত কিনা তা দেখার জন্য আমি প্রথমে এনক্রিপ্ট করা ট্র্যাফিকটি দেখেছি এবং ওয়ার্ডপ্রেস.আরআর সাথে সংযোগ করতে ব্যবহৃত আইপি ঠিকানাটি উল্লেখ করেছি। সেটি ছিল 72.233.56.138, কখনও কখনও 72.233.56.139
অবাক করার মতো কিছু নেই, সেখানে লোড ব্যালেন্সার এবং সম্ভবত অন্যান্য অনেক সরঞ্জাম রয়েছে, তাই আমরা একটি আইপি ঠিকানার উপর নির্ভর করতে পারি না ।

তারপরে আমি ip.addr == 72.233.56.138ফিল্টার মাস্কে টাইপ করেছি , প্লাগইনটি সক্রিয় করেছি, গিয়েছিলাম wp-admin/update-core.phpএবং ওয়্যারশার্কের ট্র্যাফিকের জন্য নজর রেখেছি। সবুজ লাইনগুলি সরল পাঠ্যে অনুরোধ - আমরা যা চাই না তা হ'ল। লাল এবং কালো লাইনগুলি সাফল্যের লক্ষণ।

Wireshark

আপডেট চেকটি ঠিকঠাক হয়েছে: এটি "আরও নতুন" সংস্করণ পেয়েছে। থিম এবং মূলটির জন্য আসল আপডেটগুলি খুব ভাল হয়ে গেছে। ঠিক আমার যা প্রয়োজন ছিল।

এবং এখনও… এটি যদি ইউআরএলটির জন্য একটি সাধারণ ফিল্টার না থাকে তবে এটি আরও সহজ হতে পারে।


1
+1 এর জন্য /* /**/, কারণ এটি প্রতিভা। এবং (যদি আমি পারতাম) চার্লস ব্রনসনের জন্য আরও একটি +1। এবং তারপরে বিস্তারিত ব্যাখ্যা, মন্তব্য এবং স্ক্রিনশটগুলির জন্য আরও একটি +1 থাকা উচিত।
কায়সার

3
    add_filter('http_request_args', 'http_request_args_custom', 10,2);
    function http_request_args_custom($request,$url){
            if (strpos($url, 'wordpress.org') !== false){
                    global $replaced_url;
                    $replaced_url = 'http://wordpress.local';
            }
            return $request;
    }

    add_action('http_api_curl', 'http_api_curl_custom');
    function http_api_curl_custom(&$handle){
            global $replaced_url;
            if (!is_null($replaced_url))
                    curl_setopt( $handle, CURLOPT_URL, $replaced_url);
    }

    $http = new WP_Http();
    $response = $http->request('http://wordpress.org', array());

    var_dump($response);

1
এটি উল্লেখ করা উচিত, এই কোড উদাহরণে, HTTP_api_curl_custom ফাংশনে, গ্লোবাল ভেরিয়েবল $ প্রতিস্থাপন_url এটি ব্যবহারের পরে NULL এ সেট করা উচিত। অন্যথায়, ইউআরএলে "wordpress.org" এর প্রথম উপস্থিতির পরে, অন্য সমস্ত url প্রতিস্থাপন করা হবে।
মিহানতেলপো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.