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

Форум Регулярные Выражения

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

 

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

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

тема: Подскажите, безопасен ли этот код?
 
 автор: dedev   (29.10.2006 в 14:01)
 
 

Нужен простой движок.
Подскажите, безопасен ли этот код?

<?php
if(isset($go)) 
$file=$go.'.htm';
else 
$file='main.htm'//страница main.htm если переменная // $go не задана, иначе файл типа .htm с именем $go
if (file_exists($file)) //если файл существует
include ($file); // добавляем страницу
else
echo 
'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';
?>

Если нет, как его подправить?
Если можно приведите пример более функционального и безопасного мини-движка

   
 
 автор: ЯR   (29.10.2006 в 14:10)   письмо автору
 
   для: dedev   (29.10.2006 в 14:01)
 

Лучше так:

<?php 
if(isset($go)){
$go preg_replace('/[^a-z0-9_\.]/'''$go);
$file=$go.'.htm';
}
else 
$file='main.htm'//страница main.htm если переменная
                  // $go не задана, иначе файл типа .htm с именем $go 
if (file_exists($file)) //если файл существует 
include ($file); // добавляем страницу 
else 
echo 
'Файл '.$file.' не найден на сервере, обратитесь к администратору... '
?>


и ещё: если файлы статические, то лучше использовать не include, а readfile

   
 
 автор: dedev   (29.10.2006 в 15:05)
 
   для: ЯR   (29.10.2006 в 14:10)
 

Спасибо за ответ.
Не подскажите как улучшить код, чтобы каждый раздел был в своей папочке, а то куча станиц в одном месте не очень удобно.

<?php  
if(isset($go)){ 
$go preg_replace('/[^a-z0-9_\.]/'''$go); 
$file=$go.'.htm'

else 
$file='main.htm'//страница main.htm если переменная 
                  // $go не задана, иначе файл типа .htm с именем $go  
if (file_exists($file)) //если файл существует  
include ($file); // добавляем страницу  
else  
echo 
'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';  
?> 

   
 
 автор: ЯR   (29.10.2006 в 15:18)   письмо автору
 
   для: dedev   (29.10.2006 в 15:05)
 

Не понял какие разделы. Модули?

Кстати, если переменная go определяется внутри скрипта (а то я сначала подумал, что она берётся из URL), то можно не писать "$go = preg_replace('/[^a-z0-9_\.]/', '', $go)".

   
 
 автор: NIK   (29.10.2006 в 15:19)   письмо автору
 
   для: dedev   (29.10.2006 в 15:05)
 

для того что бы файлы лежали в отдельных папках, собственно нужно запихнуть файлы в отдельные папочки и всё :) папочки следует назвать так же, как и лежащий в нём файл. например file/file.htm, и тогда код стоить подправить следующим образом


<?php  
if(isset($go)){ 
$go preg_replace('/[^a-z0-9_\.]/'''$go); 
$file="$go/$go.htm";

else 
$file='main.htm'//страница main.htm если переменная 
                  // $go не задана, иначе файл типа .htm с именем $go  
if (file_exists($file)) //если файл существует  
include ($file); // добавляем страницу  
else  
echo 
'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';  
?>  


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

   
 
 автор: dedev   (29.10.2006 в 15:37)
 
   для: NIK   (29.10.2006 в 15:19)
 

Не, что то не то, я же не могу для каждого файла создавать отдельную папочку, у меня каждый раздел находится в отдельной папки и мне бы хотелось иметь возможность вызывать страницы ссылкой вида <a href="index.php?go=file">Файл</a> или типа того.
С учетом приведенного кода.

   
 
 автор: ЯR   (29.10.2006 в 15:51)   письмо автору
 
   для: dedev   (29.10.2006 в 15:37)
 

тогда так:

<?php   
if(isset($go)  && preg_match('#^[a-z0-9_]+/[a-z0-9_\.]+$#iU'$go)){ 
$go preg_replace('/[^a-z0-9_\.]/'''$go);  
$file=$go.'.htm';  
}  
else 
$file='main.htm'//страница main.htm если переменная  
                  // $go не задана, иначе файл типа .htm с именем $go   
if (file_exists($file)) //если файл существует   
include ($file); // добавляем страницу   
else   
echo 
'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';   
?> 

и ссылки тогда будут index.php?go=path/file

   
 
 автор: dedev   (29.10.2006 в 16:18)
 
   для: ЯR   (29.10.2006 в 15:51)
 

Или у меня руки кривые, или где-то в коде небольшая ошибка. Ссылки не работают.

   
 
 автор: ЯR   (29.10.2006 в 16:29)   письмо автору
 
   для: dedev   (29.10.2006 в 16:18)
 


<?php    
if(isset($go)  && preg_match('#^[a-z0-9_]+/[a-z0-9_\.]+$#iU'$go)){  
$file=$go.'.htm';   
}   
else 
$file='main.htm'//страница main.htm если переменная   
                  // $go не задана, иначе файл типа .htm с именем $go    
if (file_exists($file)) //если файл существует    
include ($file); // добавляем страницу    
else    
echo 
'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';    
?> 

так должно работать

   
 
 автор: dedev   (29.10.2006 в 16:48)
 
   для: ЯR   (29.10.2006 в 16:29)
 

Пасиб, все работает.
А можно бы узнать мнение по производительности выше приведенного кода, какие недостатки есть у него?
Можно ли в коде жестко указать рабочие директории, чтоб при обращении к не прописанным директориям перенаправлялся на главную станицу?
И вопрос совсем не по теме этого форума, но все же
Поменять ссылки
Вида <a href="sity.ru/ path/file">Файл</a>
На <a href=" sity.ru/path/file.htm">Файл</a>,
т.е. убрать часть index.php?go=
и добавить расшерение .htm
Извините за наглость

   
 
 автор: ЯR   (29.10.2006 в 17:12)   письмо автору
 
   для: dedev   (29.10.2006 в 16:48)
 

>А можно бы узнать мнение по производительности выше приведенного кода, какие недостатки есть у него?
даже не знаю
>Можно ли в коде жестко указать рабочие директории, чтоб при обращении к не прописанным директориям перенаправлялся на главную станицу?
можно, например, в массив занести:

<?php
$dir 
= array('news''articles''catalog''other');
if(!empty(
$go) && preg_match('#^([a-z0-9_]+)/[a-z0-9_\.]+\.htm$#iU'$go$regs)){
   if(
in_array($regs[1], $dir)) $file $go;
   else 
$file 'main.htm';
   
// включение
}else{
  
// какие-то действия 
}
?>


>И вопрос совсем не по теме этого форума, но все же
>Поменять ссылки
>Вида <a href="sity.ru/ path/file">Файл</a>
>На <a href=" sity.ru/path/file.htm">Файл</a>,
>т.е. убрать часть index.php?go=
>и добавить расшерение .htm
>Извините за наглость
это вам в раздел форума по Apache надо писать (но лучше сначала поискать в нём по фразе mod_rewrite)

   
 
 автор: dedev   (29.10.2006 в 19:05)
 
   для: ЯR   (29.10.2006 в 17:12)
 

извините
Ссылки без указания директорий не работают

<?php     
if(isset($go)  && preg_match('#^[a-z0-9_]+/[a-z0-9_\.]+$#iU'$go)){   
$file=$go.'.htm';    
}    
else 
$file='main.htm'//страница main.htm если переменная    
                  // $go не задана, иначе файл типа .htm с именем $go     
if (file_exists($file)) //если файл существует     
include ($file); // добавляем страницу     
else     
echo 
'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';     
?> 

Помогите, пожалуйста

   
 
 автор: ЯR   (29.10.2006 в 19:20)   письмо автору
 
   для: dedev   (29.10.2006 в 19:05)
 

Ну тогда так:

<?php      
if(isset($go)  && preg_match('#^([a-z0-9_]+/)?[a-z0-9_\.]+$#iU'$go)){    
$file=$go.'.htm';     
}     
else 
$file='main.htm'//страница main.htm если переменная     
                  // $go не задана, иначе файл типа .htm с именем $go      
if (file_exists($file)) //если файл существует      
include ($file); // добавляем страницу      
else      
echo 
'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';      
?>

   
 
 автор: dedev   (29.10.2006 в 20:01)
 
   для: ЯR   (29.10.2006 в 19:20)
 

Огромное спасибо, все работает.
Один единственный вопрос и тему можно закрывать.

Как динамически менять заголовок между тегами <title></title>

Надеюсь, Вы мне поможете.
Всем огромное спасибо за помощь.

   
 
 автор: Spayker   (29.10.2006 в 20:19)   письмо автору
 
   для: dedev   (29.10.2006 в 20:01)
 


<?php
if($go == "news") echo "<title>Новости</title>";
if(
$go == "games") echo "<title>Игры</title>";
?>

и так далее

   
 
 автор: dedev   (29.10.2006 в 20:33)
 
   для: Spayker   (29.10.2006 в 20:19)
 

К сожалению, не получится, слишком много станиц, будет слишком большой список

   
 
 автор: ЯR   (29.10.2006 в 21:22)   письмо автору
 
   для: ЯR   (29.10.2006 в 19:20)
 


<?php
$titles
[] = 'Сайт';
$titles['news'] = 'Новости';
$titles['articles'] = 'Статьи';
if(isset(
$go)  && preg_match('#^([a-z0-9_]+/)?[a-z0-9_\.]+$#iU'$go)){
if(
preg_match('#^([a-z0-9_]+)/[a-z0-9_\.]+$#iU'$go$regs)) $dir_name $regs[1];
else 
$dir_name 0;

print 
"<title>{$titles[$dir_name]}</title>";
// и т.д.
}
?>

   
 
 автор: dedev   (29.10.2006 в 21:36)
 
   для: ЯR   (29.10.2006 в 21:22)
 

Спасибо.
А нельзя ли сделать, что-то типа такого в вызываемой странице

<? $description "описание" ?> ;
<? $keywords "ключевые слова" ?> ;
<? $title "заголовок" ?> ;

а в основной что то типа

<?=$title?> ;

Правда это не работает, но типа такого.

Если можно, у самого не выходит

   
 
 автор: ЯR   (29.10.2006 в 21:45)   письмо автору
 
   для: dedev   (29.10.2006 в 21:36)
 

т.к. переменные нельзя определять после их вызова, то можно попробоват в вызываемой странице объявить ф-ии, например:

<?php
function meta_page(){
   return array(
'Описание''ключевые слова''заголовок');
}
?>


<?php
$meta 
meta_page();
print 
"<title>{$meta[2]}</title>";
// и т.д.
?>

   
 
 автор: dedev   (29.10.2006 в 22:43)
 
   для: ЯR   (29.10.2006 в 21:45)
 

Извините я, наверное, всем надоел.
Но все-таки нету ли более универсального кода
Потому что, если я правильно понял

Этот код вставляется в главную страницу

<?php 
function meta_page(){ 
   return array(
'Описание''ключевые слова''заголовок'); 

?>

Этот в вызываемую

<?php 
$meta 
meta_page(); 
print 
"<title>{$meta[2]}</title>"
// и т.д. 
?>

наоборот у меня не получилось, всеравно

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

Надеюсь есть какой-то способ решить мою проблему

   
 
 автор: ЯR   (29.10.2006 в 23:03)   письмо автору
 
   для: dedev   (29.10.2006 в 22:43)
 

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

<?php
$title 
'Заголовок';
include(
'inc/header.php'); // включаем шапку

// тут содержание страницы

include('inc/footer.php'); // включаем подвал
?>


<?php
// header.php
?>
<html>
<head>
<title><?php print $title ?></title>
</head>
<body>


<?php
 
// footer.php
?>
</body>
</html>

   
 
 автор: dedev   (30.10.2006 в 01:05)
 
   для: ЯR   (29.10.2006 в 23:03)
 

Жаль, что для этого кода нельзя сделать добавление мета-тегов к каждой странице, ну все равно спасибо Вам за помощь.
Тему можно закрыть
Еще раз всем спасибо

<?php       
if(isset($go)  && preg_match('#^([a-z0-9_]+/)?[a-z0-9_\.]+$#iU'$go)){     
$file=$go.'.htm';      
}      
else 
$file='main.htm'//страница main.htm если переменная      
                  // $go не задана, иначе файл типа .htm с именем $go       
if (file_exists($file)) //если файл существует       
include ($file); // добавляем страницу       
else       
echo 
'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';       
?>

   
 
 автор: ЯR   (30.10.2006 в 06:15)   письмо автору
 
   для: dedev   (30.10.2006 в 01:05)
 

> Жаль, что для этого кода нельзя сделать добавление мета-тегов к каждой странице,
На моих сайтах meta-данные хранятся в базе данных, и выбираются в зависимости от запрашиваемого uri ($_SERVER['REQUEST_URI']), т.е. примерно так:

<?php
if ($query mysql_query("SELECT * FROM metadata WHERE page='".str_replace("'""`"$_SERVER['REQUEST_URI'])."'")) {
        if (
mysql_num_rows($query) > 0) {
            
$meta_data mysql_fetch_array($query);
            
$title $meta_data[];

        }
}
print 
"<title>{$title}</title>";
?>

можете так же сделать

   
 
 автор: dedev   (30.10.2006 в 11:09)
 
   для: ЯR   (30.10.2006 в 06:15)
 

моих знаний, к сожалению не хватает
буду выкручиваться без мета-тегов
спасибо

P.S. Не могли бы вы привести структуру таблиц для этого кода

<?php 
if ($query mysql_query("SELECT * FROM metadata WHERE page='".str_replace("'""`"$_SERVER['REQUEST_URI'])."'")) { 
        if (
mysql_num_rows($query) > 0) { 
            
$meta_data mysql_fetch_array($query); 
            
$title $meta_data[]; 

        } 

print 
"<title>{$title}</title>"
?> 

   
 
 автор: dedev   (30.10.2006 в 11:39)
 
   для: dedev   (30.10.2006 в 11:09)
 

Нельзя ли чуть подправить
При загрузки главной страницы заголовок title не отображается

<?php 
$titles
[] = 'Сайт'
$titles['news'] = 'Новости'
$titles['articles'] = 'Статьи'
if(isset(
$go)  && preg_match('#^([a-z0-9_]+/)?[a-z0-9_\.]+$#iU'$go)){ 
if(
preg_match('#^([a-z0-9_]+)/[a-z0-9_\.]+$#iU'$go$regs)) $dir_name $regs[1]; 
else 
$dir_name 0

print 
"<title>{$titles[$dir_name]}</title>"
// и т.д. 

  
if(isset(
$go)  && preg_match('#^([a-z0-9_]+/)?[a-z0-9_\.]+$#iU'$go)){      
$file=$go.'.htm';       
}       
else 
$file='main.htm'//страница main.htm если переменная       
                  // $go не задана, иначе файл типа .htm с именем $go        
if (file_exists($file)) //если файл существует        
include ($file); // добавляем страницу        
else        
echo 
'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';        
?> 

   
 
 автор: ЯR   (30.10.2006 в 12:25)   письмо автору
 
   для: dedev   (30.10.2006 в 11:39)
 


<?php  
$go 
$_GET['go'];
$titles['main'] = 'Сайт';  
$titles['news'] = 'Новости';  
$titles['articles'] = 'Статьи';  
if(isset(
$go)  && preg_match('#^([a-z0-9_]+/)?[a-z0-9_\.]+$#iU'$go)){  
if(
preg_match('#^([a-z0-9_]+)/[a-z0-9_\.]+$#iU'$go$regs)) $dir_name $regs[1]; 
if (empty(
$dir_name)) $dir_name 'main';

print 
"<title>{$titles[$dir_name]}</title>";  
// и т.д.  
}  
   
if(isset(
$go)  && preg_match('#^([a-z0-9_]+/)?[a-z0-9_\.]+$#iU'$go)){       
$file=$go.'.htm';        
}        
else 
$file='main.htm'//страница main.htm если переменная        
                  // $go не задана, иначе файл типа .htm с именем $go         
if (file_exists($file)) //если файл существует         
include ($file); // добавляем страницу         
else         
echo 
'Файл '.$file.' не найден на сервере, обратитесь к администратору... ';         
?> 

   
 
 автор: ЯR   (30.10.2006 в 12:18)   письмо автору
 
   для: dedev   (30.10.2006 в 11:09)
 


CREATE TABLE metadata (
  id_page int(11) NOT NULL auto_increment,
  page tinytext,
  title tinytext,
  keywords tinytext,
  description text,
  PRIMARY KEY  (id_page)
) ENGINE=MyISAM;

   
 
 автор: dedev   (30.10.2006 в 12:37)
 
   для: ЯR   (30.10.2006 в 12:18)
 

SQLite

<?php
$db 
sqlite_open("metadata.db");  
if (
$query sqlite_query($db"SELECT * FROM metadata WHERE page='".str_replace("'""`"$_SERVER['REQUEST_URI'])."'")) {  
        if (
sqlite_num_rows($query) > 0) {  
            
$meta_data sqlite_fetch_array($query);  
            
$title $meta_data;  

        }  
}  
print 
"<title>{$title}</title>";  
?>  

пишет Notice: Undefined variable: title in z:\home\test1.ru\www\index.html on line 10

   
 
 автор: Unkind™   (30.10.2006 в 15:03)   письмо автору
 
   для: dedev   (30.10.2006 в 12:37)
 

пишет Notice: Undefined variable: title in z:\home\test1.ru\www\index.html on line 10
Значит sqlite_num_rows($query) <= 0, либо запрос $query неудачен.
Вместо

<?php
$var 
str_replace("'""`"$_SERVER['REQUEST_URI']);
?>

Лучше писать

<?php
$var 
mysql_escape_string($_SERVER['REQUEST_URI']);
?>

   
 
 автор: dedev   (01.11.2006 в 10:32)   письмо автору
 
   для: Unkind™   (30.10.2006 в 15:03)
 

тема обсуждается здесь
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=26884

   
Rambler's Top100
вверх

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