URL vệ sinh WordPress

Không có gì bí mật khi bảo mật là một phần thiết yếu của bất kỳ phần mềm nào. Trong bài viết này, tôi sẽ cho bạn biết về data sanitization và cách một số quy tắc nhỏ có thể giúp bạn bảo mật tuyệt đối cơ sở mã của mình. Nếu vệ sinh là thuốc giải độc, thì chất độc là gì? . Hãy nhìn sâu hơn vào vấn đề. Bắt đầu nào

Vệ sinh được định nghĩa là làm sạch một thứ gì đó để loại bỏ vi khuẩn hoặc các yếu tố gây bệnh

Vâng, tôi thích định nghĩa bên ngoài khoa học máy tính vì đó là một sự tương đồng tuyệt vời với thế giới thực. Vi khuẩn hoặc các yếu tố gây bệnh có thể là nguyên nhân của một số bệnh, có thể nặng, có thể nan y. Hãy bắt đầu với lý do tại sao vệ sinh lại quan trọng

Chèn mã là một bất ngờ trong dữ liệu người dùng

Chèn mã là khai thác lỗi máy tính do xử lý dữ liệu không hợp lệ. Việc tiêm được kẻ tấn công sử dụng để đưa mã (hoặc “tiêm”) vào một chương trình máy tính dễ bị tổn thương và thay đổi quá trình thực thi. Kết quả của việc tiêm mã thành công có thể là thảm họa, ví dụ, bằng cách cho phép vi-rút máy tính hoặc sâu máy tính lan truyền

Các lỗ hổng chèn mã xảy ra khi một ứng dụng gửi dữ liệu không đáng tin cậy tới một trình thông dịch. Các lỗi chèn thường được tìm thấy nhiều nhất trong các truy vấn SQL, LDAP, XPath, NoSQL, lệnh OS, trình phân tích cú pháp XML, tiêu đề SMTP, đối số chương trình, v.v. Các lỗ hổng tiêm nhiễm có xu hướng dễ phát hiện hơn khi kiểm tra mã nguồn hơn là thông qua thử nghiệm

Wikipedia

Chèn mã là tên chung cho tất cả các lỗ hổng dựa trên việc thêm và chạy mã dễ bị tấn công. Tất cả các lần tiêm mã đều hoạt động theo cùng một cách. Trên ví dụ SQL injection, chúng ta có thể xem và đi sâu vào quy trình injection

get_results(
	'SELECT ID, post_title, post_content FROM ' . $wpdb->posts . '
	WHERE post_type="post"
	AND post_content LIKE "%' . $search . '%"'
);

wp_send_json_success( $posts );

Bạn có thể xem một nơi để tiêm? . Tuy nhiên, trong trường hợp tích cực, khi khách hàng nhập một số từ hoặc cụm từ, mọi thứ sẽ hoạt động mà không gặp bất kỳ sự cố nào. Tuy nhiên, trong trường hợp cực đoan, điều gì có thể xảy ra nếu ai đó nhập mã SQL vào đây?

Nhìn vào mã, bạn hoàn toàn có thể lấy bất kỳ dữ liệu nào từ cơ sở dữ liệu. Bạn không tin à? . Do đó, có thể có các loại bài đăng khác, bài đăng riêng tư, v.v.

Chúng tôi cũng có thể lấy dữ liệu khác, chẳng hạn như tên người dùng và mật khẩu nếu chúng tôi gửi mã %" UNION SELECT 0, user_pass, user_login FROM wp_users WHERE user_pass LIKE "%". Mặc dù chúng tôi có hàm băm thay vì mật khẩu thực, nhưng vẫn dễ dàng bẻ khóa bằng các chương trình đoán mật khẩu như John The Ripper hoặc tương tự

Bất chấp vấn đề này, công thức ngăn ngừa tiêm là một, và nó rất đơn giản. xóa các ký tự không mong muốn khỏi dữ liệu người dùng hay nói cách khác là làm sạch đầu vào của người dùng

Kỹ thuật đầu vào bảo mật hoặc vệ sinh sớm

Để làm sạch có nghĩa là loại bỏ các ký tự không mong muốn (e. g. , ký hiệu HTML, một số mã, ký hiệu đặc biệt, v.v. ) từ đầu vào của người dùng

Khi xử lý đầu vào của người dùng, bạn phải luôn làm sạch những dữ liệu này một lần, càng sớm càng tốt

Hãy nhớ rằng ngay cả một yêu cầu bất ngờ cũng có thể gây ra nhiều vấn đề, mất ngủ và đau đầu

Mặc dù các định nghĩa ngắn gọn và rõ ràng nhưng chúng ta cần hiểu rõ ý nghĩa của từng thành phần. Đầu vào của người dùng có nghĩa là gì?

Vì tất cả các nhà phát triển nên sử dụng một công cụ mạnh mẽ như IDE, có thể tự động ghi nhớ thời điểm thực hiện một số hành động nhất định, nên tất nhiên việc vệ sinh cũng không ngoại lệ. Nhóm WordPress đã chuẩn bị các Tiêu chuẩn mã hóa WordPress, ngoài việc kiểm tra các tiêu chuẩn mã hóa, còn nhắc nhở chúng tôi vệ sinh đầu vào của người dùng

Bạn đã đọc về việc vệ sinh hàng chục lần trước đây, nhưng nó có nghĩa là gì?

Danh sách các chức năng khử trùng PHP

Dưới đây là danh sách các chức năng khử trùng PHP

  • 7
  • 8
  • 9
  • get_results(
    	'SELECT ID, post_title, post_content FROM ' . $wpdb->posts . '
    	WHERE post_type="post"
    	AND post_content LIKE "%' . $search . '%"' // SQL Injection here.
    );
    
    wp_send_json_success( $posts );
    0
  • get_results(
    	'SELECT ID, post_title, post_content FROM ' . $wpdb->posts . '
    	WHERE post_type="post"
    	AND post_content LIKE "%' . $search . '%"' // SQL Injection here.
    );
    
    wp_send_json_success( $posts );
    1
  • get_results(
    	'SELECT ID, post_title, post_content FROM ' . $wpdb->posts . '
    	WHERE post_type="post"
    	AND post_content LIKE "%' . $search . '%"' // SQL Injection here.
    );
    
    wp_send_json_success( $posts );
    2
  • get_results(
    	'SELECT ID, post_title, post_content FROM ' . $wpdb->posts . '
    	WHERE post_type="post"
    	AND post_content LIKE "%' . $search . '%"' // SQL Injection here.
    );
    
    wp_send_json_success( $posts );
    3
  • get_results(
    	'SELECT ID, post_title, post_content FROM ' . $wpdb->posts . '
    	WHERE post_type="post"
    	AND post_content LIKE "%' . $search . '%"' // SQL Injection here.
    );
    
    wp_send_json_success( $posts );
    4
  • vân vân

Danh sách chức năng vệ sinh WordPress

Và các chức năng vệ sinh WordPress

  • get_results(
    	'SELECT ID, post_title, post_content FROM ' . $wpdb->posts . '
    	WHERE post_type="post"
    	AND post_content LIKE "%' . $search . '%"' // SQL Injection here.
    );
    
    wp_send_json_success( $posts );
    5
  • get_results(
    	'SELECT ID, post_title, post_content FROM ' . $wpdb->posts . '
    	WHERE post_type="post"
    	AND post_content LIKE "%' . $search . '%"' // SQL Injection here.
    );
    
    wp_send_json_success( $posts );
    6
  • get_results(
    	'SELECT ID, post_title, post_content FROM ' . $wpdb->posts . '
    	WHERE post_type="post"
    	AND post_content LIKE "%' . $search . '%"' // SQL Injection here.
    );
    
    wp_send_json_success( $posts );
    7
  • get_results(
    	'SELECT ID, post_title, post_content FROM ' . $wpdb->posts . '
    	WHERE post_type="post"
    	AND post_content LIKE "%' . $search . '%"' // SQL Injection here.
    );
    
    wp_send_json_success( $posts );
    8
  • get_results(
    	'SELECT ID, post_title, post_content FROM ' . $wpdb->posts . '
    	WHERE post_type="post"
    	AND post_content LIKE "%' . $search . '%"' // SQL Injection here.
    );
    
    wp_send_json_success( $posts );
    9
  • insert(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->update(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'ID' => absint( $_POST['post_id'] ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->query(
    	$wpdb->prepare(
    		"SELECT * FROM {$wpdb->posts} WHERE ID > %d AND post_title LIKE %s",
    		absint( $_POST['post_id'] ),
    		'%' . $wpdb->esc_like( sanitize_text_field( wp_unslash( $_POST['search'] ) ) ) . '%'
    	)
    );
    0
  • insert(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->update(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'ID' => absint( $_POST['post_id'] ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->query(
    	$wpdb->prepare(
    		"SELECT * FROM {$wpdb->posts} WHERE ID > %d AND post_title LIKE %s",
    		absint( $_POST['post_id'] ),
    		'%' . $wpdb->esc_like( sanitize_text_field( wp_unslash( $_POST['search'] ) ) ) . '%'
    	)
    );
    1
  • insert(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->update(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'ID' => absint( $_POST['post_id'] ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->query(
    	$wpdb->prepare(
    		"SELECT * FROM {$wpdb->posts} WHERE ID > %d AND post_title LIKE %s",
    		absint( $_POST['post_id'] ),
    		'%' . $wpdb->esc_like( sanitize_text_field( wp_unslash( $_POST['search'] ) ) ) . '%'
    	)
    );
    2
  • insert(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->update(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'ID' => absint( $_POST['post_id'] ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->query(
    	$wpdb->prepare(
    		"SELECT * FROM {$wpdb->posts} WHERE ID > %d AND post_title LIKE %s",
    		absint( $_POST['post_id'] ),
    		'%' . $wpdb->esc_like( sanitize_text_field( wp_unslash( $_POST['search'] ) ) ) . '%'
    	)
    );
    3
  • insert(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->update(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'ID' => absint( $_POST['post_id'] ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->query(
    	$wpdb->prepare(
    		"SELECT * FROM {$wpdb->posts} WHERE ID > %d AND post_title LIKE %s",
    		absint( $_POST['post_id'] ),
    		'%' . $wpdb->esc_like( sanitize_text_field( wp_unslash( $_POST['search'] ) ) ) . '%'
    	)
    );
    4
  • insert(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->update(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'ID' => absint( $_POST['post_id'] ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->query(
    	$wpdb->prepare(
    		"SELECT * FROM {$wpdb->posts} WHERE ID > %d AND post_title LIKE %s",
    		absint( $_POST['post_id'] ),
    		'%' . $wpdb->esc_like( sanitize_text_field( wp_unslash( $_POST['search'] ) ) ) . '%'
    	)
    );
    5
  • insert(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->update(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'ID' => absint( $_POST['post_id'] ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->query(
    	$wpdb->prepare(
    		"SELECT * FROM {$wpdb->posts} WHERE ID > %d AND post_title LIKE %s",
    		absint( $_POST['post_id'] ),
    		'%' . $wpdb->esc_like( sanitize_text_field( wp_unslash( $_POST['search'] ) ) ) . '%'
    	)
    );
    6
  • insert(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->update(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'ID' => absint( $_POST['post_id'] ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->query(
    	$wpdb->prepare(
    		"SELECT * FROM {$wpdb->posts} WHERE ID > %d AND post_title LIKE %s",
    		absint( $_POST['post_id'] ),
    		'%' . $wpdb->esc_like( sanitize_text_field( wp_unslash( $_POST['search'] ) ) ) . '%'
    	)
    );
    7
  • insert(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->update(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'ID' => absint( $_POST['post_id'] ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->query(
    	$wpdb->prepare(
    		"SELECT * FROM {$wpdb->posts} WHERE ID > %d AND post_title LIKE %s",
    		absint( $_POST['post_id'] ),
    		'%' . $wpdb->esc_like( sanitize_text_field( wp_unslash( $_POST['search'] ) ) ) . '%'
    	)
    );
    8
  • insert(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->update(
    	$wpdb->posts,
    	[
    		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
    	],
    	[
    		'ID' => absint( $_POST['post_id'] ),
    	],
    	[
    		'%s',
    	]
    );
    
    $wpdb->query(
    	$wpdb->prepare(
    		"SELECT * FROM {$wpdb->posts} WHERE ID > %d AND post_title LIKE %s",
    		absint( $_POST['post_id'] ),
    		'%' . $wpdb->esc_like( sanitize_text_field( wp_unslash( $_POST['search'] ) ) ) . '%'
    	)
    );
    9
  • function security_sanitize_orderby( $string, $default = 'ASC' ) {
    
    	$string          = strtoupper( trim( sanitize_text_field( wp_unslash( $string ) ) ) );
    	$allowed_orderby = [
    		'RAND()',
    		'ASC',
    		'DESC',
    	];
    	$default         = in_array( $default, $allowed_orderby, true ) ? $default : 'ASC';
    
    	foreach ( $allowed_orderby as $orderby ) {
    		if ( $string === $orderby ) {
    			return $orderby;
    		}
    	}
    
    	return $default;
    }
    0
  • function security_sanitize_orderby( $string, $default = 'ASC' ) {
    
    	$string          = strtoupper( trim( sanitize_text_field( wp_unslash( $string ) ) ) );
    	$allowed_orderby = [
    		'RAND()',
    		'ASC',
    		'DESC',
    	];
    	$default         = in_array( $default, $allowed_orderby, true ) ? $default : 'ASC';
    
    	foreach ( $allowed_orderby as $orderby ) {
    		if ( $string === $orderby ) {
    			return $orderby;
    		}
    	}
    
    	return $default;
    }
    1
  • function security_sanitize_orderby( $string, $default = 'ASC' ) {
    
    	$string          = strtoupper( trim( sanitize_text_field( wp_unslash( $string ) ) ) );
    	$allowed_orderby = [
    		'RAND()',
    		'ASC',
    		'DESC',
    	];
    	$default         = in_array( $default, $allowed_orderby, true ) ? $default : 'ASC';
    
    	foreach ( $allowed_orderby as $orderby ) {
    		if ( $string === $orderby ) {
    			return $orderby;
    		}
    	}
    
    	return $default;
    }
    2
  • function security_sanitize_orderby( $string, $default = 'ASC' ) {
    
    	$string          = strtoupper( trim( sanitize_text_field( wp_unslash( $string ) ) ) );
    	$allowed_orderby = [
    		'RAND()',
    		'ASC',
    		'DESC',
    	];
    	$default         = in_array( $default, $allowed_orderby, true ) ? $default : 'ASC';
    
    	foreach ( $allowed_orderby as $orderby ) {
    		if ( $string === $orderby ) {
    			return $orderby;
    		}
    	}
    
    	return $default;
    }
    3
  • function security_sanitize_orderby( $string, $default = 'ASC' ) {
    
    	$string          = strtoupper( trim( sanitize_text_field( wp_unslash( $string ) ) ) );
    	$allowed_orderby = [
    		'RAND()',
    		'ASC',
    		'DESC',
    	];
    	$default         = in_array( $default, $allowed_orderby, true ) ? $default : 'ASC';
    
    	foreach ( $allowed_orderby as $orderby ) {
    		if ( $string === $orderby ) {
    			return $orderby;
    		}
    	}
    
    	return $default;
    }
    4
  • function security_sanitize_orderby( $string, $default = 'ASC' ) {
    
    	$string          = strtoupper( trim( sanitize_text_field( wp_unslash( $string ) ) ) );
    	$allowed_orderby = [
    		'RAND()',
    		'ASC',
    		'DESC',
    	];
    	$default         = in_array( $default, $allowed_orderby, true ) ? $default : 'ASC';
    
    	foreach ( $allowed_orderby as $orderby ) {
    		if ( $string === $orderby ) {
    			return $orderby;
    		}
    	}
    
    	return $default;
    }
    5
  • function security_sanitize_orderby( $string, $default = 'ASC' ) {
    
    	$string          = strtoupper( trim( sanitize_text_field( wp_unslash( $string ) ) ) );
    	$allowed_orderby = [
    		'RAND()',
    		'ASC',
    		'DESC',
    	];
    	$default         = in_array( $default, $allowed_orderby, true ) ? $default : 'ASC';
    
    	foreach ( $allowed_orderby as $orderby ) {
    		if ( $string === $orderby ) {
    			return $orderby;
    		}
    	}
    
    	return $default;
    }
    6
  • function security_sanitize_orderby( $string, $default = 'ASC' ) {
    
    	$string          = strtoupper( trim( sanitize_text_field( wp_unslash( $string ) ) ) );
    	$allowed_orderby = [
    		'RAND()',
    		'ASC',
    		'DESC',
    	];
    	$default         = in_array( $default, $allowed_orderby, true ) ? $default : 'ASC';
    
    	foreach ( $allowed_orderby as $orderby ) {
    		if ( $string === $orderby ) {
    			return $orderby;
    		}
    	}
    
    	return $default;
    }
    7
  • function security_sanitize_orderby( $string, $default = 'ASC' ) {
    
    	$string          = strtoupper( trim( sanitize_text_field( wp_unslash( $string ) ) ) );
    	$allowed_orderby = [
    		'RAND()',
    		'ASC',
    		'DESC',
    	];
    	$default         = in_array( $default, $allowed_orderby, true ) ? $default : 'ASC';
    
    	foreach ( $allowed_orderby as $orderby ) {
    		if ( $string === $orderby ) {
    			return $orderby;
    		}
    	}
    
    	return $default;
    }
    8
  • function security_sanitize_orderby( $string, $default = 'ASC' ) {
    
    	$string          = strtoupper( trim( sanitize_text_field( wp_unslash( $string ) ) ) );
    	$allowed_orderby = [
    		'RAND()',
    		'ASC',
    		'DESC',
    	];
    	$default         = in_array( $default, $allowed_orderby, true ) ? $default : 'ASC';
    
    	foreach ( $allowed_orderby as $orderby ) {
    		if ( $string === $orderby ) {
    			return $orderby;
    		}
    	}
    
    	return $default;
    }
    9
  • 
    
    	
    	
    		
    			
    				
    			
    			
    				
    			
    		
    	
    	
    
    
    0
  • 
    
    	
    	
    		
    			
    				
    			
    			
    				
    			
    		
    	
    	
    
    
    1
  • 
    
    	
    	
    		
    			
    				
    			
    			
    				
    			
    		
    	
    	
    
    
    2
  • 
    
    	
    	
    		
    			
    				
    			
    			
    				
    			
    		
    	
    	
    
    
    3
  • 
    
    	
    	
    		
    			
    				
    			
    			
    				
    			
    		
    	
    	
    
    
    4
  • 
    
    	
    	
    		
    			
    				
    			
    			
    				
    			
    		
    	
    	
    
    
    5
  • 
    
    	
    	
    		
    			
    				
    			
    			
    				
    			
    		
    	
    	
    
    
    6
  • 
    
    	
    	
    		
    			
    				
    			
    			
    				
    			
    		
    	
    	
    
    
    7
  • 
    
    	
    	
    		
    			
    				
    			
    			
    				
    			
    		
    	
    	
    
    
    8
  • 
    
    	
    	
    		
    			
    				
    			
    			
    				
    			
    		
    	
    	
    
    
    9
  • vân vân

Mặc dù có rất nhiều chức năng ở trên, nhưng làm cách nào để tìm được chức năng phù hợp với trường hợp của tôi? . Nói cách khác, hãy nhìn vào dữ liệu của bạn và suy nghĩ một cách logic. Đương nhiên, người bạn thân nhất của bạn là tư duy phản biện và tính năng tự động hoàn thành trong PhpStorm. Ngoài ra, vui lòng đi sâu vào cách các chức năng này và điều tra mã của chúng. Hãy đi sâu vào một vài ví dụ

Để làm cho nó dễ dàng, tôi đã chuẩn bị một danh sách rút gọn về những gì sẽ sử dụng và khi nào nên sử dụng nó

  • số – $search = $_POST['search'];0, $search = $_POST['search'];1, $search = $_POST['search'];2
  • nonce – $search = $_POST['search'];3
  • trường một dòng – $search = $_POST['search'];4
  • trường vài dòng – $search = $_POST['search'];5
  • email – $search = $_POST['search'];6
  • url – $search = $_POST['search'];7, $search = $_POST['search'];8
  • tên tệp – $search = $_POST['search'];9

Tại sao đôi khi chúng ta sử dụng wp_unslash?

Các nhà phát triển cốt lõi của WordPress quan tâm đến bảo mật trang web và thêm dấu gạch chéo bổ sung cho các ký tự như tùy chọn, nội dung bài đăng, dữ liệu người dùng, v.v. để ngăn chặn các cuộc tấn công XSS. Các cuộc tấn công XSS là một chủ đề lớn mà chúng ta sẽ thảo luận trong một bài viết khác, nhưng tóm lại, nếu ai đó tìm cách đưa mã %" OR 1 = "10 vào cơ sở dữ liệu của bạn, mã đó sẽ được lưu trữ trong cơ sở dữ liệu dưới dạng %" OR 1 = "11 và kết quả là, tập lệnh

Làm cách nào để bảo vệ cơ sở dữ liệu WordPress của bạn?

Một điều quan trọng khác mà bạn cần chú ý là làm việc với cơ sở dữ liệu. Chỉ sử dụng các chức năng của WordPress như get_posts, get_terms, get_users, v.v. cho điều này, vì chúng an toàn. Được rồi, nhưng phải làm gì với các bảng tùy chỉnh và truy vấn SQL?

Vệ sinh không thể đảm bảo bảo vệ chống lại SQL injection

Hãy điều tra ví dụ sau

get_results(
	'SELECT ID, post_title, post_content FROM ' . $wpdb->posts . '
	WHERE post_type="post"
	AND post_content LIKE "%' . $search . '%"' // SQL Injection here.
);

wp_send_json_success( $posts );

Đoạn mã trên vẫn dễ bị tổn thương. SQL injection có thể được thông qua theo nhiều cách khác nhau

  • Đa truy vấn — đóng một truy vấn trước đó và viết thêm một truy vấn nữa
  • Truy vấn phụ — sử dụng truy vấn phụ làm giá trị cho truy vấn chính
  • Ngắt trích dẫn — bằng cách đóng trích dẫn và thêm mã sau
  • Câu lệnh %" OR 1 = "12 — thêm truy vấn mới thông qua cấu trúc %" OR 1 = "13

Ví dụ đa truy vấn. %" OR 1 = "14

Về mặt kỹ thuật, PHP chỉ cho phép truy vấn đa truy vấn thông qua các hàm %" OR 1 = "15 và %" OR 1 = "16 (hoặc các đối tác hướng đối tượng của chúng)

Thứ nhất, tin tốt là WordPress không sử dụng chúng và để bảo vệ mã của bạn khỏi các lệnh tiêm SQL đa truy vấn, bạn chỉ nên luôn sử dụng ____________7 cho các truy vấn tùy chỉnh

Thứ hai, các truy vấn con chỉ có thể đưa vào các giá trị số và vào câu lệnh IN. Đây là hai quy tắc. khử trùng các giá trị số thông qua %" OR 1 = "18, %" OR 1 = "19, %" UNION SELECT 0, user_pass, user_login FROM wp_users WHERE user_pass LIKE "%"0, v.v. , và không sử dụng các chuỗi có thể thay đổi bên trong câu lệnh %" UNION SELECT 0, user_pass, user_login FROM wp_users WHERE user_pass LIKE "%"1 (vâng, khó đấy, nhưng tôi không có công thức nào khác

Cuối cùng nhưng không kém phần quan trọng, để tránh việc trích dẫn bị phá vỡ và việc sử dụng các câu lệnh %" OR 1 = "12. Bạn nên sử dụng phương pháp %" OR 1 = "17 đặc biệt để tạo, cập nhật, thay thế và xóa hoặc phương pháp %" UNION SELECT 0, user_pass, user_login FROM wp_users WHERE user_pass LIKE "%"4 trước tiên trong tất cả các trường hợp khác

Để tóm tắt tất cả các quy tắc này cho các truy vấn tùy chỉnh

  • Luôn sử dụng %" OR 1 = "17
  • Luôn làm sạch các giá trị
  • Các giá trị số nên được vệ sinh cẩn thận hơn
  • Không sử dụng các giá trị chuỗi có thể thay đổi bên trong các câu lệnh %" UNION SELECT 0, user_pass, user_login FROM wp_users WHERE user_pass LIKE "%"1
  • Để tạo, cập nhật và xóa, hãy sử dụng các phương pháp ________ 58 _______7 đặc biệt
    • %" UNION SELECT 0, user_pass, user_login FROM wp_users WHERE user_pass LIKE "%"8
    • %" UNION SELECT 0, user_pass, user_login FROM wp_users WHERE user_pass LIKE "%"9
    • $_REQUEST0
    • $_REQUEST1
  • Để đọc luôn sử dụng $_REQUEST2 bên trong
    • $_REQUEST3
    • $_REQUEST4
    • $_REQUEST5
    • $_REQUEST6
    • $_REQUEST7

Ngoài ra, một vài ví dụ về cách sử dụng phương pháp %" OR 1 = "17 thích hợp

insert(
	$wpdb->posts,
	[
		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
	],
	[
		'%s',
	]
);

$wpdb->update(
	$wpdb->posts,
	[
		'post_title' => sanitize_text_field( wp_unslash( $_POST['post_title'] ) ),
	],
	[
		'ID' => absint( $_POST['post_id'] ),
	],
	[
		'%s',
	]
);

$wpdb->query(
	$wpdb->prepare(
		"SELECT * FROM {$wpdb->posts} WHERE ID > %d AND post_title LIKE %s",
		absint( $_POST['post_id'] ),
		'%' . $wpdb->esc_like( sanitize_text_field( wp_unslash( $_POST['search'] ) ) ) . '%'
	)
);

Làm cách nào để tạo chức năng khử trùng tùy chỉnh?

Khi bạn đang làm việc trong một dự án lớn, rất có thể bạn sẽ cần các chức năng của riêng mình để dọn dẹp dữ liệu. Trong ví dụ bên dưới, chúng ta có một hàm khá lớn để xử lý thứ tự sắp xếp

function security_sanitize_orderby( $string, $default = 'ASC' ) {

	$string          = strtoupper( trim( sanitize_text_field( wp_unslash( $string ) ) ) );
	$allowed_orderby = [
		'RAND()',
		'ASC',
		'DESC',
	];
	$default         = in_array( $default, $allowed_orderby, true ) ? $default : 'ASC';

	foreach ( $allowed_orderby as $orderby ) {
		if ( $string === $orderby ) {
			return $orderby;
		}
	}

	return $default;
}

Tuy nhiên, thêm một chức năng là không đủ vì ai cũng muốn tắt tiếng một số quy tắc PHPCS?



	
	
		
			
				
			
			
				
			
		
	
	

Một vài Ở trên, chúng tôi đã thêm hai phần. $_REQUEST9 và

00. Phần đầu tiên đăng ký chức năng vệ sinh của bạn. Tương tự như vậy, phần thứ hai cho phép bạn bỏ qua việc bỏ dấu gạch chéo trước

Để kết thúc, hãy luôn làm sạch đầu vào của người dùng để đảm bảo rằng dữ liệu của bạn nằm trong tầm kiểm soát của bạn. Tương tự như vậy, bạn phải vệ sinh dữ liệu một lần và càng sớm càng tốt. Ngay cả một mũi tiêm cũng có thể khiến nhiều đêm mất ngủ. Ngoài ra, nếu bạn xử lý một nguồn mở, hãy chú ý hai lần để vệ sinh

Làm cách nào để khử trùng một URL trong PHP?

Chúng tôi có thể làm sạch URL bằng cách sử dụng FILTER_SANITIZE_URL . Hàm này xóa tất cả các ký tự ngoại trừ chữ cái, chữ số và $-_. +. *'(),{}. \\^~[]`<>#%";/?. @&=.

Sanitize_text_field là gì?

sanitize_textarea_field( string $str ). chuỗi . Sanitizes a multiline string from user input or from the database.

Làm cách nào bạn có thể biến một chuỗi thành một con sên trong WordPress?

sanitize_title( string $title, string $fallback_title = '', string $context = 'save' ) . chuỗi. Biến chuỗi thành slug, có thể được sử dụng trong URL hoặc thuộc tính HTML.

Vệ sinh thoát hiểm là gì?

Thoát khỏi vệ sinh . g. portlet tin nhắn trên bảng điều khiển). Trong những trường hợp như vậy, chúng tôi không muốn thoát khỏi HTML, nhưng chúng tôi vẫn cần "làm sạch" nó (tôi. e. xóa hoặc thoát bất kỳ thẻ HTML "không an toàn" nào, chẳng hạn như ).