2012-06-28 4 views
0

Я сделал некоторые проверки изображения. Пользователь должен ввести код из динамически сгенерированного изображения.PHP: любой способ защитить переменную сеанса/captcha?

Этот код используется в главном файле PHP:

@session_start(); 
if (isset($_POST['session_pw'])&&$_SESSION['result']==$_POST['security_im']) { 
    $_SESSION['pw']=$_POST['session_pw']; 
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
} 
if ($_SESSION['pw']=='mypassword'&&$_SESSION['ip'] == $_SERVER['REMOTE_ADDR']){ 

     // OK we are in. 
    // Otherwise display a login form: 
}else echo <<<EOD 
    <form method="POST"> 
    <font color="blue"> Authorization is required:</font><br> 
    <input type="text" name="security_im" style="text-align:right;padding-right:1px;background-repeat:no-repeat;background-image:url(../imagecheck.php)"><br> 
    <input type="password" name="session_pw" style="text-align:right;padding-right:1px"><br> 
    <input type="submit" style="margin:0px"> 
    </form> 
EOD; 

ПримечаниеЭтот:

background-image:url(../imagecheck.php) 

Это, как я называю сгенерированное изображение. И это его содержание:

<?php 
session_start(); 
create_image(); 
exit(); 

function create_image() { 
    $md5 = ""; 
    while (strlen($md5) == 0) { 
     $md5 = md5(mt_rand()); 
     $md5 = preg_replace('/[^0-9]/', '', $md5); 
    } 
    $pass = substr($md5, 10, 5); 
    $_SESSION['result'] = $pass; 
    $width = 60; 
    $height = 20; 
    $image = ImageCreate($width, $height); 

    //We are making three colors, white, black and gray 
    $clr[1] = ImageColorAllocate($image, 204, 0, 204); 
    $clr[2] = ImageColorAllocate($image, 0, 204, 204); 
    $clr[3] = ImageColorAllocate($image, 204, 204, 0); 

    $R = rand(1, 3); 
    $black = ImageColorAllocate($image, 255, 255, 255); 
    $grey = ImageColorAllocate($image, 204, 204, 204); 

    //Make the background black 
    ImageFill($image, 0, 0, $black); 

    //Add randomly generated string in white to the image 
    ImageString($image, 5, 7, 2, $pass, $clr[$R]); 

    //Throw in some lines to make it a little bit harder for any bots to break 
    imageline($image, 0, 0, $width - 2, $height - 2, $grey); 
    imageline($image, 0, $height - 2, $width - 2, 0, $grey); 
    ImageRectangle($image, 0, 0, $width - 1, $height - 1, $grey); 

    //Tell the browser what kind of file is come in 
    header("Content-Type: image/jpeg"); 
    //Output the newly created image in jpeg format 
    ImageJpeg($image, null, 80); 
    //Free up resources 
    ImageDestroy($image); 
} 
?> 

Примечание:

$_SESSION['result'] = $pass; 

Это, как я храню ключ сессии.

Теперь проблема заключается в том, что изображение может быть потенциально заблокировано, а ключ сеанса не изменится с последнего сохраненного результата. Это означает огромную угрозу. Интересно, есть ли какая-либо защита или обходное решение?

Ответьте, пожалуйста, только если вы понимаете, вопрос и безопасность :-)

+0

Captchas не являются функциями «безопасности». Это логика поведения или разрешения. – mario

+0

Вы используете капчу на каждой странице? И если изображение заблокировано, они не смогут проверить captcha. Если после использования изображения сеансовый ключ является одинаковым, вы знаете, что он заблокирован. А что, если у них отключены изображения? или кто-то украл изображение? – Anthony

ответ

1

Вы должны быть больше озабочены кэширования, чем о заблокированных запросов. Фоновые изображения могут не обновляться до тех пор, пока вы не включите некоторые заголовки Cache-Control и т. Д.

Что еще более важно для предотвращения повторов. Для этого у вас должны быть:

  • Значение метки времени. И сделайте проверку captcha отказом принять более старые значения.

  • Очистить состояние сеанса captcha после одной или двух успешных проверок.

Фоновое изображение, не загружаемое («заблокировано»), означает, что у вас не будет действительного токена в хранилище сеансов. Это не проблема, если ваша логика проверки плохо разработана.

И, наконец, эффективность вашего капчу не увеличивается со случайными строками на изображении. Это так же эффективно, как и необычная структура вашей формы. Как только паук адаптируется к вашим пользовательским вариантам, его довольно просто обойти. Фейс-безопасность заключается в ее безвестности. Хотя такой большой опыт обучения не может быть полезным, можно использовать готовый скрипт.

0

Помимо сохранения результата, почему бы и не сохранить отметку времени. Таким образом, результат может истечь через десять минут.

Также поместите некоторые коды в часть, которые проверяют представление из формы, чтобы очистить эту переменную сеанса независимо от того, успешна она или нет. Таким образом, если они захотят снова подать заявку, им нужно будет ввести новый результат.

Смежные вопросы