регулярное выражение и $ _GET - PullRequest
0 голосов
/ 26 июня 2009

Я делаю маленький сайт для подруги, noobfriendly, чтобы она могла легко добавлять страницы. Я думаю, что я просто включу все в index.php. Поэтому она может просто перетащить страницу в папку с именем / pages / , и все готово.

index.php

if (preg_match('/[a-zA-Z]/', $_GET['page'])){
$page = 'pages/'.$_GET['page'].'.php';

if ($page) {
include $page;
} else {
exit;
}

} else {
include('pages/home.php');
}

Это довольно безопасно, верно? Я разрешаю только буквы a-z. Я имею в виду, что это не будет большой сайт, как Google. Ну, я просто хобби-кодер, поэтому я прошу ребят убедиться :)

Что вы думаете?

Ответы [ 6 ]

3 голосов
/ 26 июня 2009

Вы можете использовать this.

ctype_alnum($_GET["page"]);
2 голосов
/ 26 июня 2009

Чтобы обеспечить это, убедитесь, что ваше регулярное выражение /^[a-z]+$/i. Это проверяет всю строку (^ - начало, а $ - конец), чтобы убедиться, что она только в алфавитном порядке. Тогда ваша работа будет в безопасности (по крайней мере, в этой части).

1 голос
/ 26 июня 2009

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

Используйте glob или scandir , чтобы получить список файлов в каталоге страниц, а затем используйте in_array, чтобы узнать, является ли запрошенная строка файлом. Если вы пытаетесь удалить элементы пути, вы оставляете себя открытым для ошибки.

1 голос
/ 26 июня 2009

Было бы неплохо выполнить некоторые проверки входных данных, прежде чем вы решите включить их. Прежде всего, вы можете сделать is_file ($ filename) перед включением.

Еще одна вещь, ваше регулярное выражение настроено на использование только одного символа atm - вероятно, не то, что вы хотите. Другое дело: как заметил предыдущий автор, регулярное выражение только проверяет, выглядит ли ввод вроде нормально. После этого вы используете переменную _GET. Вы ДОЛЖНЫ использовать результат из preg_match (вы можете сделать так, чтобы он присваивал результаты массиву), чтобы избежать вышеуказанной проблемы.

С уважением Поддельный

1 голос
/ 26 июня 2009

Нет. a /../../../ также будет соответствовать регулярному выражению

Использование '/^[a-zA-Z]+$/'

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

0 голосов
/ 26 июня 2009
preg_match('/[a-zA-Z]/', $_GET['page'], $match)

if ($match) {
    $page = "pages/$match.php";
    if(file_exists($page){
        include $page;
    } else {
        include "pages/404.php";
    }
} else {
    include "pages/home.php";
}

Может быть? Если 'page' установлено на 'blabla89349', это будет включать страницу 'blabla.php'. Я не уверен, что это то, что вы хотели? В противном случае вы могли бы быть строгим об этом и

if ($match == $_GET['page']) {
...
...