Збереження файлу, відправленого через POST-запрос

Комментарии ()
$uploaddir = _DIR.'path/';

if (move_uploaded_file($_FILES['img']['tmp_name'],$uploaddir.$_FILES['img']['name']))
{

 ...

} 

 


Читать далее

Стойкое хеширование в PHP на примере bcrypt

Комментарии ()

Стойкость паролей, который захешированы с помощью md5/SHA-1 оченень ненадежна. Для решения  пробемы безопасности, необходимо использовть "соль" и более стойкие алгоритмы хеширования, которые значительно увеличивают надёжность.

Функция bcrypt использует алгоритм, который работает настолько медленно, что рассчёт радужных таблиц и атаки методом перебора стали абсолютно неэффективными.  Для необратимого шифрования она использует алгоритм blowfish с множеством итераций, и работает очень медленно. Путём изменения количества итераций можно регулировать время, затрачиваемое на шифрования пароля, и найти такую «золотую середину», когда шифрование одного пароля будет достаточно быстрым, а подбор его станет бессмысленным.

В PHP есть встроенная функция crypt(), которая являюется реализацией адаптивной криптографической хеш-функции bcrypt. С версиях PHP 5.3 и выше функция crypt() имеет встроенную реализацию алгоритмов шифрования и больше не зависит от поддержки этих алгоритмов ОС. Она поддерживает различные алгоритмы (от DES до SHA-512) и выбирает алгоритм в зависимости от того, какая соль задаётся в качестве её параметра.

Ниже пример генератора соли. Будучи скормленной функции crypt() данная соль заставит её использовать blowfish с 10 в квадрате итерациями. Это задаётся идентификатором $2a$ (использовать bcrypt), и идущим затем количеством итераций, которые задаются как логарифм по основанию 2 (в данном случае это 210, то есть 1024 итераций). Увеличение параметра на единицу удваивает количество итераций, и следовательно время рассчёта функции.

// Генерируем соль
$salt = '$2a$10$'.substr(str_replace('+', '.', base64_encode(pack('N4', mt_rand(), mt_rand(), mt_rand(),mt_rand()))), 0, 22) . '$';
// Шифруем пароль с применением данной соли
$hashed_password = crypt($password, $salt);

 


Читать далее

Принудительное скачивание файла при клике на ссылку

Комментарии ()

В одном проекте возникла необходимость, что бы mp3 файл скачивался при клике на ссылку, но не у всех браузерах это срабатывало. Где-то скачивалось, где-то аудиофайл проигровался. Следующий код застваит браузер отдавать файл пользователю для сохранения на ПК

$file=$_SERVER['DOCUMENT_ROOT']."sermons_mp3/".$_GET['id'].".mp3";
header("Cache-control: private");
header ("Content-type: octet/stream");
header ("Content-disposition: attachment; filename=\"sermons.oleh-sj.km.ua-".$_GET['id'].".mp3\";");
header("Content-Length: ".filesize($file));
readfile($file);
exit;

 


Читать далее

Планируем недоступность(работы) веб-сервера

Комментарии ()

Страница с HTTP кодом 503

ob_start();
header('HTTP/1.1 503 Service Temporarily Unavailable');
header('Status: 503 Service Temporarily Unavailable');
header('Retry-After: 3600');
header('X-Powered-By:');
?>

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>503 Service Temporarily Unavailable</title>
</head><body>
<h1>Сайт временно недоступен</h1>
<p>Сайт временно недоступен в связи с техническими работами, проводимыми на сервере.
Пожалуйста посетите наш сайт позже.</p>
</body>
</html>

 


Читать далее

FireFox и крякозябра

Комментарии ()

Проявилось пока только в FireFox'е. Если выполнять POST запрос и выводить на страницу данные (исходники проекта в UTF-8) то будут крякозябры. Помогло только это:



header('Content-Type: text/html; charset=UTF-8');

Размещать нудно в самом начале php-файла


Читать далее

__call или вызов рутинных методов в движке

Комментарии ()

В каждом объекте, который работает с БД, плодятся методы, которые я называю рутинными. Примеров тьма: getLoginById, getIdByLogin, getAliasByName. getNameById и так далее. Поскольку практически суть везде одна и таже (выполнить select с некой таблицы БД по некому признаку и вернуть value) я утвердил в своем движке стандарт вызова метода __call

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

  • table - название таблицы по умолчанию, с которой брать данные. Значение задается в конструкторе класса.
  • fields_private - масив с перечнем названия полей, доступ к которым через метод __call нужно закрыть

public function __call($methodName, $args)

$methodName - название несуществующего метода, которого мы вызываем

$args - массив параметров:

первый параметр - значение поля, по которому ищем запись в БД

второй параметр - название таблицы, если нету - используется $call['table']

Пример

В классе User вызываем не существующий метод getEnableById - в даном случаи мне нужно получить значени поля enable из таблицы users по значению поля id. В классе задано свойсто   protected $call = array('table' => 'users', 'fields_private' => array()); 

На самом деле я создал метод   getEnableById только ради автодополнения в IDE. Также методы следует задавать явно, если необходимо выполнить дополнительные действия. В этом примере выполняется проверка на существование  $id (если отсутствует, тогда присвоить  $_SESSION['user']['id'])

 

 public function getEnableById($id = '')
    {
        if ($id == '')
        {
            $id = $_SESSION['user']['id'];
        }
        return parent::__call(__METHOD__, $id);
    }

 


Читать далее

Imagejpeg(): Filename cannot be empty

Комментарии ()

Заменить 

imagejpeg($new,"",100);

на

imagejpeg($new,NULL,100);

 


Читать далее

JQuery: ajax

Комментарии ()

Пример ajax'а на php & Javascript


Читать далее

Form - автодополнение

Комментарии ()

Автодополнение очень полезная и удобная фича. Дабы не плодить каждый раз рутинны по роботе с ней, в модуль Form добавлен функционал, поддерживающий ajax autocomplete на базе jQuery.

Каждое автодополнение характеризируется именем, и заранее описывается в form_get_autocomplete_ajax_post.php. Cам елемент ввода должен принадледать к классу autocomplete и иметь data-атрибут autocomplete-name который содержит имя автодополнения..

html

<input type="text" name="login" id="login" value=""   width="" style="" class="autocomplete" placeholder="введите Логин" data-autocomplete-name="users_login">

Требования к елементу ввода:

  • елемент ввода должен принадлежать к классу autocomplete ( class="... autocomplete ...")
  • Наличие атрибута  data-autocomplete-name c именем автодополнения

Пример использования

#elementInputText
$element = array(
    'attr' => array(
        'name' => null,
        'type' => 'text',
        'alias' => null,
        'value' => false,
        'disabled' => false,
        'placeholder' => null,
        'value' => null,
        'class' => 'autocomplete',
        'data' => array('autocomplete-name'=>'users_login')
    ),
    'group' => array(
        'help' => null,
        'help_type' => 'block',
        'label' => null
    )
);
$tpl->setVariable('elementName', $form->getElement($element));

Алгоритм работы

  • При вводе текста в елементе выполняется функция $(".autocomplete").autocomplete(файл system.js), которая выполняент ajax-запрос form_get_autocomplete_ajax.  Если ajax-запрос прошел успешно - мы видим варианты автодополнения. Передаються на сервер в запросе также все data атрибуты, в которых можно передать дополнительные параметры и использовать их
  • form_get_autocomplete_post.php - в целях безопасности, для каждого autocomplete описывается алгоритм выборки данных.

Читать далее

Form - сортировка

Комментарии ()

 

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

Как и фильтр, сортировка  характеризуется названием формы (для каждой формы своя сортировка $_SESSION['form_sort']['{name}']). Данные сортировки хранятся в сессии ($_SESSION['form_sort']['{name}']=array(key=>value), где key - название поля в таблице БД по которому необходимо сортировать,  value - принимает значение up или down, тем самым указывая порядок сортировки.), что дает возможность сохранять работоспособность сортировки, даже при перезагрузке страницы. 


Читать далее

Webit.in.ua 2013