Какими способами...

Разработка своих веб-приложений и страничек

Re: Какими способами...

Сообщение Zver » 23 авг 2009, 14:49

ibe, если "($_GET['cat'])" - ID (т.е. число) то достаточно использовать :
Код: Выделить всёРазвернуть
$id = intval($_GET['cat']); 

При этом инъекция невозможна. т.к. ID число при подставлении букв ID будер равнятся "0". Можно создать новость с ID "0", в которой говориться как нехорошо ломать сайты и при попытке инъекции новость будет выводится :)
Zver
Активный участник
 
Сообщения: 1333
Зарегистрирован: 18 дек 2008, 18:51
Откуда: Саратов, Заводской

Re: Родительские категории

Сообщение ibe » 23 авг 2009, 21:05

Вот в общем не получается сгенерировать меню. Состоит оно из 2 частей - категории и его родительские категории.
В базе расклад таков:
таблица categories, её поля: id, title, parent_id
С верхней частью меню все в порядке:
Код: Выделить всёРазвернуть
<?php 
$style 
= 11;
 $cats1 = mysql_query("SELECT * FROM categories WHERE parent_id=0");
    while  ($cats = mysql_fetch_array($cats1)) 
   
{
  
           echo 
" <li class='tn".$style."'>
            <a href='/view.php?cat="
.$cats['id']."'><span>".$cats['title']."</span></a>        </li>";
 
 $style 
= $style + 1;      
   
}

?> 

Но вот с родительскими категориями проблема. Как можно их сгенерировать, если в базе они отсортировываются по полю parent_id.
Пример:
категория "Новости" (id - 1) к ней род. категория "В мире" (id - 2, parent_id - 1) ?
Изображение
Аватара пользователя
ibe
Активный участник
 
Сообщения: 893
Зарегистрирован: 31 мар 2009, 00:46

Re: Какими способами...

Сообщение zk » 24 авг 2009, 09:57

Дополнительные SQL запросы по каждому родительскому id, при не больших объёмах на производительности не скажется.
zk
Администратор
 
Сообщения: 1971
Зарегистрирован: 02 сен 2007, 16:04
Домен: vfose.ru

Re: Какими способами...

Сообщение ibe » 28 авг 2009, 21:33

zk писал(а):Дополнительные SQL запросы по каждому родительскому id, при не больших объёмах на производительности не скажется.

Вот здесь можно по подробней.
Нужно что-то типо родительских категорий(примерно как на этом сайте, как на DataLife engine...).
Изображение
Аватара пользователя
ibe
Активный участник
 
Сообщения: 893
Зарегистрирован: 31 мар 2009, 00:46

Re: Какими способами...

Сообщение zk » 29 авг 2009, 16:33

Выбираешь категории в цикле, и на каждую делаешь SQL запрос, понятнее я не знаю как объяснить.
zk
Администратор
 
Сообщения: 1971
Зарегистрирован: 02 сен 2007, 16:04
Домен: vfose.ru

Re: Какими способами...

Сообщение ibe » 30 авг 2009, 17:36

Нельзя ли создать в базе 2 таблици.
Categories и subcategories. В categories будут категории, а в subcategories будут их родительские категории ?
Изображение
Аватара пользователя
ibe
Активный участник
 
Сообщения: 893
Зарегистрирован: 31 мар 2009, 00:46

Re: Какими способами...

Сообщение zk » 30 авг 2009, 18:49

Это неправильно.
zk
Администратор
 
Сообщения: 1971
Зарегистрирован: 02 сен 2007, 16:04
Домен: vfose.ru

mysql_real_escape_string не работает

Сообщение AVX » 10 окт 2009, 09:16

ibe писал(а):------------
+ тут случайно нету SQL-иньекции ?
Код: Выделить всёРазвернуть
$cat = $_GET['cat']; 

Лучше будет, если напишу примерно так:
Код: Выделить всёРазвернуть
$cat = mysql_real_escape_string($_GET['cat']); 
?


а как еще сделать проверку входного параметра, если на хостинге mysql_real_escape_string не работает?
intval тоже не подойдет - нужны строки, а не цифры.
AVX
Активный участник
 
Сообщения: 227
Зарегистрирован: 07 ноя 2008, 23:36
Откуда: Пугачев
Домен: http://pug-cs.ru/

Re: mysql_real_escape_string не работает

Сообщение Zver » 10 окт 2009, 15:40

а как еще сделать проверку входного параметра, если на хостинге mysql_real_escape_string не работает?
intval тоже не подойдет - нужны строки, а не цифры.

тяжелый случай (=
Пользуйся функцией:
Код: Выделить всёРазвернуть

function anti_injection
($sql, $debug=false) {
  if($sql == '') return;
  $single = false;
  $double = false;
//if (get_magic_quotes_gpc()) $sql = stripslashes($sql); // Если есть проблемы с ковычками
  $sql = htmlspecialchars($sql);
  if(substr_count($sql, "'" ) == 0) $single = false; else $single = true;
  if(substr_count($sql, '"' ) == 0) $double = false; else $double = true;
  if($single) $sql = str_replace("'", '& #039;', $sql);
  if($double) $sql = str_replace('"', '&quote;', $sql);
  return $sql;
}
 

И для того чтобы обезопасить запрос, фильтруй данные с помощью этой функции. Например:

Код: Выделить всёРазвернуть

function anti_injection
($sql, $debug=false) {
  if($sql == '') return;
  $single = false;
  $double = false;
//if (get_magic_quotes_gpc()) $sql = stripslashes($sql); // Если есть проблемы с ковычками
  $sql = htmlspecialchars($sql);
  if(substr_count($sql, "'" ) == 0) $single = false; else $single = true;
  if(substr_count($sql, '"' ) == 0) $double = false; else $double = true;
  if($single) $sql = str_replace("'", '& #039;', $sql);
  if($double) $sql = str_replace('"', '&quote;', $sql);
  return $sql;
}
$username = $_POST['username'];
$username = anti_injection($username, true);
mysql_query("SELECT * FROM users WHERE username = '".$username."' LIMIT 1 ");
 
Zver
Активный участник
 
Сообщения: 1333
Зарегистрирован: 18 дек 2008, 18:51
Откуда: Саратов, Заводской

Пред.

Вернуться в PHP, HTML, CSS...

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 36

cron