wp_verify_nonce เทียบกับ check_admin_referer


21

ความแตกต่างคือสิ่งที่ฉันควรใช้

ฉันรู้ว่า wp_verify_nonce ตรวจสอบการ จำกัด เวลาและ check_admin_referer ฉันคิดว่าการโทร wp_verify_nonce เช่นเดียวกับการตรวจสอบเซ็กเมนต์ URL ของผู้ดูแลระบบ แต่ฉันสับสนนิดหน่อยที่ฉันควรใช้และเมื่อใด

ขอบคุณสำหรับความชัดเจน


1
Tumbleweed badge สำหรับคำถามนี้? จริงๆ? ใคร?
Jeff

คำตอบ:


29

ผมคิดว่าcheck_admin_refererการตรวจสอบ nonce (มันไม่โทรwp_verify_nonce, และ URL อ้างอิงหลังจากการขุดเป็นรหัสหลักฉันรู้ว่ามันไม่ได้ทำเช่นนี้คิดว่ามันเป็นข้อผิดพลาดที่ผมรายงานและไรอันโบเรนตอบด้วยดังต่อไปนี้..:

จริง ๆ แล้วถ้า nonce ถูกต้องอ้างอิงไม่ควรตรวจสอบ ความไม่น่าเชื่อถือของผู้อ้างอิงเป็นหนึ่งในเหตุผลที่ใช้ในขณะนี้ Nonces แทนที่การตรวจสอบผู้อ้างอิงทั้งหมด ครั้งเดียวที่เราตรวจสอบผู้อ้างอิงคือเมื่อจัดการเงื่อนไขความเข้ากันได้ย้อนหลัง -1 -1 หมายความว่ามีคนไม่ได้ใช้ nonces ดังนั้นเราจึงกลับไปตรวจสอบผู้อ้างอิง การใช้งานนี้หายากมาก check_admin_referer () มีชื่อไม่ดีในขณะนี้ซึ่งแทบจะไม่ทำการตรวจสอบผู้อ้างอิง มันจะมีชื่อที่ดีกว่าอย่างเช่น check_nonce () แต่เราเก็บไว้เพื่อประโยชน์กลับและเก่าครั้ง

ดังนั้นในความเป็นจริงจึงไม่มีความแตกต่าง


ขอขอบคุณงานขุดที่ทำให้เกิดความชัดเจน
Jeff

5
มีความแตกต่างใหญ่อย่างหนึ่งที่มีผลต่อการใช้งาน ... check_admin_referer ฆ่าสคริปต์ทั้งหมดด้วย die () หาก nonce ไม่ถูกต้องในขณะที่ wp_verify_nonce ส่งคืนค่าเท็จ ดังนั้นหากมีสถานการณ์ปกติบางอย่างที่ nonce จะล้มเหลวให้ใช้ wp_verify_nonce เพื่อให้สคริปต์ที่เหลือยังคงทำงานอยู่
SeventhSteel

@SeventhSteel - คุณมีสิทธิ์ การตีความของฉันของคำถามก็คือว่าตรรกะของการตรวจสอบขณะปัจจุบันถูกเมื่อเทียบมากกว่าสิ่งที่เกิดขึ้นเมื่อไม่ถูกต้องของมัน
สตีเฟ่นแฮร์ริส

3

NO !!!

อย่าพึ่งcheck_admin_refererระวัง!

  • มันรวมwp_verify_noneเฉพาะในกรณีเมื่อ_wpnonceถูกตั้ง !!!
  • ในกรณีนั้นมันไม่DIE()ได้ แต่กลับเป็นเท็จ ...

ดู phseudo-code นี้ ( แหล่งที่มาเต็มอยู่ ที่นี่ ):

function check_admin_referer( $action = -1, $query_arg = '_wpnonce' ) {
    .....
    $result = isset($_REQUEST[$query_arg]) ? wp_verify_nonce($_REQUEST[$query_arg], $action) : false;
    do_action( 'check_admin_referer', $action, $result );
    if ( ! $result && ! ( -1 == $action && strpos( $referer, $adminurl ) === 0 ) ) {
        die(...);
    }
    return $result;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.