$uploaddir = _DIR.'path/'; if (move_uploaded_file($_FILES['img']['tmp_name'],$uploaddir.$_FILES['img']['name'])) { ... }
$uploaddir = _DIR.'path/'; if (move_uploaded_file($_FILES['img']['tmp_name'],$uploaddir.$_FILES['img']['name'])) { ... }
Читать далее |
Стойкость паролей, который захешированы с помощью 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'е. Если выполнять POST запрос и выводить на страницу данные (исходники проекта в UTF-8) то будут крякозябры. Помогло только это:
header('Content-Type: text/html; charset=UTF-8');
Размещать нудно в самом начале php-файла
Читать далее |
В каждом объекте, который работает с БД, плодятся методы, которые я называю рутинными. Примеров тьма: getLoginById, getIdByLogin, getAliasByName. getNameById и так далее. Поскольку практически суть везде одна и таже (выполнить select с некой таблицы БД по некому признаку и вернуть value) я утвердил в своем движке стандарт вызова метода __call
Для начала договоримся, что в каждом классе, который унаследован от Core, должно присутствовать свойство $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); }
Читать далее |
Автодополнение очень полезная и удобная фича. Дабы не плодить каждый раз рутинны по роботе с ней, в модуль 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">
Требования к елементу ввода:
Пример использования
#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));
Алгоритм работы
Читать далее |
При выводе информации, кроме постраничной навигации и фильтрации информации, есть необходимость в сортировке данных, для удобного поиска записей.
Как и фильтр, сортировка характеризуется названием формы (для каждой формы своя сортировка $_SESSION['form_sort']['{name}']). Данные сортировки хранятся в сессии ($_SESSION['form_sort']['{name}']=array(key=>value), где key - название поля в таблице БД по которому необходимо сортировать, value - принимает значение up или down, тем самым указывая порядок сортировки.), что дает возможность сохранять работоспособность сортировки, даже при перезагрузке страницы.
Читать далее |
Webit.in.ua 2013