Оцените идеи валидации данных поступающих от пользователя.

Bermuda

Новичок
tf
Лично я из того что ты написал вообще ничего не понял.
Ты боишься того, что пользователь догадается что в параметре
login_user_6be920966072470cb659cb74478888dd приложение ожидает получить данные которые будут являться именем пользователя, а в параметре password_pass_b659cb74478888dd6be920966072470c приложение ожидает получить пароль, то твои опасения ненапрасны -- как не шифруй -- пользователь догадается. Если ты говоришь о каком-то гипотетическом взломе, то пример алгоритма в студию.
 

tf

крылья рулят
ничего не боюсь
коротко и ясно:
против загнания логики в представление
 

Bermuda

Новичок
Я не аргументирую за то, что нужно загонять данный функционал в представление, но также я не вижу никаких аргументов против того, чтобы именно так и сделать.
tf
против загнания логики в представление
А почему? Религия не позволяет? :) Можешь аргументировть почему ты против?
 

tf

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

crocodile2u

http://vbolshov.org.ru
Bermuda
Представим ситуацию:

Из определенного поля должна прийти строка. Имеется два типа строк String и Email. String - просто строка, Email - должен быть мыльным адресом.

Ты делаешь в своей форме инпут и даешь ему имя:

Email_UserEmail_SuperDigitalSignature.

А злоумышленник формирует пост-запрос, в котором "Email_UserEmail_SuperDigitalSignature" подменено именем
"String_UserEmail_SuperDigitalSignature".

В результате приложение не обрабатывает полученную строку как email и мы получаем не то, на что рассчитывали.
 

tf

крылья рулят
Bermuda
хотелось бы узнать как производиш конвертацию даты в необходимый формат
и как поступаеш с ARRAY. какнибуть конвертирует на выходе или так и выкидываеш (array)ARRAY
 

zarus

Хитрожопый макак
PHP:
// Проверки
  function filter_input($txt,$key=0,$par=false) {
// даннаяч функция целиком сперта из мана по пхп
    $search = array ("'<"."script[^>]*?".">.*?<"."/script".">'si",  // Вырезает javaScript
                     "'<[\/\!]*?[^<>]*?>'si",           // Вырезает HTML-теги
                     "'([\r\n])[\s]+'",                 // Вырезает пробельные символы
                     "'&(quot|#34);'i",                 // Заменяет HTML-сущности
                     "'&(amp|#38);'i",
                     "'&(lt|#60);'i",
                     "'&(gt|#62);'i",
                     "'&(nbsp|#160);'i",
                     "'&(iexcl|#161);'i",
                     "'&(cent|#162);'i",
                     "'&(pound|#163);'i",
                     "'&(copy|#169);'i",
                     "'&#(\d+);'e");                    // интерпретировать как php-код

    $replace = array ("",
                      "",
                      "\\1",
                      "\"",
                      "&",
                      "<",
                      ">",
                      " ",
                      chr(161),
                      chr(162),
                      chr(163),
                      chr(169),
                      "chr(\\1)");

    return preg_replace($search, $replace, $txt);
  }
  function filter_html($str,$key=0,$par=false) {
    return htmlspecialchars($str,ENT_QUOTES,'cp1251');
  }
  function reduce_length($str,$key=0,$par=false) {
    if ($par) {
      return substr($str,0,$par-1);
    }
    return $str;
  }
  function make_integer($str,$key=0,$par=false) {
    return intval($str);
  }
  function make_float($str,$key=0,$par=false) {
    return floatval($str);
  }

  function validate_post($_NOT_EMPTY,$_VALS,$valid_admin) {
    global $_POST;
    global $_ADM_ERRORS;

    if (empty($_POST)) {
      return true;
    }
    foreach ($_VALS as $_KEY=>$_VAL) {
      foreach ($_VAL as $k=>$v) {
        $_is_array = is_array($_POST[$k]);
        if (!$_is_array) {
          $temp = $_POST[$k];
          unset($_POST[$k]);
          $_POST[$k][] = $temp;
        }
        if ($_KEY == 'untag') {
          array_walk_recursive($_POST[$k],'filter_input');
        }
        elseif ($_KEY == 'text') {
          if (!$valid_admin) {
            array_walk_recursive($_POST[$k],'filter_html');
          }
          array_walk_recursive($_POST[$k],'addslashes');
        }
        elseif ($_KEY == 'int') {
          array_walk_recursive($_POST[$k],'make_integer');
        }
        elseif ($_KEY == 'float') {
          array_walk_recursive($_POST[$k],'make_float');
        }
        if (!empty($v)) {
          array_walk_recursive($_POST[$k],'reduce_length',$v);
        }
        if (!$_is_array) {
          $temp = $_POST[$k][0];
          unset($_POST[$k][0]);
          $_POST[$k] = $temp;
        }
      }
    }
    foreach ($_NOT_EMPTY as $k=>$v) {
      if (empty($_POST[$v])) {
        errors_add('','Не заполнено поле "'.$k.'"');
      }
    }
    if (!empty($_ADM_ERRORS)) {
      return false;
    }
    return true;
  }
// Прямое задание переменных к фильтрации
  $_NOT_EMPTY = array(
                 'Заголовок новости'=>'hdr',
                 'Текст новости'    =>'text',
                );
  $_VALS = array(
                 'untag' => array('hdr'=>0),
                 'text'  => array('hdr'=>255,'text'=>10240),
                 'int'   => array('type'=>0,'userid'=>0,'active'=>0),
                 'float' => array(),
           );
// Вызов, $valid_admin = true | false
validate_post($_NOT_EMPTY,$_VALS,$valid_admin);
Только не трите, мне нужен совет, что сюда можно добавить? И стоит ли это загонять в классы?
p.s. 2Фанат (только это хоть в корзину не кидай) :)
 

tf

крылья рулят
dzarus первое что приходит в голову.
лишния шизофрения не повредит)
PHP:
$tag='script';
$value=preg_replace(array("'<[\s]*{$tag}([^>]*?)>'si","'<[\s]*/[\s]*{$tag}([^>]*)?>'si"),array("&lt;{$tag}\$1&gt;","&lt;{$tag}\$1&gt;"),$value);
будет время еще бедет)
я за классы
 

Mixailo

Guest
Слушайте, господа...

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

Вы же точно знаете, какого типа переменные хотите получить от юзера. Зачем вы отдаете на клиентскую часть это определение типа? Делайте его в скрипте, а чтобы вам "[]" не подставили - попробуйте settype - глядишь и поможет)
 

tf

крылья рулят
$value=htmlspecialchars($value);
Mixailo топик с самого начала читал? если да то обращайся пжл к тому кому твое выражение относится
 

tf

крылья рулят
zerkms извечная проблема '<input type="text" name="user">' мы своими руками будем?
да и <form> тоже
PHP:
"много я смотрел на чужие обработчики форм. то нехватет возможностей. то переменные не так называются"C
бумаю много кто может под этими словами подписатся
 

master_x

Pitavale XXI wieku
ребята, надо отделять мух от котлет, должен быть отрисовщик формы и валидатор, отдельно.
 

tf

крылья рулят
а оно и есть отдельно отделная функция вывода отдельная ввода/валидации
 

zerkms

TDD infected
Команда форума
zerkms извечная проблема '<input type="text" name="user">' мы своими руками будем?
да и <form> тоже

"много я смотрел на чужие обработчики форм. то нехватет возможностей. то переменные не так называются"C
тогда твоя тема называется совсем некорректно...

со своей стороны предложу смотреть в сторону PEAR_htmlquickform
 

Demetrius

Новичок
Согласен, что мухам и котолетам в одной тарелке - не место. Мой класс работает так:
PHP:
// создаём объект (имя, кнопка_submit [, action_формы [, method_формы [, способ_вёрстки]]])
$form_register=new TForm("register","Зарегистрироваться");

// конфигурация - проверять пароли на совпадение
$form_register->set_config("check_passwords_identity",true);

// создаём скрытые поля, например для перехода к нужному разделу сайта через единую точку входа
$form_register->push_hidden("content","register");

// создаём поля данных (имя, тип_поля_данных, тип_содержания_(для_проверки), описание, параметры_для_HTML [, значение])
$form_register->push_input("login",    "text",    "login",   "Логин",         "size=30&maxlength=20");
$form_register->push_input("password", "password","password","Пароль",        "size=30&maxlength=20");
$form_register->push_input("password2","password","password","Ещё раз пароль","size=30&maxlength=20");
$form_register->push_input("mail",     "text",    "email",   "E-mail",        "size=30&maxlength=50");
$form_register->push_input("name",     "text",    "text",    "ФИО",           "size=30&maxlength=50");

// если форма была показана        проверяем валидность
if($form_register->check_seen() && $form_register->validate())
  { // тут болванки
  // обновляем базу и т.п. 
  update_database($form_register->get_value("login"),
                  $form_register->get_value("password"),
                  $form_register->get_value("mail"),
                  $form_register->get_value("name"));
  // перезагружаем страницу
  refresh();
  }
// если форма не была показана или ошибка данных
else
  {
  // рисуем форму и сообщения об ошибках (автоматически)
  $form_register->draw();
  }
// убиваем объект
$form_register->destroy();
Валидатор проверяет post-данные в пхп, а при прорисовке формы автоматически выводится javascript, который тоже делает проверку полей данных в пределах возможностей javascript'а.
 

zarus

Хитрожопый макак
2Demetruis
А нужен ли по большому счету javascript при валидации данных? Хакеры обойдут.
+: сервер не будет лишние разы загружаться обработкой неверно введенных данных.
-: в этом случае размер странички вырастет (из-за вставок javascript), начнутся "потери" на сжатие и передачу...
Можно взглянуть на Ваш класс валидации целиком, если он не является коммерческим продуктом?
 

svetasmirnova

маленький монстрик
zarus
javascript не снижает нагрузки с сервера на обработку данных. javascript позволяет показать пользователю все его ошибки до перезагрузки страницы. Что делает интерфейс "юзабильней"
 

Demetrius

Новичок
svetasmirnova
Вот и я так подумал. При банальной ситуации, когда юзер должен ввести что-то, а вместо этого оставляет поле пустым, скрипт выводит alert и переставляет фокус на нужное поле. Проверка находится в функции submit'а перед отправкой данных. Фича в том, что этот скрипт генерит phpшный класс автоматически, вместе с html-кодом самого поля ввода.

zarus
Хакеры обойдут
Дык проверка javascript'ом не для хакеров, а для не очень понятливых юзеров. :)
Можно взглянуть на Ваш класс валидации целиком
Валидация - это не класс, а метод класса формы, который делает свои внутренние "формские" проверки, а также запускает функции валидации всех своих input'ов, которые уже проверяют данные на валидность (по типу, длине, формату).
Моя идея в том заключается, что я задаю все параметры формы в начале, а потом её проверяю, рисую и т.п., основываясь на этих зашитых параметрах. Если в процессе проверки отправленных данных (на сервере) где-то возникает ошибка, то она записывается в параметр класса по имени message и выводится вместе с формой методом draw, как видно из листинга (см. выше), да к тому же при этом сохраняются значения, введенные ранее, чтобы не переписывать заново.
 

zarus

Хитрожопый макак
maxlength официально еще не одобрена w3.org

Валидация - это не класс, а метод класса формы, который делает свои внутренние "формские" проверки, а также запускает функции валидации всех своих input'ов, которые уже проверяют данные на валидность (по типу, длине, формату).
То же самое я делаю у себя, но без классов. А вот с javascript можно помудрить, хотя для своего сайта пока не вижу смысла, так как это не форум, и данные вводятся очень и очень редко...
 
Сверху