Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фильтрация данных в PHP 
:(
    Опции темы
DezmASter
Дата 26.4.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дизайнер :)
***


Профиль
Группа: Участник
Сообщений: 1520
Регистрация: 3.2.2006
Где: Украина, Запорожь е

Репутация: 1
Всего: 109



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

Прежде всего, следует фильтровать данные, которые передает пользователь осознанно - в основном, это данные различных форм. Это может быть пара логин-пароль для входа, пункт голосования и т.п. Например, такая форма

 
Код

<form action="index.php" method="GET">
<input type="text" name="login">
<input type="text" name "pass">
<input type="submit" value="OK">
</form>



После нажатия кнопки "OK" передаст скрипту index.php два значения - $login и $pass. Как их можно отфильтровать? Пример для переменной $login:

 
Код


if($login)
{
$login = htmlspecialchars((stripslashes($login)), ENT_QUOTES);
$login = str_replace("/","",$login);
$login = str_replace(".","",$login);
$login = str_replace("`","",$login);
}
else
{
echo "Логин не введен!";
}

 


В первой строке мы проверяем существование переменной $login, если она существует - идем дальше, если нет - выводим сообщение об ошибке. Затем с помощью функции htmlspecialchars заменяем в этой переменной спецсимволы на их HTML мнемоники. То есть знак `<` меняется на `<`, `&` меняется на `&` и т.д. Функция stripslashes вырезает знак обратного слеша `\`. Далее с помощью str_replace вырезаем знак прямого слеша, точку (иногда бывает полезно) и обратную кавычку.

Если вы знакомы с регулярными выражениями, то предыдущий пример можно записать гораздо короче:

 
Код

if($login)
{
if (preg_match("/[0-9a-z_]/i", $login))
{
// … действия над логином …
}
else
{
echo "Логин введен неверно!";
}
}
else
{
echo "Логин не введен!";
}



Этот фрагмент кода будет проверять введенный логин на соответствие регулярному выражению `/[0-9a-z_]/i`, которое означает: все цифры + все латинские буквы в любом регистре + знак подчеркивания. Если логин содержит другие символы, то будет показано сообщение об ошибке.

Аналогично фильтруются переменные, получаемые скриптом через URL. В движках сайтов можно встретить что-то вроде таких ссылок:

http://www.site.com/index.php?module=news

Если не фильтровать переменную $module (или $_GET[`module`], если register_globals отключен), то над сайтом могут вытворяться не очень хорошие вещи, вроде XSS. Нужно применять первый приведенный мной скрипт-чистильщик, разумеется, убрав сообщения об ошибках.

Следующее, на чем бы я хотел остановиться - это фильтрация кукисов. Думаю, что даже если вы начинающий программист, то с "плюшками" вы сталкивались, а насчет их проверки даже не задумывались. Зря! Если вы используете SQL-базы данных, то отсутствие проверки кукисов может привести к использованию хакерами SQL-injection. Так как в кукисах, в основном, мы используем определенный тип данных, например, только числа, то проверку данных можно проводить с помощью все тех же регулярных выражений. Допустим, у нас есть кукис "id", в котором хранятся числовые данные. Его проверка:

 
Код

if($_COOKIE[`id`])
{
if (preg_match("/[0-9]/", $_COOKIE[`id`])
{
// … действия над кукисом …
}
else
{
echo "Хм, странный кукис. Не пойдет!";
}
}

 


В сети есть огромное количество документации посвященной взлому сайтов,в частности, там показаны различные случаи использования XSS и приемы обхода фильтрации. Но мы то с вами уже умеем защищаться от непрошенных гостей ;) 

Автор: Ткаченко Ярослав
Сайт автора: http://wcode.ru/

PM WWW ICQ Skype GTalk Jabber   Вверх
alloha
Дата 19.9.2007, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 19.9.2007

Репутация: нет
Всего: нет



Существует скрипт, который выводит данные из БД (postgresql) в табличку. Необходимо к этому скрипту прикрутить механизм фильтрации по датам (месяц-год). Порывшись в доках я набросал запрос к бд, который как раз и делает необходимую мне работу, только вот отображает он только дату, а остальные данные нет. Похожий механизм я видел на одной из страничек нашего внутреннего сайта, там все работает. Я пытался по аналогии сделать тоже самое с моим скриптом но эффект тотже (выводится только дата). Подскажите в чем может быть проблема. Если не затруднить обрисуйте пожалуйста сам механизм фильтрации подобных данных.

Код

$selected=" selected";
for($i=0;$i<60;$i++){
    if($i>0 && $i<=31){
    $opt_bdays.='<option value="'.$i.'"'.((((int)$begin_days)==$i)?$selected:"").'>'.(($i<10)?"0".$i:$i).'</option>';
    $opt_edays.='<option value="'.$i.'"'.(((int)$end_days==$i)?$selected:"").'>'.(($i<10)?"0".$i:$i).'</option>';
        if($i<=12){
            $opt_bmonths.='<option value="'.$i.'"'.(($begin_months==$i)?$selected:"").'>'.(($i<10)?"0".$i:$i).'</option>';
            $opt_emonths.='<option value="'.$i.'"'.(($end_months==$i)?$selected:"").'>'.(($i<10)?"0".$i:$i).'</option>';
        }
    }
    if($i<24){
        $opt_bhours.='<option value="'.$i.'"'.(($begin_hours==$i)?$selected:"").'>'.(($i<10)?"0".$i:$i).'</option>';
        $opt_ehours.='<option value="'.$i.'"'.(($end_hours==$i)?$selected:"").'>'.(($i<10)?"0".$i:$i).'</option>';
    }
}
for($i=date("Y");$i<=date("Y")+1;$i++){
    $opt_byear.='<option value="'.$i.'"'.(($begin_year==$i)?$selected:"").'>'.$i.'</option>';
    $opt_eyear.='<option value="'.$i.'"'.(($end_year==$i)?$selected:"").'>'.$i.'</option>';
}

$day_of_months=array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$leap_day_of_months=array(0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$date="";
$month=($_GET['month'])?(int)$_GET['month']:date("m");
$year=($_GET['year'])?$_GET['year']:date("Y");
$end_day=( ((int)$year)%4==0 && ((int)$year)%100!=0 ) ?$leap_day_of_months[(int)$month]:$day_of_months[(int)$month];
$end_date=$year."-".$month."-".$end_day;
$g_end_date=$end_day.".".$month.".".$year;
$date=$year."-".$month."-01";
$g_date="01.".$month.".".$year;


echo '<br><br>';
echo '<form method="get">';
echo '<table cellpadding="2" cellspacing="0" border="0">';
echo '<caption></caption>';
echo '<tr><td>Ìåñÿö '.render_month_selector(($_GET['month'])?$_GET['month']:date("m")).'</td>';
echo '<td>Ãîä '.render_year_selector(($_GET['year'])?$_GET['year']:date("Y")).'</td>';
echo '<td><input type="Submit" name=sort value="Ïåðåéòè"></td></tr>';
echo '</table>';
echo '</form>';
echo '<table cellpadding="3" cellspacing="0" class="events">';
echo '<caption>Çàïèñè î êîíêóðñíûõ ìåðîïðèÿòèÿõ çà '.$g_date.' - '.$g_end_date.'
</caption>';



echo '<table cellpadding="3" cellspacing="0" class="events">';
echo '<tr align=center><td class="events" align="center" bgcolor="#EEEEEE"><p class="news_header">¹ Ï/Ï</td>';
echo '<td class="events" align="center" bgcolor="#EEEEEE"><p class="news_header">Äàòà âíåñåíèÿ</td>';
echo '<td class="events" align="center" bgcolor="#EEEEEE"><p class="news_header">Êëèåíò</td>';
echo '<td class="events" align="center" bgcolor="#EEEEEE"><p class="news_header">Òèï êîíêóðñà</td>';
echo '<td class="events" align="center" bgcolor="#EEEEEE"><p class="news_header">Ññûëêà</td>';
echo '<td class="events" align="center" bgcolor="#EEEEEE"><p class="news_header">Îïèñàíèå</td>';
echo '<td class="events" align="center" bgcolor="#EEEEEE"><p class="news_header">Äàòà ïîäà÷è</td>';
echo '<td class="events" align="center" bgcolor="#EEEEEE"><p class="news_header">Îòâåòñòâåííûé</td>';
echo '<td class="events" align="center" bgcolor="#EEEEEE"><p class="news_header">Ðåçóëüòàò</td></tr>';


$db = pg_query("select datep from konkurs where datep>='".$date."' and datep<='".$end_date."' group by datep order by datep DESC");
$a=0;
$npp=1;
foreach($db as $datep){
    $date=$datep['datep'];
    $query="select * from konkurs where datep='".$date."' order by datep;";
    $drivers=db_query($con, $query);
    foreach($drivers as $rez){
        echo '<tr>';
        echo '<td class="events"><p class="text">'.($npp++).'</td>';
        echo '<td class="events"><p class="text">' .$rez['date'].'<br></td>';
        echo '<td class="events"><p class="text">' .$rez['clients'].'<br></td>';
        echo '<td class="events"><p class="text">' .$rez['tipe'].'<br></td>';
        echo '<td class="events"><p class="text">' .$rez['links'].'<br></td>';
        echo '<td class="events"><p class="text">' .$rez['op'].'<br></td>';
        echo '<td class="events"><p class="text">' .$rez['datep'].'<br></td>';
        echo '<td class="events"><p class="text">' .$rez['otv'].'<br></td>';
        echo '<td class="events"><p class="text">' .$rez['rez'].'<br></td>';
        echo '</tr>';
    }
}

echo '</table>';
echo '<br />';
echo '</td>';
  

С уважением, AllohA!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.