Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Активные темы » Основы PHP...

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

Открыть новую тему     Написать ответ в эту тему

Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladsvn

Цитата:
Но что-то нужно выдать на запрос браузера по этим элементам? Что конкретно выдать, какой ответ?

выдавать 404, если это не страница.
и нужно правильно создавать rewriterule, чтобы не перехватывать существующие файлы (картинки, css, js файлы и так далее). если не хотите, конечно, выдавать через скрипт их.
 

Цитата:
И главное – как отличить первый запрос, по которому нужен поиск в базе, от последующих? Как это делается на практике?
Может быть, в коде запроса есть какой-то признак, что запрос вторичный, что он порожден браузером?

по тому, есть ли файл на самом деле, по типу URL (например, все ajax запросы идут на /ajax/ и так далее). можно определить и тип запроса, как пример - https://heera.it/detect-ajax-request-php-frameworks

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 20:33 24-01-2023
Vladsvn

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый вечер!
 
На сайте с помощью .htaccess организована единая точка входа - index.php.
 
<IfModule mod_rewrite.c>  
    RewriteEngine On  
    RewriteBase /  
 
    RewriteCond %{REQUEST_FILENAME} !-f  
    RewriteCond %{REQUEST_FILENAME} !-d  
    RewriteRule ^(.*)$ /index.php  
</IfModule>  
 
ErrorDocument 404 /error404.html
 
 
 
 
Файл error404.html лежит в корне сайта.
 
На странице index.php имеется такой код:
 
include '../config.php';
 
 
    $url = $_SERVER['REQUEST_URI'];
 
    $query = mysqli_query($db, "SELECT * FROM `content` WHERE `url` = '$url'");
    $row = mysqli_fetch_assoc($query);
 
    if ($row)
    {
        $text = $row['text'];
        echo $text;
    }
    else
    {
        header("HTTP/1.1 404 Not Found");
    }
В таблице content для одного из значений url занесен простейший код страницы. Если в адресной строке браузера набрать этот url, то страница нормально воспроизводится. А для всех остальных адресов должен выдаваться отклик 404 и показываться страница error404.html.
 
Отклик 404 есть, а вот страница error404.html не показывается.
 
Конечно, можно после header("HTTP/1.1 404 Not Found"); написать
readfile(__DIR__ . '/error404.html');
 
И тогда страница 404 будет показана, но, как мне кажется, это сомнительный ход: ведь не зря же в типовой .htaccess (в любой CMS) повсеместно вписывается ErrorDocument 404 /error404.html ?
Может быть, надо что-то другое сделать, опираясь именно на эту запись?

Всего записей: 342 | Зарегистр. 07-09-2016 | Отправлено: 18:40 26-01-2023 | Исправлено: Vladsvn, 20:11 26-01-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladsvn

Цитата:
Может быть, надо что-то другое сделать, опираясь именно на эту запись?

нет, в CMS 404 страница генерится своя.
просто header мало, нужно выдать еще содержимое страницы с сообщением.
 

Цитата:
readfile(__DIR__ . '/error404.html');

если хотите, но брать нужно из конфигурации сервера. либо выводить свою.
 
можно сделать подзапрос к серверу на заранее настроенную 404 ссылку, чтобы не перехватывал index.php, но если сообщение об ошибке выводит URL запроса, будет отображена она, что плохо.
www.php.net/virtual

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 20:31 26-01-2023
Vladsvn

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я планирую вот такую структуру url страниц: /wowa/leto/ . Без динамической части. Проверка допустимости url на буквы, цифры, дефис и слеши. Это одновременно и защита от инъекций.
 
А служебные и сервисные файлы могут иметь динамическую часть: /leto.php?abc=12&bcd=22 Но это только реально существующие файлы, и их будем проверять соответствующим образом на допустимость параметров отдельно в том скрипте, в котором будут использоваться. На единую точку входа они не попадут.
 
Сейчас на странице index.php такой код:
 
    include '../config.php';
 
    $url = $_SERVER['REQUEST_URI'];
 
    // Проверка по маске. Только латиницa, цифры, дефис и слеш
    $url = strtolower($url);
 
    if (!preg_match("#^[a-z\d\-\\\\]+$#", $url))
    {
        $url = trim($url, '/');
        $query = mysqli_query($db, "SELECT * FROM `content` WHERE `url` = '$url'");
        $row = mysqli_fetch_assoc($query);
 
        if ($row)
        {
            header("Cache-Control: public, max-age=2500000");
            $text = $row['text'];
            echo ($text);
        }
        else
        {
            header("HTTP/1.1 404 Not Found");
            readfile(__DIR__ . '/error404.html');
        }
    }
    else
    {
        header("HTTP/1.1 404 Not Found");
        readfile(__DIR__ . '/error404.html');
    }
 
В базе простейший HTML код страницы.
 
Вроде бы, работает: на правильный url, имеющийся в базе, показывает записанную в базе страницу, на остальные дает страницу 404.
 
Как полагаете, можно использовать эту конструкцию?
 

Всего записей: 342 | Зарегистр. 07-09-2016 | Отправлено: 20:39 27-01-2023 | Исправлено: Vladsvn, 21:20 27-01-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladsvn

Цитата:
Как полагаете, можно использовать эту конструкцию?

все зависит от ситуации. делает все так, как хочется - значит нормально.
 

Цитата:
        header("HTTP/1.1 404 Not Found");
        readfile(__DIR__ . '/error404.html');

если ничего после не делается, что добавить exit
 

Цитата:
$url = strtolower($url);

обычно, если не указано иначе, кодировка в mysql и так _ci.

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 21:53 27-01-2023
Vladsvn

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
если ничего после не делается, что добавить exit
Если отсутствует несколько файлов, то браузер сделает соответствующее количество запросов, поэтому из скрипта выйти не получится.  
 
 
На выходе вот такие заголовки. Это нормально?
 
https://ibb.co/YtTPZPC

Всего записей: 342 | Зарегистр. 07-09-2016 | Отправлено: 21:58 27-01-2023 | Исправлено: Vladsvn, 22:05 27-01-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladsvn

Цитата:
На выходе вот такие заголовки. Это нормально?

что в них может быть ненормального?

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 22:03 27-01-2023
Vladsvn

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Может быть, нужны и другие заголовки?  
Или этих достаточно?
 
Вот у сайта VC.RU  https://ibb.co/bRjVNKG

Всего записей: 342 | Зарегистр. 07-09-2016 | Отправлено: 22:06 27-01-2023 | Исправлено: Vladsvn, 22:11 27-01-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladsvn

Цитата:
Может быть, нужны и другие?
Или этих достаточно?

какие и зачем? работает же?
 

Цитата:
Вот у сайта VC.RU

и что? у вас и CMS по сути еще нет, зачем что то накручивать?
 
https://developer.mozilla.org/ru/docs/Web/HTTP/Headers
часть из них там потому, что используется CloudFlare

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 22:11 27-01-2023 | Исправлено: Mavrikii, 22:13 27-01-2023
Vladsvn

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Понятно, спасибо!
 
Добавлено:
Понятно, спасибо!

Всего записей: 342 | Зарегистр. 07-09-2016 | Отправлено: 22:12 27-01-2023
Vladsvn

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я использую вот такой простейший шаблон:
 
<!DOCTYPE html>
    <html lang=ru>
    <head>
<title><?php echo $title; ?></title>
<meta name="description" content="<?php echo $description; ?>">
<meta name="keywords" content="<?php echo $keywords; ?>">
<meta charset=utf-8>
<link rel="canonical" href="<?php echo $canonical; ?>" />
<link rel="stylesheet" href="<?php echo $css; ?>" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="/favicon.ico" />
</head>
 
<body>
 
<?php echo $text; ?>
 
</body>
 
</html>
 
 
Содержимое каждой из упомянутых здесь переменных вытаскивается из базы данных и все нормально работает. При этом собственно контент страницы находится в переменной $text.
 
Но на практике нужны шаблоны гораздо сложнее, поскольку контент обычно разбит на смысловые фрагменты: верх и низ страницы, рекламные блоки и др.
 
Можно сделать в базе данных столбец для каждого такого фрагмента ($text_1, $text_2 и др.) и тоже все будет нормально.
 
А как поступают на практике?
 
 
 

Всего записей: 342 | Зарегистр. 07-09-2016 | Отправлено: 18:28 28-01-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladsvn

Цитата:
А как поступают на практике?

используют шаблонные движки. Twig, Blade и так далее.
https://ourcodeworld.com/articles/read/847/top-7-best-open-source-php-template-engines

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 23:55 28-01-2023 | Исправлено: Mavrikii, 23:58 28-01-2023
Vladsvn

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый вечер!
 
Требуется внутри функции сделать запрос к базе. Типа такого:
query = mysqli_query($db, "SELECT `id` FROM `comment` WHERE `id` = 157");
 
Но $db не попадает в область видимости переменных, и выводится соответствующее сообщение:
<b>Notice</b>: Undefined variable: db in <b>/home/b/comment-text.php</b> on line <b>94</b><br />
<br />
<b>Warning</b>: mysqli_query() expects parameter 1 to be mysqli, null given in <b>/home/b/comment-text.php</b> on line <b>94</b><br />
 
94 - это и есть строка моего запроса.
 
Передать $db через параметры функции не получается - функция слишком хитрая, внутри обращается сама к себе (это вывод комментариев).
 
Передавать $db через сессию? Как-то ненормально...
 
Использовать global/$GLOBALS ?
 
Или есть еще что-то?

Всего записей: 342 | Зарегистр. 07-09-2016 | Отправлено: 18:06 14-02-2023 | Исправлено: Vladsvn, 18:07 14-02-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladsvn

Цитата:
Передать $db через параметры функции не получается - функция слишком хитрая, внутри обращается сама к себе (это вывод комментариев)

И как это мешает передавать аргумент далее?
Можно вообще передавать один объект, используя его атрибуты как аргументы функции.
Или ассоциативный массив.

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 20:06 14-02-2023 | Исправлено: Mavrikii, 20:07 14-02-2023
Vladsvn

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Информация, вводимая посетителем в качестве комментария, обрабатывается вот так:
 
    $message = isset($_POST['message']) ? trim($_POST['message']) : null;
 
    $message = preg_replace('#<(/?)(br)>#', '[$1$2]', $message);
 
    $message = filter_var($message, FILTER_SANITIZE_STRING);
 
Честно говоря, я не понимаю, что здесь делает preg_replace, и зачем тут эта функция. А вот фильтр удаляет все HTML теги.
 
В результате использующиеся во вводимом тексте ссылки перестают быть ссылками.
 
Можно ли сделать такую обработку вводимой информации, чтобы передавались и ссылки, и почтовые адреса, но при этом сохранялась защита от взлома?

Всего записей: 342 | Зарегистр. 07-09-2016 | Отправлено: 14:54 04-03-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladsvn

Цитата:
Честно говоря, я не понимаю, что здесь делает preg_replace, и зачем тут эта функция

преобразует <br> в
и  </br> в [/br], чтобы сохранить переносы строк, преобразовывая их обратно потом.
 

Цитата:
Можно ли сделать такую обработку вводимой информации, чтобы передавались и ссылки, и почтовые адреса, но при этом сохранялась защита от взлома?

а почтовые адреса тут при чем?
использовать https://www.php.net/manual/en/function.strip-tags.php
там можно указать, какие теги можно оставить.
но оно не обрабатывает атрибуты тега, там тоже можно много чего наворотить.

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 23:29 04-03-2023
Vladsvn

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
а почтовые адреса тут при чем?
Ну вот смотрите - к почте такие же требования:
 
<a href="https://siness.ru /">Академия</a>
<a href=mailto:pro@journal.ru target=_blank rel=noopener>Журнал</a>
 
Вот так обрабатывать?
 
strip_tags($input, '<p><a>');

Всего записей: 342 | Зарегистр. 07-09-2016 | Отправлено: 11:06 05-03-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladsvn

Цитата:
Вот так обрабатывать?

вы не можете мануал посмотреть?
 
strip_tags($input, ['p', 'a']);

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 11:09 05-03-2023
Vladsvn

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
вы не можете мануал посмотреть?
Это и есть из мануала - у меня РНР версии 5.6.
 
Но не это главное. В мануале четко сказано:
"Эта функция не должна использоваться для предотвращения XSS-атак."
 
И тоже Вы пишете:
"но оно не обрабатывает атрибуты тега, там тоже можно много чего наворотить."
 
Вот я и не пойму, чего делать? Для защиты ограничиться strip_tags или надо что-то еще? Или вообще как-то по другому?

Всего записей: 342 | Зарегистр. 07-09-2016 | Отправлено: 12:17 05-03-2023
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vladsvn

Цитата:
Вот я и не пойму, чего делать

Начать с простого - для чего вообще вам нужен html код от пользователя?
 

Цитата:
надо что-то еще?

Надо еще. Вырезать все опасные атрибуты, и обезопасив те, без которых не обойтись.
 
Либо использовать ббкоды как этот форум.
 
 

Цитата:
Это и есть из мануала - у меня РНР версии 5.6

зачем пользоваться таким старьем? уже 7 работает гораздо быстрее.

Всего записей: 15096 | Зарегистр. 20-09-2014 | Отправлено: 19:22 05-03-2023 | Исправлено: Mavrikii, 00:41 06-03-2023
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

Компьютерный форум Ru.Board » Интернет » Web-программирование » Активные темы » Основы PHP...


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru