PDA

Просмотр полной версии : Проблемка с кодом на PHP...


Hulio
09.03.2009, 18:08
Вообщем нужно создать динамическую страничку news которая будет изменятся в зависимости от переданного параметра id. Проблема в том, что я использую фрейм на страничке, т.е. у меня прокрутка текста, и вот такой код:

в самом начале странички:


<?php
include ("safezone/connect2base.php"); // коннект к базе (имя и пароль)

if (isset($_GET['id'])) {$id=$_GET['id'];}

if ($id > 0)
{
$result = mysql_query ("SELECT * FROM news WHERE id='$id'",$dbase);
$buffer = mysql_fetch_array ($result);
// если параметр передан значит делаем запрос всех полей из таблицы
}
else
{
$result = mysql_query ("SELECT title,metad,metak,text FROM news WHERE id='1'",$dbstatus);
$buffer = mysql_fetch_array ($result);
// если параметра нет то делаем запрос только полей первой записи в таблице
}
?>



Ну а в самом каркасе (таблице) мне нужно чтобы в зависимости от того передан параметр или нет подгружался нужный мне фрейм, только вот неполучается вставить нужный код, пробовал так:


<?php

if ($id > 0) //если параметр не нулевой нужно внести код для frame_news.php
{
echo('<iframe height="235px" width="440px" style="padding-left:10px; padding-top:10px; padding-bottom:10px; padding-right:10px; border:0px; border-style:solid; border-width:0px; background:inherit" src="frame_news.php" allowtransparency="true" frameborder="0"></iframe>');
}
else //если параметр нулевой нужно внести код для frame_list.php
{
echo $buff['text'];
echo("
<div align='left' >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>Новости: </b></div>
<iframe height='235px' width='440px' style='padding-left:10px; padding-top:10px; padding-bottom:10px; padding-right:10px; border:0px; border-style:solid; border-width:0px; background:inherit' src='frame_list.php' allowtransparency='true' frameborder='0'></iframe>");
}
?>


Функция echo выводит на экран а мне нужно в зависимости от параметра id вставить нужный код в страницу, подскажите как это осуществить ?

Regis Filius
09.03.2009, 18:40
Эм... код мне показался немого непонятным, может быть я не слишком понял что к чему в нем. Да и с фреймами я особо не работал, не нравятся мне они. Но для начала стоит попробовать задавать путь для фрейма с переменной ID, чтобы он знал как открывать ;)))
То есть путь для фрейма давать не frame_news.php, а frame_news.php?id=$id, плюс переменную в кавычки поместить, меня они всегда выводили из себя :)
Что-то вроде этого должно получиться:
echo('<iframe height="235px" width="440px" style="padding-left:10px; padding-top:10px; padding-bottom:10px; padding-right:10px; border:0px; border-style:solid; border-width:0px; background:inherit" src="frame_news.php?id='."$id".'" allowtransparency="true" frameborder="0"></iframe>');
Если заработает :)

P.S. Вообще фреймы зло. Конечно, это дело вкуса и функционала, но мне больше инклуды нравятся =)

Hulio
09.03.2009, 21:36
Пасиба ) так уже пробовал. Инклудами я тоже пользуюсь просто фрейм в моем случае это элемент дизайна странички, с помощью фрейма можно сделать классный скроллбар.
Я хочу иметь прокрутку в разделе новостей, и пробовал юзать яву но все эти скрипты только усложняли страничку, разрывали дизайн либо вообще отказывались работать в других браузерах, вот я решил попробовать фрейм, у него полностью настраеваемый скроллбар, т.е. не стандартный виндовсовский а любой на цвет и вкус ))

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

Regis Filius
09.03.2009, 22:45
Через атрибут "target". Если не изменяет мне память :)

Надо в таргет у ссылки прописать место или имя фрейма, где его надо открывать, по умолчанию стоит родительский фрейм (_self), то есть тот, где он и находится. Если надо открыть по всей странице, то вроде надо "_top" ставить. Но если честно, я уже не помню, надо в хтмл-справочниках поискать.

P.S. Вроде с помощью CSS можно сделать четко ограниченные области и сделать прокрутку у них. Довольно сложно, я думаю, исполнить это, чтобы при любом браузере и разрешении нормально смотрелось. Пример, кстати, можно посмотреть выше в пхп коде. С помощью парсера там сделали блоковый элемент с заданным размером и прокруткой. В принципе создать легко, а вот грамотно вставить трудно )

P.P.S. Я так понял, что мой прошлый вариант не оправдал возложенных на него надежд? )))

Hulio
10.03.2009, 01:01
P.P.S. Я так понял, что мой прошлый вариант не оправдал возложенных на него надежд? )))

Оправдал =) Невнимательный я оказывается, нужно было воспользоватся пристыковкой а я пытался переменную так вписать поэтому и не получалось передать фрейму параметр.

ЗЫ: у меня менюшка сделанная на css в опере отлично работает а в эксплорере ну нивкакую не хочет работать, без менюшки вообще никак, у эксплорера кастрация какая-то чтоли на css ?

И еще у меня картинки png c прозрачностью для фона, в опере нормально смотрится а в эксплорере эти области серые, не поодерживает эксплорер png ?

Regis Filius
10.03.2009, 08:35
IE вообще по-другому понимает или не понимает вообще многие параметры и форматы. Если делать сайт с поддержкой IE, Mozilla и Opera, придется отказаться от некоторых возможностей или же ставить проверку браузера через яваскрипт, лично я забил на IE :)

Googleman
10.03.2009, 20:44
Немного не по теме, но у вас SQL-injection. Или я чего то не понимаю.
ИЕ6 и ниже действительно много чего незнает. И в пнг прозрачность нормально не обрабатывает.

Hulio
11.03.2009, 20:10
Googleman да код пока не защищен, нужно сделать проверку на входные параметры от пользователя. Сейчас пишу основной функционал сайта, а оптимизация и защита будет вторым этапом, после того как закончу с каркасом.

Googleman
12.03.2009, 13:40
Лучше сразу начинать с безопасности. А то потом то не доделал, здесь не залатал, там параметры не проверил и т.п.

Hulio
12.03.2009, 14:50
Googleman безусловно ты прав =)

кстати вот как раз нужна оценка безопасности моего кода, и возможно совет:

Сделал у себя в админке панельку с системными сообщениями, которая показывает когда и кто пытается определить уязвимость через передаваемые параметры.
ВОПРОС: опасно ли в не админском блоке т.е. на простой страничке (а уменя такой код будет на каждой) иметь обращение к базе и запись, база для этих целей у меня естественно отдельная от основной, для безопастности, и вот код:



<?php
if (isset($_GET['id'])) {$id=$_GET['id']; $userparam = $id;}
// Если переменная существует то берем ее из глоблального массива и помещаем в обычную переменную.
if ($id == "") {$id = 0;}
// Если в страницу передан пустой параметр т.е. ссылка вида news.php то присваеваем ей значение ноль, a если параметр не пуст то проверям значение...
else
{
if (!preg_match("|^[\d]+$|", $id)) { $id = 0;}
// Проверяем параметр на запрещенные символы, если есть то присваеваем ноль
$bd = mysql_connect ("localhost","adminuser","adminuser"); // Запрашиваем сервер и подключаемся
mysql_select_db ("baseevents",$bd); // Открываем нужную базу
$info = "[ попытка взлома через параметр ]"; // Записываем для админа что делает кто и откуда
$datetime = date("H:i:s G:i");
$clientipaddr = $_SERVER['REMOTE_ADDR'];
$infotxt = $datetime." Пользователь по адресу : ".$clientipaddr." попытался<br> обнаружить уязвимость, передав странице news.php<br> в качестве параметра значение : ".$userparam;
if (isset($info ) && isset($datetime) && isset($clientipaddr) && isset($infotxt))
{
$writeresult = mysql_query("INSERT INTO events (info, datetime, clientipaddr, infotxt) VALUES ('$info','$infotxt','$clientipaddr','$infotxt')");
if ($writeresult = true)
{
$fd = fopen("security/logfile.txt", "a+");
fwrite($fd, "$datetime успешно добавлена новая запись в базу\n");
fclose($fd);
}
else {
$fd = fopen("security/logfile.txt", "a+");
fwrite($fd, "$datetime неудалось внести системные сообщения в базу\n");
fclose($fd);
}
}
}



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

Интересует достаточно безопасен ли этот код ?

И еще вопрос как определить текущую страничку, это чтобы вместо news.php поставить переменную которая автоматически определит страницу?

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

Googleman
12.03.2009, 18:55
Имя скрипта хранится в константе __FILE__. Можно еще взять $_SERVER['SCRIPT_NAME']. Админку можно юзать и по стандартному адресу но защититть .htaccess
Логи лучше сбрасывать в файл, и тоже защищать .htaccess.
$writeresult = mysql_query("INSERT INTO events (info, datetime, clientipaddr, infotxt) VALUES ('$info','$infotxt','$clientipaddr','$infotxt')");
if ($writeresult = true)

Здесь лучше юзать синтаксис INSERT INTO `tblname` SET `var`=`val`, `var1`=`val1` и тп. Параметры лучше проверять парся QUERY_STRING; переносимей так + лучше выделить это в отдельный файл и описать функцией.

З.Ы. И все равно лучше логи сбрасывать в файл.