PluginProbe
Defender Security – Malware Scanner, Login Security & Firewall / 5.3.1
Defender Security – Malware Scanner, Login Security & Firewall v5.3.1
6.3.0 6.2.3 6.2.4 6.2.0 6.2.1 6.2.2 6.1.0 5.3.1 5.4.0 5.4.1 5.5.0 5.5.1 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.7.2 5.8.0 5.8.1 5.9.0 6.0.0 6.0.1 3.0.1 3.1.0 All 141 releases
defender-security / src / component / http / class-remote-address.php

class-remote-address.php in Defender Security – Malware Scanner, Login Security & Firewall 5.3.1, at src/component/http/class-remote-address.php

121 lines 3.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Handles the determination of the remote IP address based on server settings and configurations.
4 *
5 * @package WP_Defender\Component\Http
6 */
7
8 namespace WP_Defender\Component\Http;
9
10 use WP_Defender\Model\Setting\Firewall;
11 use WP_Defender\Component\Http\Remote_Address\Classic_Remote_Address;
12 use WP_Defender\Component\Http\Remote_Address\Remote_Address as Modern_Remote_Address;
13
14 /**
15 * Service layer decides/strategist which instance of remote address class to use.
16 */
17 class Remote_Address {
18
19 /**
20 * Firewall settings instance.
21 *
22 * @var Firewall
23 */
24 private $firewall;
25
26 /**
27 * HTTP IP header name.
28 *
29 * @var string
30 */
31 private $http_ip_header = '';
32
33 /**
34 * Initializes the Remote_Address service with firewall settings.
35 */
36 public function __construct() {
37 $this->firewall = wd_di()->get( Firewall::class );
38 $this->http_ip_header = esc_html( $this->firewall->http_ip_header );
39 }
40
41 /**
42 * Sets the HTTP IP header key.
43 *
44 * @param string $http_header HTTP header key/name.
45 */
46 public function set_http_ip_header( $http_header ): void {
47 $this->http_ip_header = $http_header;
48 }
49
50 /**
51 * Determines the appropriate Remote_Address instance based on the configured HTTP IP header.
52 *
53 * @return Remote_Address The appropriate Remote_Address instance.
54 */
55 private function instance() {
56 /**
57 * Filter the HTTP IP header.
58 *
59 * @param string $http_ip_header HTTP header for identifying client's IP.
60 *
61 * @since 4.5.1
62 */
63 $http_ip_header = (string) apply_filters( 'wpdef_firewall_ip_detection', $this->http_ip_header );
64 switch ( $http_ip_header ) {
65 case 'HTTP_X_FORWARDED_FOR':
66 case 'HTTP_X_REAL_IP':
67 case 'HTTP_CF_CONNECTING_IP':
68 $remote_address = wd_di()->get( Modern_Remote_Address::class );
69 $remote_address
70 ->set_use_proxy()
71 ->set_proxy_header( $http_ip_header )
72 ->set_trusted_proxies( $this->firewall->get_trusted_proxies_ip() )
73 ->set_trusted_proxy_preset( $this->firewall->get_trusted_proxy_preset() );
74
75 return $remote_address;
76
77 case 'REMOTE_ADDR':
78 $remote_address = wd_di()->get( Modern_Remote_Address::class );
79 $remote_address->set_use_proxy( false );
80
81 return $remote_address;
82
83 default:
84 return wd_di()->get( Classic_Remote_Address::class );
85 }
86 }
87
88 /**
89 * Retrieves the client IP address using the appropriate Remote_Address instance.
90 *
91 * @return string The client IP address.
92 */
93 public function get_ip_address() {
94 return $this->instance()->get_ip_address();
95 }
96
97 /**
98 * Return HTTP IP header(s) value if it presents else failed message.
99 *
100 * @param string $http_ip_header_key HTTP header key/name.
101 *
102 * @return string Header(s) value or failure message.
103 */
104 public function get_http_ip_header_value( string $http_ip_header_key ): string {
105 $ip_array = array();
106 $server = defender_get_data_from_request( null, 's' );
107 if ( empty( $http_ip_header_key ) ) {
108 $ip_array = wd_di()->get( Classic_Remote_Address::class )->get_ip_header();
109 } elseif ( isset( $server[ $http_ip_header_key ] ) ) {
110 $ip_array[] = $server[ $http_ip_header_key ];
111 }
112
113 return ! empty( $ip_array ) ?
114 implode( ', ', $ip_array ) :
115 sprintf( /* translators: %s - HTTP IP header */
116 esc_html__( '%s header missing in $_SERVER global variable.', 'defender-security' ),
117 $http_ip_header_key
118 );
119 }
120 }
121