Блог пользователя - Dеmimurych

Ошибка системы контроля FormApi для случая type= select свойство multiple без requered =true

7 декабря 2010 в 14:18

Актуально только для 5 ветки.
6 такой ошибки не содержит.

<?php
$options 
= array(1,2,3);
$form['some_select'] = array(
    
'#type' => 'select',
        
'#multiple' => true,
    
'#required' => false,
         
'#options'=> $options
    
);
?>

при комбинации параметров multiple = true, requared=false, и type=select - FormApi drupal 5 работает неправильно и позволяет передать абсолютно любой параметр через запрос пост.
т.е. FromApi не контролирует переданное значение на предмет входит ли значение в изначальный массив параметров.

Где это может быть опасно
Модуль taxonomy, словарь позволяет выбрать несколько терминов, но при этом выбор не является обязательным. Злоумышленник может в таком случае присвоить ноде абсолютно любой тег из любого словаря существующего в системе.

Решение проблемы - иметь свою функцию валидации для элемента select.

Друпал 6 не подвержен.

Дурпал кретинизмы ИЛИ в каких случаях может тормозить формирование ноды с большим количеством комментариев.

15 ноября 2010 в 21:44

Дано.
Intel(R) Xeon(R) E5310 с 8 гигабайтами оперативной памяти mysql оптимизирован таким образом чтобы вся индексная база была в оперативной памяти.

Сайт с активным комьюнити которое очень много комментирует.
(на тестовой платформе 520 000 комментариев)

Комментарии формируются с order COMMENT_ORDER_NEWEST_FIRST и mode отличным от COMMENT_MODE_FLAT_COLLAPSED СOMMENT_MODE_FLAT_EXPANDED

Выполнения запроса для ноды в которой 21,465 комментариев, длится 0.5 секунды, что чрезвычайно много учитывая конфигурацию сервера, и естественно его нагруженность.

Причина кроется в этом участке кода:

<?phpif ($order == COMMENT_ORDER_NEWEST_FIRST) {
                if ($mode == COMMENT_MODE_FLAT_COLLAPSED || $mode == COMMENT_MODE_FLAT_EXPANDED) {
                    $query .= ' ORDER BY c.cid DESC';
                } else {
                    $query .= ' ORDER BY c.thread DESC';
                }
            } else if ($order == COMMENT_ORDER_OLDEST_FIRST) {
                if ($mode == COMMENT_MODE_FLAT_COLLAPSED || $mode == COMMENT_MODE_FLAT_EXPANDED) {
                    $query .= ' ORDER BY c.cid';
                } else {

                    /*
                     * * See comment above. Analysis learns that this doesn't cost
                     * * too much. It scales much much better than having the whole
                     * * comment structure.
                     */

                    $query .= ' ORDER BY SUBSTRING(c.thread, 1, (LENGTH(c.thread) - 1))';
                }
            }?>

Друпал кретинизмы или функция drupal_to_js

14 мая 2010 в 13:01

До версии 5.2 в php не было нативной функции json_encode в силу чего, программистам приходилось писать свои велосипеды для реализации этого функционала.

Друпал не исключение.
Вот только непонятно с какого бадуна она делалась друпале.
Впрочем я допускаю что функцию намеренно создавали ограниченно корректной фор перфоманс изуе

Для тех кто хочет работающий json_encode для ВСЕХ случаев рекомендую обратить внимание на
http://pear.php.net/pepr/pepr-proposal-show.php?id=198

autocomplete в модуле users или друпал кретинизмы

10 марта 2010 в 17:02
 $matches = array();
  function user_autocomplete($string = '') {
  $matches = array();
  if ($string) {
    $result = db_query_range("SELECT name FROM {users} WHERE LOWER(name) LIKE LOWER('%s%%')", $string, 0, 10);
    while ($user = db_fetch_object($result)) {
      $matches[$user->name] = check_plain($user->name);
    }
  }

  drupal_json($matches);
}

Обращаем внимание на запрос
и видим что для поиска нужного имени используется оператор LIKE
при этом, автор этого куска кода, заворачивает данные в lower

на первый взгляд все верно - берется данные в нижнем регистре и берется имя в том же регистре и сравнивается like

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

LIKE использует регулярные выражения для поиска нужного результата а значит в нашем случае не зависит от регистра и с равным успехом найдет например Demimurych задав LIKE 'DeMiMU%' так и 'demimu%'

второй, при использовании LOWER, mysql не может использовать индекс по полю name как результат имей вы в базе хотябы 300 00 пользователей, вы получите выполнение запроса от 0.1 секунды до 2 и выше.

Решение это го кретинизма в переопределении пути
user/autocomplete

на свой колбэк с функцией

 $matches = array();
  function user_autocomplete($string = '') {
  $matches = array();
  if ($string) {