Поиск (фильтр) по нескольким значениям и проблем с AND запросе.

Статус
В этой теме нельзя размещать новые ответы.

Руслан

Новичок
Автор оригинала: Ф а н а т
Кстати, что аффтар, что С. напрочь забыли о безопасности
С этим у меня обчно проблем нет. Просто у меня подход такой. Я сначала пишу код, а потом перечитываю его и ввожу все проверки, слешевание и т.д. Потому что сталкивался с тем, что когда на ходу пишешь все проверки, то где то что то да пропустишь..
 

Руслан

Новичок
Ф а н а т
Вот ты жук.. =) Но я тебя всё равно люблю, потому что ты мудрый и не раз мне помогал.. А теперь о деле.

Короче я сделал вот так. Вот весь код:
PHP:
$filtr_query="SELECT * FROM zayavka where 1=1";
 $count_post=count($_POST);
  if ($count_post>0)
 {

   foreach ($_POST as $key => $value) {

         if ($value!="")
          {
            $filtr_query=$filtr_query." and ".$key." = '".$value."'";
          }
        }


  }

  else
  {

   $filtr_query=$filtr_query." and status!='завершена'";

  }
 
 $zayavkaq = mysql_query($filtr_query);
Нужна критика. Я какой то подвох чувствую и уже один минус нашел, интересно что Вы, господа, скажете.

-~{}~ 16.01.08 02:32:

Кстати интересно что FractalizeR бы сказал..
 

FractalizeR

Новичок
Если бы PHP не заменял в именах параметров все пробелы на подчеркивания, можно было бы в качестве $key указать что-то вроде

Код:
1; DELETE FROM zayavka; #
Сейчас значение $value не фильтруется, поэтому это место для SQL Injection и тоже самое можно проделать тут. Думаю, если $key и $value засунуть в mysql_real_escape_string, опасность сильно сократится.

Но все равно не сильно мне нравится, что имя поля передается с клиента для подстановки в запрос...

Кстати, вместо "1=1" можно просто написать "1". Этого достаточно.
 

Фанат

oncle terrible
Команда форума
FractalizeR
$key засовывать в mysql_real_escape_string бесполезно

-~{}~ 16.01.08 12:24:

надо заранее составить список имен полей в массиве (или получить автоматом из БД, кстати!)
и внутри цикла делать проверку $key по нему.
 

Руслан

Новичок
Ф а н а т
FractalizeR
Собственно этот минус я и имел виду.. Но если исключить union при проверке то как мне кажется остальные изыски злоумышленика не поимеют полезного результата.. если я ошибаюсь поправьте..


FractalizeR Даже если бы не заменял (хотя заменяет), то получилось бы:

SELECT * FROM zayavka where 1=1 and 1; DELETE FROM zayavka; #

И что бы это дало? Без union ничего..
а union я и так везде фильтрую. Поэтому что через параметр, что череззначение нджекшин реален при использовании union который надо фильтровать.. А если не фильтровать, так его и через любой id можно осуществить.. Поэтому не знаю насколько это можно назвать минусом.. я считаю минус имено в том что человек просто будет знать имена полей.. и если даже не в этом скрипте а в каком нибудь другом получит возможность таки осуществить инъекцию, то подбирать имена столбцов в таблице ему уже не надо будет.. но опять же это не такой большой минус потому как подобрать обычно труда не составляет..

Что думаете по этому поводу?


Автор оригинала: *****
надо заранее составить список имен полей в массиве (или получить автоматом из БД, кстати!)
и внутри цикла делать проверку $key по нему.
Для чего? Что бы исключить то о чём мы говорили выше? стоит ли? Это серьезный вопрос, хочется разобраться с фильтрами рази навсегда. =)
 

FractalizeR

Новичок
SELECT * FROM zayavka where 1=1 and 1; DELETE FROM zayavka; #
И что бы это дало? Без union ничего..
Действительно, ничего. В MySQL расширении отключено выполнение нескольких операторов в одном вызове mysql_query. Но тем не менее, привыкать к этому не нужно. Если бы такое исполнение было бы разрешено (оно разрешено в MySQLi), второй DELETE стер бы все записи из таблицы zyavka. Т.е. внешний пользователь смог бы исполнить на вашей базе данных любой оператор. Вам это надо? :)

Что касается предложения Ф_а_н_а_т_а - я с ним согласен. Делать это нужно примерно так:
PHP:
$requiredFields = array ('login', 'password1', 'password2', 'email1', 'email2', 'firstname', 'country', 'language' );

$filtr_query="SELECT * FROM zayavka where 1 "; 

foreach ( $requiredFields as $fieldToCheck ) {
  if (! isset($_POST [$fieldToCheck])) {
    die("Required field $fieldToCheck is not set!");
  }

  if (empty($_POST [$fieldToCheck])) {
    die("Required field $fieldToCheck is not given a value!");
  }

    $filtr_query=$filtr_query." and ".$fieldToCheck." = '".mysql_real_escape_string($_POST[$fieldToCheck])."'"; 
}
 

Руслан

Новичок
FractalizeR
Спасибо.. Наверное сейчас так и сделаю..

Ф ан а т
Взрослый ты наш...

Ладно. Всё. Всем спасибо.
С фиьтром разобрались.
 

Руслан

Новичок
Ф а н а т
Гы гы.. а я трахаюсь хорошо =) - подруга говорила.
Не ругайся - не всем же быть такими крутыми программерами. Каждому своё. У меня вот например предприятие своё. Я по штату не программер. Просто хобби у меня такое, призвание что ли..

P.S. Гуру, я не ламер.

-~{}~ 17.01.08 02:48:

P. S. 2 Закрываем тему - оффтоп пошел.
 

Фанат

oncle terrible
Команда форума
какой фонтан оправданий. и все мимо.
бизнесмен с большим... хобби. все у человека хорошо. вот только призвание беспокоит.

ламер - это не сколько человек знает. а сколько он хочет учиться.
пока на блюдечке не принесли готовый код - мы важно и, главное - всерьёз! - рассуждали о вреде, который может принести ошибка! Не о том, как её исправить! а о том, что вреда будет немного. при этом реального понимания, разумеется - ноль. бред про то, что в запросе SELECT * FROM zayavka where 1=1 and 1; DELETE FROM zayavka; есть какой-то union. и что этот union фильтруется.

Поэтому что через параметр, что череззначение нджекшин реален при использовании union который надо фильтровать.. А если не фильтровать, так его и через любой id можно осуществить..
Где ты этого бреда набрался? Подруга говорила?
 

Руслан

Новичок
Ф а н а т
Хм.. Вызывает улыбку..
Либо ты не понял о чем я говорю либо лыжи не едут.. ладно попробую найти общий язык.

Я сказал:
"Даже если бы не заменял (хотя заменяет), то получилось бы:

SELECT * FROM zayavka where 1=1 and 1; DELETE FROM zayavka; #

И что бы это дало? Без union ничего..
а union я и так везде фильтрую. "

Что это значит.. Это значит что если ввести в параметр "1; DELETE FROM zayavka;" то получится:
SELECT * FROM zayavka where 1=1 and 1; DELETE FROM zayavka;
Но это ничего недает потому что мускул не выполнит этот запрос. А если ввести :1 union DELETE FROM zayavka/*, то получится SELECT * FROM zayavka where 1=1 and 1 union DELETE FROM zayavka/* ... и такой запрос уже имеет все шансы выполниться. а что бы этого не произошло я и фильтрую везде union.. Что непонятно? Или опять что то не так, господин Ф а н а т?
 

Фанат

oncle terrible
Команда форума
слушай, зачем тебе это?
зачем ты, оправдывая одну сказанную тобой глупость, тут же говоришь другую?

Все твои рассуждения строятся на страшном слове юнион, а вся защита - на его фильтрации.
Это идиотизм. Я просто офигеваю, какие только поверья не бытуют среди ламеров. Хуже бабок у подъезда - честное слово.

http://phpfaq.ru/slashes
по прочтении доложить и изложить кратко усвоенный материал и свои ошибки.
 

Руслан

Новичок
Ф а н а т
Ну что ты ей богу меня не дооцениваешь я же про слешевание уже писал в том посте где:

"Я сначала пишу код, а потом перечитываю его и ввожу все проверки, слешевание и т.д. "

По поводу слешевания это помоему известно каждому начинающему программеру. Просто я всё же считаю что плюс к этому юнион отрубить - милое дело..
Такой подход. Я юнион всё равно не использую. И чо? Что плохого в том что я рублю юнион.. и при чем здесь бабушки у подъезда?
 

Фанат

oncle terrible
Команда форума
при том, что бакуи верят, будто если черная кошка дорогу перейдет, то удачи не будет.
у тебя - то же самое:
инджекшин реален при использовании union который надо фильтровать.. А если не фильтровать, так его и через любой id можно осуществить..
НЕ НУЖНО его фильтровать. это на редкость дурацкая идея - делать базу данныз, которая неможет хранить определенные слова.
для защиты БД надо совершеть простые, вполне определенные действия.
а не шаманские пляски, вырезая совершенно невинные слова.

Ито, что ты говоришь, что юнион не используешь, только говорит о том, что ты так ничего и не понял.поскольку даже при использовании юниона, он НИКОГДА не передается через браузер пользователя.
 

Руслан

Новичок
Автор оригинала: Ф а н а т
Ито, что ты говоришь, что юнион не используешь, только говорит о том, что ты так ничего и не понял.поскольку даже при использовании юниона, он НИКОГДА не передается через браузер пользователя.
О.. это уже интересно.. Как это не передается? А как я делал инъекции на сайтах когда проверял на ошибки? При отсутствии слешевания вводил в строку адреса напрямую такое значения например id:
9999999999999+union+select+1,2,3,4,user,6,version(),8,9,10,11,12,13,14,15,16+from+users/*

Вводил через браузер.. инъекция прекрассно получается.. Или ты насчет браузера что то другое имеешь ввиду? В моем случае что то подобное можно было бы сделать если бы была ошибка в слешевании, только через пост а не в строку адреса.. подготовить форму. Почему нет? Почему не передастся.. Я не говорю что я крут и во всё м шарю.. но наверно мы всё таки не поняли друг друга.
 

Beavis

Banned
Автор оригинала: Руслан
При отсутствии слешевания вводил в строку адреса напрямую такое значения например id:
9999999999999+union+select+1,2,3,4,user,6,version(),8,9,10,11,12,13,14,15,16+from+users/*
теперь сделал слешевание? больше инъекцию не сделаешь? а юнион зачем фильтровать?
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху