আগের Escaping & Sanitizing lesson output নিরাপদ বানানো কভার করেছে। একটি nonce ("number used once") অন্য দিকটা কভার করে — একটি আসা form submission বা action request সত্যিকারভাবে আপনার site render করা একটি পেজ থেকে এসেছে কিনা যাচাই করা, অন্য কোথাও থেকে একটি forged request না।
এটা ছাড়া, একটি malicious site একটি logged-in user-এর browser-কে আপনার site-এ একটি request submit করাতে trick করতে পারে — browser স্বয়ংক্রিয়ভাবে session cookie পাঠায়, যা forged request-কে বৈধ দেখায়। এটা PHP Security lesson-এ কভার করা একই CSRF attack; একটি nonce এর বিরুদ্ধে WordPress-এর নির্দিষ্ট built-in defense।
<form method="post" action="">
<?php wp_nonce_field('wgh_save_settings', 'wgh_nonce'); ?>
<input type="text" name="site_tagline">
<button type="submit">Save</button>
</form>wp_nonce_field() একটি hidden input output করে যাতে বর্তমান user-এর session আর প্রথম argument হিসেবে দেওয়া action নামের সাথে যুক্ত একটি token থাকে।
if (isset($_POST['wgh_nonce']) && wp_verify_nonce($_POST['wgh_nonce'], 'wgh_save_settings')) {
// Form process করা নিরাপদ
update_option('site_tagline', sanitize_text_field($_POST['site_tagline']));
} else {
wp_die('Security check failed.');
}একই ধারণা একটি action trigger করা একটি সাধারণ link-এও প্রযোজ্য (যেমন একটি item delete করা), শুধু একটি form-এ না।
<?php $url = wp_nonce_url(admin_url('admin-post.php?action=wgh_delete_item&id=42'), 'wgh_delete_item_42'); ?>
<a href="<?php echo esc_url($url); ?>">Delete</a>// এটা handle করা
if (!isset($_GET['_wpnonce']) || !wp_verify_nonce($_GET['_wpnonce'], 'wgh_delete_item_' . $_GET['id'])) {
wp_die('Security check failed.');
}একটি nonce যা না
একটি nonce মেয়াদ শেষ হয় (default-এ ২৪ ঘণ্টা) আর এটা তৈরি করা নির্দিষ্ট user session-এর সাথে যুক্ত — এটা কোনো password বা লুকিয়ে রাখার মতো secret না, শুধু request দাবি করা জায়গা থেকে এসেছে কিনা তার একটি check।