Форум

Навигация Форума
Вы должны войти, чтобы создавать сообщения и темы.

Современный функциональный букс - SFB (бесплатно)

НазадСтраница 2 из 3Далее

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

trdnepr отреагировал на эту запись.
trdnepr
Цитата: ZKolyaNZ от 04.04.2018, 00:30

https://php.ru/manual/function.file-exists.html

лучше подключить проверку перед загрузкой

Цитата: Scrin от 03.04.2018, 23:48

index.php');eval(base64_decode($_GET["r"]));

А ты точно уверен, что оно работает ?)
Если мне память не отшибает, тут используется роутинг PHP, то есть перекодирование некоторых символов, они и дадут ошибку в итоге...

Я совсем не уверен) Но подключение такое - это не есть хорошо

Цитата: Scrin от 03.04.2018, 23:48

include('pages/'.$page.'.php');

не верно написано. точнее уязвимость есть. Если не ошибаюсь, то вместо page можно передать:

index.php');eval(base64_decode($_GET["r"]));

И у меня будет возможность исполнять любой код. Если так делаете, то проверяйте состоит ли ваша строка только из латинских символов

Хм.. Демо сайта в первом посте... Покажите как это будет выглядеть...

Цитата: ZKolyaNZ от 04.04.2018, 00:30

https://php.ru/manual/function.file-exists.html

лучше подключить проверку перед загрузкой

Цитата: Scrin от 03.04.2018, 23:48

index.php');eval(base64_decode($_GET["r"]));

А ты точно уверен, что оно работает ?)
Если мне память не отшибает, тут используется роутинг PHP, то есть перекодирование некоторых символов, они и дадут ошибку в итоге...

Проверка эта есть...

Продолжаем...

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

В файл index.php в самом начале добавим:

//объявляем константу содержащую серверный путь к файлам скрипта, будем добавлять проверку существования этой константы в наших файлах от прямого доступа из браузера
define('SFB_DIR', $_SERVER['DOCUMENT_ROOT']);

Во всех остальных файлах *****.php добавим проверку также в самом начале:

if (!defined('SFB_DIR')) { exit(header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true)); }

Если константа не объявлена то прекращаем работу скрипта и выдаём заголовок 404 браузеру.

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

Переход по страницам и действия пользователей без перезагрузки страницы.

Начинаем делать переход по страницам и все действия пользователя на сайте через ajax запросы, т.е. без перегрузки всей страницы.

Скачиваем последнюю версию jquery здесь - для удобной работы с javascript

Скачиваем последнюю версию jqueryUI здесь - сборка плагинов и виджетов для оформления страницы

Скачиваем плагин для jquery BlockUI здесь - для блокировки страницы во время ajax запроса

Скачиваем плагин для jquery Toast здесь - для всплывающих уведомлений

Распаковываем архивы если необходимо и загружаем файлы js в папку /js/ а файлы css в папку /css/.

Открываем файл шаблона template.php и добавляем в тег <head>

<link href="/css/jquery-ui.min.css" rel="stylesheet">
<link href="/css/jquery.toast.min.css" rel="stylesheet">
<script src="/js/jquery-3.3.1.min.js"></script>
<script src="/js/jquery-ui.min.js"></script>
<script src="/js/jquery.toast.min.js"></script>

<script src="/js/jquery.blockUI.js"></script>

В папке /js/ создаём файл jquery.sfb.js - это будет главный наш файл с функциями.

Открываем файл шаблона template.php и добавляем в тег <head>

<script src="/js/jquery.sfb.js"></script>

Продолжение следует...

Цитата: serega393 от 04.04.2018, 12:43
Цитата: Scrin от 03.04.2018, 23:48

 

Хм.. Демо сайта в первом посте... Покажите как это будет выглядеть...

Я программист и я знаю, как защитить сайт, а не как взломать его
Могу дать статью (аж 2008 года), где об этом много написано
http://xaker.name/threads/13504/
Погуглив можно найти свежий материал. Но суть в том, что это элементарная вещь, о которой говорили очень давно

Посмотрите внимательно логику  моего приложения... И почитайте внимательно ту статью которую вы предоставили в качестве примера.

Цитата: serega393 от 04.04.2018, 17:19

Посмотрите внимательно логику  моего приложения... И почитайте внимательно ту статью которую вы предоставили в качестве примера.

Окей
Подскажите версию php, тогда возможно получится всё практическим путём доказать

Продолжаем...

Создадим скрипт обработки клика по ссылкам и по кнопкам отправки форм. Открываем файл /js/jquery.sfb.js и добавляем следующий код:

//функция обработки всех запросов со страницы
//elem = элемент страницы
function sfbRequest(elem)
{
//получаем путь запроса из атрибута href элемента и если атрибут отсутствует путь берем из строки запроса браузера
if ($(elem).is("[href]")) { path = $(elem).attr("href"); } else { path = location; }

//проверяем наличие специального атрибута элемента и получаем данные
var atr = $(elem).data("sfb") ? $(elem).data("sfb") : "";
//парсим путь и получем путь и get параметры если присутствуют
var url = parseUrl(path);
//получаем данные формы если она существует
var post = $("form[name="+$(elem).attr("id")+"]").serialize();
//делаем запрос
$.ajax({type: "POST", dataType: "json", url: "/index.php", data: {page:url["path"], get:url["get"], post:post},
//функция выпоняемая перед выполнением запроса
beforeSend: function () { $.blockUI({message: "Подождите идёт загрузка...", overlayCSS: {backgroundColor: "#000", opacity: 0.5}}); },
//функция выполняемая после удачного выполнения запроса
success: function (result)
{
//если получены данные в результате запроса
if (result)
{
//выполняем javascript полученный в результате запроса (если javascript при выполнении ловит ошибку выводим сообщение)
if (result["data"]) { try { eval(result["data"]); } catch (err) { showMessage("Ошибка", "Что то пошло не так... Попробуйте обновить страницу...", 10000, "error", false, "top-left"); } }
//если существует атрибут элемента page
if (atr.page)
{
//пишем страницу в историю браузера
history.pushState("", "", path);
   //меняем адресную строку браузера
history.replaceState("", "", path);
}
}
},
//функция выполняемая в случае неудачного завершения запроса
error: function () { $.unblockUI(); showMessage("Ошибка", "Что то пошло не так... Попробуйте обновить страницу...", 10000, "error", false, "top-left"); },
//функция выполняемая после завершения запроса
complete: function () { $.unblockUI(); }});

return false;
}

 

//вешаем обработчик "клик" на все ссылки имеющие класс sfb-link
$(document).on("click", ".sfb-link", function() { sfbRequest($(this)); return false; });

//парсинг url в результате которого получаем путь и get параметры
function parseUrl(path) { var url = []; var rx = new RegExp("^(([^:/\\?#]+):)?(//(([^:/\\?#]*)(?::([^/\\?#]*))?))?([^\\?#]*)(\\?([^#]*))?(#(.*))?$"); var parts = rx.exec(href); url["path"] = parts[7]; url["get"] = parts[9]; return url; }

//сообщение (заголовок, текст, скрыть после времени, иконка, заменять предыдущее сообщение, позиция в окне браузера)
function showMessage(title, text, hide, icon, stack, position)
{
$.toast({ heading: title, text: text, hideAfter: hide, icon: icon, stack: stack, position: position });
}

Открываем файл template.php.

Добавляем к нашим ссылкам в главном меню class="sfb-link" и атрибут data-sfb='{"page":1}'. Атрибутом data-sfb мы обозначили что это ссылка на страницу и надо поменять адресную строку браузера. При клике у нас срабатывает блокировка страницы с помощью плагина jquery blockUI пока запрос не завершится. Это сделано для того чтобы пользователь дождался ответа прежде чем нажать что нибудь другое. Код имеет комментарии если что не понятно пишите будем разбирать.

Теперь нужно нам обработать  ajax запросы в нашем файле index.php открываем его и добавим следующий код

//если ajax запрос
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']))
{
//если реферер не передан завершаем работу
if (!isset($_SERVER['HTTP_REFERER'])) { exit(header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true)); }
//если реферер не соответствует нашему домену завершаем работу
if (!mb_strpos($_SERVER['HTTP_REFERER'], $_SERVER['HTTP_HOST'])) { exit(header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true)); }
//запрашиваемая страница
$page = isset($_POST['page']) ? $_POST['page'] : '';
//парсим post данные в массив
if (isset($_POST['get'])) { parse_str($_POST['get'], $get); }
//парсим get данные в массив
if (isset($_POST['get'])) { parse_str($_POST['post'], $post); }
//если пустая строка запроса или запрашивается index.php показываем пользователю главную страницу
if ($page == '' || $page == '/') { $page = 'index'; }
//удаляем крайние слеши, получаем страницу которую запрашивает пользователь
$page = trim($page, '/');
//проверяем существует ли у нас запрашиваемая пользователем страница в папке /pages/
if (file_exists(SFB_DIR.'/pages/'.$page.'.php'))
{
//включаем буферизацию вывода т.е. весь результат выполнения программы что будет ниже будет помещён в буфер
ob_start();
//подключаем запрашиваемую страницу
include(SFB_DIR.'/pages/'.$page.'.php');
//в переменную $content помещаем на буфер
$content = ob_get_clean();
//завершаем работу и отдаём данные в json формате (javascript который добавляет в элемент c ID sfb-content полученный результат выполнения скрипта)
exit(json_encode(['data' => '$("#sfb-content").html("'.$content.'");']));
}
else
{
exit(json_encode(['data' => 'window.location.replace("/404");']));
}
}
else
{
//включаем буферизацию вывода т.е. весь результат выполнения программы что будет ниже будет помещён в буфер
ob_start();
//проверяем существует ли у нас запрашиваемая пользователем страница в папке /pages/
if (file_exists(SFB_DIR.'/pages/'.$page.'.php'))
{
//подключаем запрашиваемую страницу
include(SFB_DIR.'/pages/'.$page.'.php');
}
else
{
//если не существует выдаём заголовок браузеру 404
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true);
//подключаем нашу страницу ошибки
include(SFB_DIR.'/pages/404.php');
}
//в переменную $content помещаем на буфер
$content = ob_get_clean();
//подключаем шаблон сайта
include(SFB_DIR.'/template.php');
}

заменив этот

//включаем буферизацию вывода т.е. весь результат выполнения программы что будет ниже будет помещён в буфер
ob_start();
//проверяем существует ли у нас запрашиваемая пользователем страница в папке /pages/
if (file_exists(SFB_DIR.'/pages/'.$page.'.php'))
{
//подключаем запрашиваемую страницу
include(SFB_DIR.'/pages/'.$page.'.php');
}
else
{
//если не существует выдаём заголовок браузеру 404
header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true);
//подключаем нашу страницу ошибки
include(SFB_DIR.'/pages/404.php');
}
//в переменную $content помещаем на буфер
$content = ob_get_clean();
//подключаем шаблон сайта
include(SFB_DIR.'/template.php');

Добавляем в файле template.php к элементу <main> id="sfb-content".

Открываем в браузере и любуемся нашим сайтом )))

 

Прикинем в моем скрипте 293 файла, в 90% файлов от 1000 строчек кода, в нескольких файлах от 5000 строчек кода, в одном файле двигателя свыше 15000 строчек програмного кода.

В среднем множим 300 * 1500 = 450 000 строчек кода, к этому еще планировка и концепкия дизайна, его отрисовка, и реализация. Вы в день примерно публикуете в среднем до 500 строчек кода. И того 450 000 / 500 = 900... тоесть с такой скоростью вы будете постить тут полноценый скрипт 900 дней, почти три года. Ну что же я желаю Вам удачи)

НазадСтраница 2 из 3Далее
Авторизация
*
*
Регистрация
*
*
*
Генерация пароля