جعل درخواست بین سایتی (CSRF) یک آسیب پذیری امنیتی است که به مهاجمان اجازه می دهد تا کاربران را فریب دهند تا بدون اطلاع یا رضایت آنها اقداماتی را در یک وب سایت انجام دهند. این یک تهدید جدی است، به ویژه برای وب سایت هایی که داده ها یا تراکنش های حساس را پردازش می کنند.

برای محافظت در برابر حملات CSRF، از nonces در کد وردپرس خود استفاده کنید.

توجه: ما می دانیم که اصطلاح “nonce” یک اصطلاح عامیانه در بریتانیا است و ممکن است در آینده به روز شود. در این مورد، ما فقط به اصطلاح فنی فعلی اشاره می کنیم.

نونس ها چیست؟

nonce یک نشانه یک بار مصرف است که برای هر جلسه کاربر ایجاد می شود. nonce می تواند در فرم، URL یا درخواست AJAX گنجانده شود و برای تأیید مشروعیت آن درخواست استفاده می شود.

با کمک به مبارزه با حملات CSRF، یک نکته تضمین می کند که اقدام فرمی که انجام می شود توسط کاربر مورد نظر بوده است. تأیید می کند که درخواست قانونی است و نمی تواند توسط مهاجمان دستکاری شود.

هنگام تأیید اعتبار یک nonce، مراقب اپراتوری که در شرطی خود استفاده می کنید باشید. در یک نگاه، موارد زیر ایمن به نظر می‌رسند، اما با ارسال هر مقدار nonce به راحتی قابل بهره‌برداری هستند:

// ❌ incorrect nonce validation.
if ( ! isset( $_POST['_wpnonce'] ) && ! wp_verify_nonce( $_POST['_wpnonce'], 'update-post' )  ) {
  return;
}

Instead, a correct validation would look like this:


if ( ! isset( $_POST['_wpnonce'] ) || ! wp_verify_nonce( $_POST['_wpnonce'], 'update-post' ) ) {
return;
}

استفاده از nonces در وردپرس VIP

هر کسی که برای وردپرس VIP کد نویسی می کند باید با هوشیاری از اعتبارسنجی، پاکسازی و فرار استفاده کند تا به طور ایمن داده های ورودی به وردپرس را مدیریت کند و آنها را به کاربر نهایی ارائه دهد. برای محافظت در برابر حملات CSRF، از nonces برای تأیید اعتبار تمام فرم های ارسالی استفاده کنید.

سه راه اصلی برای گنجاندن nonces در کد VIP وردپرس وجود دارد: از طریق URL، فرم و AJAX.

1. آدرس های غیر اینترنتی

برای افزودن یک nonce به URL، از تابع ()wp_nonce_url استفاده کنید. این تابع یک URL تولید می کند که شامل یک nonce است که می تواند با استفاده از تابع wp_verify_nonce تأیید شود.

نمونه کد URL nonce:

<?php
// Create a menu page for the demo nonce URL link.
add_action( 'admin_menu', function() {
	add_menu_page(
		'URL Nonce Example',
		'URL Nonce Example',
		'publish_posts',
		'vip__nonce_url_link',
		'vip__nonce_url_link_callback'
	);
} );

// Contents for the demo nonce URL page.
function vip__nonce_url_link_callback () {
	/**
	 * Verify the nonce URL exists & is legitimate.
	 *
	 * @see https://codex.wordpress.org/Function_Reference/wp_verify_nonce
	 */
	if ( isset( $_GET['_vip__nonce'] ) && wp_verify_nonce( $_GET['_vip__nonce'], 'vip__nonce_action' ) ) {
		?>
		<p>✅ Valid nonce.</p>
		<?php
		return;
	}

	$url = admin_url('options.php?page=vip__nonce_url_link');

	/**
	 * Create a nonce URL.
	 *
	 * @see https://codex.wordpress.org/Function_Reference/wp_nonce_url
	 */
	$nonce_url = wp_nonce_url( $url, 'vip__nonce_action', '_vip__nonce' );
	?>
	<a href="https://wpvip.com/2023/02/28/how-to-protect-against-csrf-attacks-with-wordpress-nonces/<?php echo esc_url( $nonce_url ); ?>" class="button button-primary">Nonce URL »</a>
	<?php
}

2. نونها را تشکیل دهید

برای افزودن یک nonce به فرم، از تابع ()wp_nonce_field استفاده کنید. این تابع یک فیلد فرم مخفی ایجاد می کند که شامل یک nonce است که می تواند با استفاده از توابع check_admin_referer()، check_ajax_referer() یا wp_verify_nonce() تأیید شود.

توجه: استفاده از check_admin_referer() بدون آرگومان action یا check_ajax_referer() با آخرین آرگومان تنظیم شده روی false، می تواند منجر به دور زدن CSRF شود.

نمونه کد nonce فرم:

<?php
// Add custom metabox to `post` post types.
add_action( 'add_meta_boxes', function () {
	add_meta_box(
		'vip__metabox_nonce_example',
		'Example Field',
		'vip__custom_post_metabox',
		'post'
	);
} );

function vip__custom_post_metabox( $post ) {
	/**
	 * Create a hidden nonce field, along side a custom form field.
	 *
	 * @see https://codex.wordpress.org/Function_Reference/wp_nonce_field
	 */
	wp_nonce_field( 'vip__metabox_checkbox', '_vip__nonce' );
	?>
	<label>
		<input type="checkbox" name="vip__checkbox" />
	</label>
	<?php
}

add_action( 'save_post', function ( $post_id, $post ) {

	if ( 'post' !== $post->post_type ) {
		return;
	}
	if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
		return;
	}
	if ( ! current_user_can( 'edit_post', $post_id ) ) {
		return;
	}
	/**
	 * Verify the nonce exists & verify it's correct.
	 *
	 * @see https://codex.wordpress.org/Function_Reference/wp_verify_nonce
	 */
	if ( ! isset( $_POST['_vip__nonce'] ) || ! wp_verify_nonce( $_POST['_vip__nonce'], 'vip__metabox_checkbox' ) ) {
		return;
	}

	// valid request, do something with `$_POST['vip__checkbox']`.

}, 10, 2 );

3. نونس های AJAX

برای افزودن یک nonce به درخواست AJAX، nonce را در داده های ارسال شده به سرور قرار دهید. با استفاده از تابع ()wp_verify_nonce یا check_ajax_referer، nonce را در سمت سرور تأیید کنید. احتیاط: استفاده از روش تأیید دوم با آخرین آرگومان تنظیم شده روی false می تواند منجر به بای پس CSRF شود.

نمونه کد AJAX nonce:

<?php
// Create a menu page for the demo AJAX script.
add_action( 'admin_menu', function() {
	add_menu_page(
		'AJAX Nonce Example',
		'AJAX Nonce Example',
		'publish_posts',
		'vip__ajax_form',
		'vip__ajax_form_callback'
	);
} );

// Contents for the demo menu page.
function vip__ajax_form_callback() {
	/**
	 * Create the nonce for the admin page, including the action name for context.
	 *
	 * @see https://codex.wordpress.org/Function_Reference/wp_create_nonce
	 */
	$ajax_nonce = wp_create_nonce( "vip__ajax_form_nonce" );
	?>
	<h2>AJAX Nonce</h2>
	<input type="submit" class="button button-primary" id='click_me' value="Send AJAX Post Request »">
	<pre id='vip__ajax_form_output'></pre>

	<script type="text/javascript">
		jQuery(document).ready( function($) {
			var data = {
				action: 'vip__ajax_form_action',
				_vip__nonce: <?php echo wp_json_encode( $ajax_nonce ); ?>,
				my_string: 'Freedom to Publish!'
			};
			$('#click_me').click(function() {
				// Post the request to WordPress' AJAX URL.
				$.post( ajaxurl, data, function( response ) {
					$('#vip__ajax_form_output').text("Response: " + response.data);
				});
			});
		});
	</script>
	<?php
}

// The AJAX hook for the demo forms POST request.
add_action( 'wp_ajax_vip__ajax_form_action', function() {
	/**
	 * Verify the nonce exists & and is correct.
	 *
	 * @see https://codex.wordpress.org/Function_Reference/wp_verify_nonce
	 */
	if ( ! isset( $_POST['_vip__nonce'] ) || ! wp_verify_nonce( $_POST['_vip__nonce'], 'vip__ajax_form_nonce' ) ) {
		wp_send_json_error( 'invalid nonce' );
	}
	if ( ! current_user_can( 'publish_posts' ) ) {
		wp_send_json_error( 'invalid permissions' );
	}

	$data   = esc_html( sanitize_text_field( $_POST['my_string'] ) );
	$return = '✅ Nonce is valid! Data is: ' . $data;

	wp_send_json_success( [ $return ] );
});

<?php
// Create a menu page for the demo AJAX script.
add_action( 'admin_menu', function() {
	add_menu_page(
		'AJAX Nonce Example',
		'AJAX Nonce Example',
		'publish_posts',
		'vip__ajax_form',
		'vip__ajax_form_callback'
	);
} );

// Contents for the demo menu page.
function vip__ajax_form_callback() {
	/**
	 * Create the nonce for the admin page, including the action name for context.
	 *
	 * @see https://codex.wordpress.org/Function_Reference/wp_create_nonce
	 */
	$ajax_nonce = wp_create_nonce( "vip__ajax_form_nonce" );
	?>
	<h2>AJAX Nonce</h2>
	<input type="submit" class="button button-primary" id='click_me' value="Send AJAX Post Request »">
	<pre id='vip__ajax_form_output'></pre>

	<script type="text/javascript">
		jQuery(document).ready( function($) {
			var data = {
				action: 'vip__ajax_form_action',
				_vip__nonce: <?php echo wp_json_encode( $ajax_nonce ); ?>,
				my_string: 'Freedom to Publish!'
			};
			$('#click_me').click(function() {
				// Post the request to WordPress' AJAX URL.
				$.post( ajaxurl, data, function( response ) {
					$('#vip__ajax_form_output').text("Response: " + response.data);
				});
			});
		});
	</script>
	<?php
}

// The AJAX hook for the demo forms POST request.
add_action( 'wp_ajax_vip__ajax_form_action', function() {
	/**
	 * Verify the nonce exists & and is correct.
	 *
	 * @see https://codex.wordpress.org/Function_Reference/wp_verify_nonce
	 */
	if ( ! isset( $_POST['_vip__nonce'] ) || ! wp_verify_nonce( $_POST['_vip__nonce'], 'vip__ajax_form_nonce' ) ) {
		wp_send_json_error( 'invalid nonce' );
	}
	if ( ! current_user_can( 'publish_posts' ) ) {
		wp_send_json_error( 'invalid permissions' );
	}

	$data   = esc_html( sanitize_text_field( $_POST['my_string'] ) );
	$return = '✅ Nonce is valid! Data is: ' . $data;

	wp_send_json_success( [ $return ] );
});

استفاده از nonces در وردپرس VIP به محافظت در برابر حملات CSRF کمک می کند

استفاده از nonces در کد وردپرس یک گام مهم در محافظت از وب سایت شما در برابر حملات CSRF است. با تأیید اینکه درخواست‌ها مشروع هستند و از طرف همان کاربری که جلسه را آغاز کرده است، به امنیت وب‌سایت و حریم خصوصی کاربران شما کمک می‌کند.

بیاموزید که چگونه امنیت وردپرس خود را به سطح بعدی ارتقا دهید و یک نسخه آزمایشی رایگان دریافت کنید تا ببینید چگونه VIP وردپرس می تواند سایت شما را ایمن نگه دارد.



سایت محتوا مارکتینگ

برای دیدن مطالب آموزشی بیشتر در زمینه سخت افزار و نرم افزار اینجا کلیک کنید!

توسط psychen

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *