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.

첫 번째 논쟁은 논스이며 요청에서 나옵니다.

실제로 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()는 정확히 숨겨진 필드에 존재하는 값입니다.

두 번째 논쟁 : 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()입니다.

두 번째 논쟁 : wp_nonce_field()방법

당신은 사용 비표를 만든 경우 wp_nonce_field()처럼 :

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 hidden 필드의 값이고 다른 하나는 action 이며 nonce 값의 작성 방법에 따라 다릅니다.


4
@birgire 나는 프로처럼 오타를한다 :)
gmazzap

2
최소한 영어가 아닌 영어 입력기가 오타를 정리할 수 있도록 도와주는 프로 영어 편집자도 있습니다. 훌륭한 설명 BTW, +1
Pieter Goosen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.