การตรวจสอบ nonce ทำงานอย่างไร


14

ฉันเห็นว่า wp_nonce_field สร้างค่าในเขตข้อมูลที่ซ่อนอยู่

<input type="hidden" id="message-send" name="message-send" value="cabfd9e42d" />

แต่ wp_verify_nonce ไม่ได้ใช้ค่านั้นเท่าที่ฉันสามารถบอกได้ แต่ฉันอาจจะผิด

ดูเหมือนว่าจะใช้โทเค็นเซสชันสำหรับการตรวจสอบ

$expected = substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce'), -12, 10 );
 if ( hash_equals( $expected, $nonce ) ) 
  { return 1;  }

ถ้าเช่นนั้นจุดที่มีแอตทริบิวต์ค่าในเขตข้อมูลที่ซ่อนคืออะไร


1
คุณได้รับความ$nonceคุ้มค่าเช่นกัน - เช็คคืนเป็นเท็จหากไม่มี$nonceค่า
Birgire

ใช่ฉันเห็นว่า แต่จะตรวจสอบเฉพาะว่ามันไม่ว่างเปล่าหรือเปล่า
ed-ta

เรายังมี$nonceค่าในการเปรียบเทียบนี้:hash_equals( $expected, $nonce )
birgire

นั่นเป็นเรื่องจริง ฉันมุ่งเน้นที่คุณค่า
ed-ta

คำตอบ:


15

TL; DR

กล่าวโดยย่อให้wp_verify_nonce() ใช้ค่านั้นเนื่องจากคาดว่าค่านั้นจะเป็นอาร์กิวเมนต์แรก

wp_verify_nonce() ข้อโต้แย้ง

wp_verify_nonce() ได้รับ 2 ข้อโต้แย้ง:

  1. $nonce
  2. $action

ค่าในช่องที่ซ่อนอยู่ ( 'cabfd9e42d'ในตัวอย่างของคุณ) $nonceเป็นตัวแทนของ

อาร์กิวเมนต์ที่ 1 คือ nonce และมาจากคำขอ

ในความเป็นจริงwp_verify_nonce()จะต้องมีการใช้เช่น:

// here I assume that the form is submitted using 'post' as method

$verify = wp_verify_nonce($_POST['message-send']);

ดังนั้นอาร์กิวเมนต์แรกที่ส่งไปwp_verify_nonce()ยังค่าที่มีอยู่ในเขตข้อมูลที่ซ่อนอยู่

อาร์กิวเมนต์ที่ 2: wp_create_nonce()เมธอด

เกี่ยวกับอาร์กิวเมนต์ที่สองนั้นขึ้นอยู่กับวิธีที่คุณสร้างค่า nonce

เช่นถ้าคุณทำ:

<?php $nonce = wp_create_nonce( 'custom-action' ); ?>
<input type="hidden" name="message-send" value="<?php echo $nonce ?>" />

จากนั้นคุณต้องทำ:

$verify = wp_verify_nonce( $_POST['message-send'], 'custom-action' );

wp_create_nonce()ดังนั้นอาร์กิวเมนต์ที่สองคือสิ่งที่ถูกนำมาใช้เป็นอาร์กิวเมนต์

อาร์กิวเมนต์ที่ 2: wp_nonce_field()เมธอด

หากคุณสร้าง nonce โดยใช้wp_nonce_field()like:

wp_nonce_field( 'another_action', 'message-send' );

จากนั้นคุณต้องตรวจสอบ nonce ดังนี้:

$verify = wp_verify_nonce( $_POST['message-send'], 'another_action' );

wp_nonce_field()ดังนั้นเวลานี้การกระทำที่ถูกส่งผ่านสิ่งที่เป็นอาร์กิวเมนต์แรก

ปะยางรถ

ในการผ่านwp_verify_nonce()การตรวจสอบคุณจะต้องผ่าน 2 อาร์กิวเมนต์ไปยังฟังก์ชันหนึ่งคือค่าในเขตข้อมูลที่ไม่ถูกซ่อนส่วนอีกค่าคือการดำเนินการและขึ้นอยู่กับวิธีสร้างค่า nonce


4
@ Birgire ฉันพิมพ์ผิดอย่างมืออาชีพ :)
gmazzap

2
อย่างน้อยก็มีบรรณาธิการภาษาอังกฤษมืออาชีพบางคนในเว็บไซต์เพื่อช่วยเราไม่ใช่นักพิมพ์ภาษาอังกฤษที่เป็นคนทำความสะอาดคำผิดของเรา lol ;-) คำอธิบายที่ดี BTW, +1
Pieter Goosen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.