PluginProbe
Defender Security – Malware Scanner, Login Security & Firewall / 6.2.2
Defender Security – Malware Scanner, Login Security & Firewall v6.2.2
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 / security-tweaks / servers / class-server.php

class-server.php in Defender Security – Malware Scanner, Login Security & Firewall 6.2.2, at src/component/security-tweaks/servers/class-server.php

135 lines 3.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Responsible for determining the server software
4 * and type based on the environment or a self-ping mechanism.
5 *
6 * @package WP_Defender\Component\Security_Tweaks\Servers
7 */
8
9 namespace WP_Defender\Component\Security_Tweaks\Servers;
10
11 /**
12 * The Server class provides methods to determine the type of server on which WordPress is running.
13 * It supports detection of server software through environment variables or by making a self-ping request.
14 */
15 class Server {
16
17 public const CACHE_CURRENT_SERVER = 'defender_current_server';
18
19 /**
20 * Create a new instance of the Server_Factory class.
21 *
22 * @param mixed $server The server type.
23 *
24 * @return Server_Factory Returns an instance of Server_Factory.
25 */
26 public static function create( $server ) {
27 return new Server_Factory( $server );
28 }
29
30 /**
31 * Determine the server software by making a self-ping request to the home URL.
32 *
33 * @param string $default_server_name The default server name to return if detection fails. Defaults to 'apache'.
34 *
35 * @return string Returns the server software type or the default server name if detection fails.
36 */
37 public static function get_software_by_self_ping( $default_server_name = 'apache' ) {
38 $request = wp_remote_head(
39 home_url(),
40 array(
41 'user-agent' => defender_get_user_agent( 'Defender Self Ping' ),
42 // Most hosts don't really have valid ssl or ssl still pending.
43 'sslverify' => apply_filters( 'defender_ssl_verify', true ),
44 )
45 );
46 $server = wp_remote_retrieve_header( $request, 'server' );
47 $server = explode( '/', $server );
48
49 if ( isset( $server[0] ) ) {
50 $server = strtolower( $server[0] );
51 } else {
52 $server = $default_server_name;
53 }
54
55 return $server;
56 }
57
58 /**
59 * Get the server software from the SERVER_SOFTWARE server variable or by self-ping if not available.
60 *
61 * @return string Returns the server software type.
62 */
63 public static function get_software() {
64 $software = defender_get_data_from_request( 'SERVER_SOFTWARE', 's' );
65 if ( ! is_string( $software ) || '' === $software ) {
66 return self::get_software_by_self_ping();
67 }
68
69 $software = explode( ' ', $software );
70 $software = explode( '/', reset( $software ) );
71 if ( isset( $software[0] ) ) {
72 return strtolower( $software[0] );
73 }
74 return self::get_software_by_self_ping();
75 }
76
77 /**
78 * Determine the server.
79 *
80 * @return string
81 */
82 public static function get_current_server() {
83 $url = home_url();
84 $server_type = get_site_transient( self::CACHE_CURRENT_SERVER );
85
86 if ( ! is_array( $server_type ) ) {
87 $server_type = array();
88 }
89
90 if ( isset( $server_type[ $url ] ) && is_string( $server_type[ $url ] ) && '' !== $server_type[ $url ] ) {
91 return strtolower( $server_type[ $url ] );
92 }
93
94 // Url should end with php.
95 global $is_apache, $is_nginx, $is_IIS, $is_iis7;
96
97 if ( $is_nginx ) {
98 $server = 'nginx';
99 } elseif ( $is_apache ) {
100 // Case the url is detecting php file.
101 if ( 'php' === pathinfo( $url, PATHINFO_EXTENSION ) ) {
102 $server = 'apache';
103 } else {
104 $server = self::get_software();
105 }
106 } elseif ( $is_iis7 || $is_IIS ) {
107 $server = 'iis-7';
108 } else {
109 $server = self::get_software();
110 }
111
112 $server_type[ $url ] = $server;
113 set_site_transient( self::CACHE_CURRENT_SERVER, $server_type, 3600 );
114
115 return $server;
116 }
117
118 /**
119 * Check whether ping test failed or not.
120 *
121 * @param string $url The URL to ping.
122 *
123 * @return bool
124 */
125 public static function ping_test_failed( $url ) {
126 $response = wp_remote_post( $url, array( 'user-agent' => 'WP Defender Self Ping Test' ) );
127
128 if ( is_wp_error( $response ) ) {
129 return true;
130 }
131
132 return 200 !== wp_remote_retrieve_response_code( $response );
133 }
134 }
135