*/ public static function blocked_extensions() { return [ 'sql', 'sqlite', 'sqlite3', 'db', 'pem', 'key', 'p12', 'pfx', 'crt', 'cer', 'zip', 'gz', 'tar', 'rar', '7z' ]; } /** @return array */ public static function binary_extensions() { return [ 'jpg', 'jpeg', 'png', 'gif', 'webp', 'pdf' ]; } /** @return array */ public static function source_text_extensions() { return [ 'php', 'js', 'css', 'json', 'html', 'htm', 'xml', 'yml', 'yaml', 'txt', 'md' ]; } /** @return array */ public static function readable_extensions() { return array_values( array_unique( array_merge( self::source_text_extensions(), [ 'log', 'ini', 'csv', 'conf' ] ) ) ); } /** @return bool */ public static function has_sensitive_basename( $path ) { $basename = strtolower( basename( (string) $path ) ); if ( '.env' === $basename || 0 === strpos( $basename, '.env.' ) ) { return true; } return false !== strpos( $basename, 'credentials' ) || false !== strpos( $basename, 'id_rsa' ); } /** @return bool */ public static function is_hard_blocked_for_read( $path ) { $extension = strtolower( pathinfo( basename( (string) $path ), PATHINFO_EXTENSION ) ); return in_array( $extension, array_merge( self::blocked_extensions(), self::binary_extensions() ), true ) || self::has_sensitive_basename( $path ); } /** @return bool */ public static function is_readable_text_candidate( $path ) { $basename = strtolower( basename( (string) $path ) ); $extension = strtolower( pathinfo( $basename, PATHINFO_EXTENSION ) ); return in_array( $extension, self::readable_extensions(), true ) || in_array( $basename, [ '.htaccess', 'wp-config.php', 'wp-config-sample.php', 'debug.log', 'error_log' ], true ); } /** * @param string $absolute_path * @return string */ public static function to_portable_path( $absolute_path ) { $absolute_path = wp_normalize_path( (string) $absolute_path ); $content_root = defined( 'WP_CONTENT_DIR' ) ? realpath( WP_CONTENT_DIR ) : false; if ( $content_root ) { $content_root = wp_normalize_path( untrailingslashit( $content_root ) ); if ( $absolute_path === $content_root ) { return 'WP_CONTENT_DIR'; } if ( 0 === strpos( $absolute_path, trailingslashit( $content_root ) ) ) { return 'WP_CONTENT_DIR/' . ltrim( substr( $absolute_path, strlen( trailingslashit( $content_root ) ) ), '/' ); } } $abspath = realpath( ABSPATH ); if ( $abspath ) { $abspath = wp_normalize_path( untrailingslashit( $abspath ) ); if ( $absolute_path === $abspath ) { return 'ABSPATH'; } if ( 0 === strpos( $absolute_path, trailingslashit( $abspath ) ) ) { return ltrim( substr( $absolute_path, strlen( trailingslashit( $abspath ) ) ), '/' ); } } return basename( $absolute_path ); } /** * @param string $root * @return string */ public static function normalize_content_root_token( $root ) { $root = trim( str_replace( '\\', '/', (string) $root ) ); $root = ltrim( $root, '/' ); $root = untrailingslashit( $root ); if ( 'WP_CONTENT_DIR' === $root || 0 === strpos( $root, 'WP_CONTENT_DIR/' ) ) { return $root; } return ''; } /** * @param string $portable * @return string|false */ public static function resolve_content_path( $portable ) { if ( ! defined( 'WP_CONTENT_DIR' ) ) { return false; } $portable = self::normalize_content_root_token( $portable ); if ( '' === $portable ) { return false; } $suffix = 'WP_CONTENT_DIR' === $portable ? '' : substr( $portable, strlen( 'WP_CONTENT_DIR/' ) ); $path = WP_CONTENT_DIR . ( '' === $suffix ? '' : '/' . $suffix ); return realpath( $path ); } }