Из http://fullthrottledevelopment.com/php-nonce-library#download существует библиотека PHP nonce, но есть некоторые вещи, которые я не знаю. Первый заключается в том, что он напоминает нам установить значение для FT_NONCE_UNIQUE_KEY
но никогда не использует его ни в одной из своих функций.
Во-вторых, когда я ft_nonce_create_query_string
функцию ft_nonce_create_query_string
, подождите несколько секунд, а затем снова вызовите ее с теми же параметрами, оба вызова возвращают одно и то же значение. Это странно, я действительно не понимаю, как он может удостовериться в том, что для каждого nonce, который он генерирует, значение nonce будет действительным в течение времени, указанного в FT_NONCE_DURATION
.
Но если я жду более длительного времени перед вторым вызовом, они вернут другое значение. Я вставил коды здесь, чтобы вы могли попробовать запустить его напрямую.
Почему так? Как это должно работать?
<?php /* * Name: FT-NONCE-LIB * Created By: Full Throttle Development, LLC (http://fullthrottledevelopment.com) * Created On: July 2009 * Last Modified On: August 12, 2009 * Last Modified By: Glenn Ansley (glenn@fullthrottledevelopment.com) * Version: 0.2 */ /* Copyright 2009 Full Throttle Development, LLC This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ define( 'FT_NONCE_UNIQUE_KEY' , '' ); define( 'FT_NONCE_DURATION' , 300 ); // 300 makes link or form good for 5 minutes from time of generation define( 'FT_NONCE_KEY' , '_nonce' ); // This method creates a key / value pair for a url string function ft_nonce_create_query_string( $action = '' , $user = '' ){ return FT_NONCE_KEY."=".ft_nonce_create( $action , $user ); } // This method creates an nonce for a form field function ft_nonce_create_form_input( $action = '' , $user='' ){ echo "<input type='hidden' name='".FT_NONCE_KEY."' value='".ft_nonce_create( $action . $user )."' />"; } // This method creates an nonce. It should be called by one of the previous two functions. function ft_nonce_create( $action = '' , $user='' ){ return substr( ft_nonce_generate_hash( $action . $user ), -12, 10); } // This method validates an nonce function ft_nonce_is_valid( $nonce , $action = '' , $user='' ){ // Nonce generated 0-12 hours ago if ( substr(ft_nonce_generate_hash( $action . $user ), -12, 10) == $nonce ){ return true; } return false; } // This method generates the nonce timestamp function ft_nonce_generate_hash( $action='' , $user='' ){ $i = ceil( time() / ( FT_NONCE_DURATION / 2 ) ); return md5( $i . $action . $user . $action ); } if ( FT_NONCE_UNIQUE_KEY == '' ){ die( 'You must enter a unique key on line 2 of ft_nonce_lib.php to use this library.'); } ?>
Ничего себе, НЕ ИСПОЛЬЗУЙТЕ ЭТУ БИБЛИОТЕКУ. Я собираюсь сообщить об этом как об уязвимости сразу после этой публикации. Nonce – это значение, которое используется только один раз, и эта библиотека предоставляет это. ОДНАКО, автор пытался предотвратить подделку подпроса (XSRF). Чтобы не нападавшие не создавали сообщение, должно быть секретное значение, которое злоумышленник не может предсказать. Для этого вам нужен криптографически безопасный генератор случайных чисел или CSRPING. Nonce, который эта библиотека строит, чрезвычайно предсказуема и может быть легко принудительно использована с использованием простого javascript.