Эта проверка достоверности уязвима? - PullRequest
0 голосов
/ 17 ноября 2009

У меня есть этот код на странице, которая включает в себя другие файлы с помощью запроса GET:

$page = strtolower($_GET['page']);

if(!$page or !$allow[$page] or $page == 'home') {
    header("Location: home.php");
}

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

Ответы [ 5 ]

3 голосов
/ 17 ноября 2009

Это не уязвимо, если register_globals не позволяет перезаписать $.

Хотя он будет выдавать уведомления, и лично у меня не было бы нечувствительности к регистру, поэтому я сделал бы это так:

if (empty($_GET['page']) || empty($allow[$_GET['page']]) || ($_GET['page'] == 'home'))
{
    // Technically a header location should be a complete URL - http://...
    header("Location: home.php");
    exit();
}
2 голосов
/ 17 ноября 2009

Кажется, хорошо. Просто добавьте оператор exit () после header (), чтобы убедиться, что даже если header () завершится неудачно, ваш скрипт завершится.

0 голосов
/ 17 ноября 2009

может быть лучше сначала сделать регулярное выражение на странице $, чтобы убедиться, что оно соответствует санитарно-гигиеническим критериям того, что можно передать, прежде чем проверять дальше, если содержимое $ страницы не соответствует, то не обрабатывать дальше. .

0 голосов
/ 17 ноября 2009

"достаточно хорошо" - очень широкая кисть. Вы можете немного расширить? Кроме того, если вы знаете, что $ _GET ['page'] следует ограничить небольшим набором значений (скажем, целыми числами или идентификаторами, содержащими только строчные буквы и т. Д.), То проверка данных с помощью регулярного выражения никогда не повредит. *

0 голосов
/ 17 ноября 2009

этого будет достаточно

 $allow = array('home', 'another_one', 'blah');
 $page = isset($_GET['page']) ? $_GET['page'] : 'home';
 if(in_array($page, $allow, true))
     include "$page.php";

Я не уверен, почему вы используете "заголовок" там

...