Установка защиты на страницу используя MySQL и PHP


Оглавление (нажмите, чтобы открыть):

HTTP Установка защиты на страницу используя MySQL и PHP.

Это — обучающая программа которая должна вам показать основы защищиты ваших страниц в сети, использующие HTTP аутентификацию. Вместо традиционного .htaccess метода ( Apache сервер), мы собираемся использовать для хранения данных о пользователях и их пароли в MySQL. Я постараюсь максимально разжевать все на, что по моему разумению требуется для начинающего изучать MySQL и PHP. В принципе на основе этой проги вы можите использовать любой DBMS (система управления базы данных). Почему интересен этот метод? Ну например хотя бы потому что, если Вы используете базу данных, вы можите с легкостью разрешить, только определенной группе (человеку) иметь определенныйе права для доступа к той или иной информации. Если Вы используете традиционный .htaccess метод Апач, Вы должны вручную добавлять пользователей и пароль в файле пароля. А приимущество данного метода, ну. взгляните сами.
Программное обеспечение которое необходио:

· *nix платформа (Linux, Unix, *BSD) · PHP 3.0.x или PHP 4.x · MySQL (любая версия)

— Вперед, первое что надо это выяснить что мы хотим позволить пользователям, которые находится в нашей базе данных, чтобы получить доступ к указанной странице? И как мы собираемся это сделать? ( многим не очень нравится, но надо привыкать перед программированием брать бумажку и записывать все требования, которые мы хотим получить от проги, в перспективе вы сэкономите часы а может дни, для внесения изменений в код (прим.))

  1. Проверить, заверен ли пользователь уже.
  2. Если нет, отправить сообшение в броузер, с сообщением и формой для доступа.
  3. Если пользователь княпает на кнопку отмены, не позволить ему доступ и переадресовывать его идти на. 403: Доступ отвергнут, или показать (кукиш J ) простое сообщение.
  4. Если пользователь заполнил username и комбинацию пароля, проверьте их в MySQL базе данных и удостоверятся, что они верны, при положительном исходе разрешить доступ.

Если Вы не поняли все не волнуйтесь, станет ясно позже (а может никогда)!

Шаг Два — Создаем Нашу Базу данных

Мы хотим, чтобы база данных хранила имена (login) и пароль наших пользователей. Требуемые поля могут легко быть добавлены к существующей базе данных, но мы предположим пока, что Вы не добавляете к уже имеющейся базе а создаете новую. Следующий код это описание того как это сделать. Предположение если у вас на компе стоит Апач совсем что надо, можете немедленно приступить : )

mysql> create database members;
mysql> create table users (
username varchar(25) NOT NULL,
password varchar(15) NOT NULL,
primary key (username),
unique username (username)
);

Мы теперь имеем базу данных, чтобы хранить в ней пользователей, она предполагает, что username до 25 знаков, и пароли до 15 знаков. (если вам по каким-то причинам не подходит, установите как посчитаете Нужным) Username должен иметь значение «первичный ключ» и быть «уникальным», так как мы не хотим чтоб 2 или больше людей имели одинаковый username.
Пожалуйста обратите внимание, что usernames будет чувствитен к следующему случаю, пользователь ‘Vasya’ будет идентифицирован другим, нежели пользователь ‘vasya’, проще говоря чувствителен к регистру. Теперь мы добавим в MySQL тестового пользователя, чтобы использовать его дянные для тестов, когда мы создадим PHP страницу.

mysql> grant select on members.users
to httpuser@localhost
identified by ‘MyPassword’;

Это для того чтоб, когда мы хотим проверить пользователя и пароль, человека зарегистрировавшегося в нашей базе данных, мы будем использовать пользователя «httpuser» с паролем «MyPassword». Наконец мы должны добавить логин и пароль человека, которому мы хотим позволить доступу .

mysql> insert into users value(‘john_doe’, ‘eod_nhoj’);

Я сознательно в проге не шифровал данные, для того, чтоб в случае утери пароля не дешифровать его, и упростить до минимума получения оного : )) Все, с MySQLпокончено теперь идем дальше!

Шаг Три — пишем PHP код.

Прежде, чем мы начинаем, я опишу в кратце то, что будет делать пага. Когда Вы попадете на защищенную страницу то сервер пошлет запрос и выведет страницу для введения имени и пароля. Если вы нажмете на кнопку отмены или введете не правельные данные то сервер отправит вам ( 401 Неправомочный удар головой, и будет отрицать доступ. ) — так переводит промпт обычно строку (401 Unauthorized header, and deny access) не буду пояснять по моему лучше не скажешь. При случае если вы все введете как надо, то окажется что просто напросто вы получите доступ (то что и требовалось доказать) Теперь самое веселое, это и есть тот самый код. Он написан сознательно с номерами строк, после кода (внизу) даны пояснения к строкам.

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

В этой секции мы быстро исследуем каждую линию, чтоб предупредить зарание пылкий обмен вопросами в коментариях к данной статейке.

Строка 3:
Эта функция покажет сообщение, если «злой юзер» упорно будет вводить левые данные. Я сделал это функцией, потому что используем ее дважды, и просто чтоб сократить исходный код.
Строка 7:
Так как мы используем этот заголовок тоже дважды я также сделал это функцией.
Строка 8:
Передать броузеру заголовок, который заставит таки юзера ввести логин и пароль. Переменная $title будет показана в login диалоге.
Строка 9:
При первом запросе выводится заголовок при повторной отмене выводит сообщение о запрете доступа.
Строка 12:
$PHP_AUTH_USER цикл который выводит сообщение о том что мол пага защищена, и убирайся вон!
Строка 19-23:
Это то что кроме вас никто не знает, то есть средства для коннекта с базой данных, имя хоста, имы базы, имя юзера, и пароль. (для соеденения с MySQL)
Строка 24:
Запрос к MySQL который возвращает имена и пароли.
Строка 25:
Установить связь с MySQL и вывести ругательство если связи не будет. (это значит что у вас что-то не то в строках 19-23, или вообще нет MySQL)
Строка 27:
Обработать $query. Если возвращет — 0, это означает, что была введена недействительная комбинация.
Строка 33:
Разъединить соеденение с MySQL.

Безопасность

Во всем мире в аэропортах можно найти лозунг «Security is not a joking matter» (Безопасность — прежде всего). Такой же лозунг каждый системный администратор должен был бы закрепить рядом со своим сервером PHP. А любой, кто подключается к серверу, находящемуся в Интернете, должен принимать надлежащие меры защиты или рисковать потерей данных и даже денег из-за того, что злонамеренные взломщики программного обеспечения сумеют нанести ущерб, пользуясь клавиатурой своего компьютера.

Разработчик сайта, озабоченный проблемами защиты, обязан постоянно повторять: «Не доверяйте сети». Если вы беспокоитесь о защите своего сайта, повторяйте это высказывание, разрабатывая код будущих страниц сайта. Любая информация, передаваемая на сервер по сети (будь то URL, данные из формы HTML или данные, поступающие через какой-то другой сетевой порт), должна рассматриваться как потенциально опасная. В настоящей статье предложено несколько методов, позволяющих обезопасить поступающую информацию. Необходимо не только применять эти методы, но и уделять определенное время для того, чтобы обнаружить другие потенциальные опасности и найти способы их предотвращения.

Вторым эмпирическим правилом создания защищенного сайта является следующее: «Минимизируйте ущерб». Что будет, если написанная вами программа, которая, по вашему мнению, является вполне надежной, фактически окажется уязвимой? Даже просто для того, чтобы оставаться в полной безопасности, ограничивайте ущерб, который мог бы нанести нарушитель, воспользовавшись этой уязвимостью.

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

Но все эти соображения не должны препятствовать вашим намерениям, например, касающимся вывода своего сайта электронной коммерции в оперативный режим.

Возможные нападения

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

Обычно хакерами называют тех, кого было бы правильнее назвать взломщиками программной защиты. В компьютерном сообществе взломщиками защиты называют специалистов, которые, пользуясь удачным стечением обстоятельств или своими навыками, преодолевают защиту компьютерных систем и наносят ущерб. А хакеры — это программисты, умеющие виртуозно составлять программы и способные не только разбираться в сложном коде, но и самостоятельно писать эффективный (и часто недоступный для понимания посторонних) код на многих языках. Для программиста приобретение звания хакера является честью, а звание взломщика программного обеспечения, по-видимому, означает, что его владелец должен следить за заметками в рубрике «Разыскивается».

Мастер Йода рекомендует:  Луковое ПО используем TOR для анонимного парсинга

Не понимая того, насколько унизительным является звание взломщика программного обеспечения, многие начинающие программисты вступают на эту стезю, прибегая к использованию инструментальных средств и сценариев, которые они находят в веб. Таких начинающих взломщиков называют script-kiddie или по нашему кулхацкерами. Эти люди часто сами почти не понимают, что они делают. Обычно именно такая категория нарушителей стоит за примитивными атаками, такими как компрометация сайта, XSS и SQL-инъекции.

Компрометация сайта и атаки XSS

Случаи компрометации сайта, которые чаще бывают в большей степени неприятными, чем действительно вредными, довольно распространены, поскольку многие сайты открывают для взломщика программной защиты возможность объявить всему миру о том, что он сумел добиться своей цели. Для компрометации неправильно спроектированного веб-сайта иногда достаточно воспользоваться одним лишь веб-браузером. Рассмотрим, например, следующую программу:

Страница с простой формой добавления комментариев

Эта программа реализует систему комментариев в очень примитивной форме (если вы изучаете мое руководство по PHP с начала, то возможно вы еще не знакомы с операциями работы с базами данных; если это так, то рекомендую вам вернуться к этой статье после ознакомления с соответствующим материалом по MySQL).

Читая этот код, опытный программист начинает чувствовать себя не совсем уверенно (помните — «Не доверяйте сети»). Такая программа принимает данные формы, которые, согласно ожиданиям, должны содержать текст комментария. Этот текст присваивается переменной $comment и сохраняется в базе данных для отображения перед следующими посетителями. Если введенные данные будут такими, какие мы ожидаем, то проблемы не возникнут.

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

PHP: PDO быстрый старт, работа с MySQL

Содержание:

PDO (PHP Data Objects) — расширение PHP, которое реализует взаимодействие с базами данных при помощи объектов. Профит в том, что отсутствует привязка к конкретной системе управления базами данных. PDO поддерживает СУБД: MySQL, PostgreSQL, SQLite, Oracle, Microsoft SQL Server и другие.

Официальный мануал по PHP PDO здесь . Там же можно найти и сам класс PDO .

Почему стоит использовать PDO

Функции mysql в PHP для работы с БД давно уже устарели, на сегодняшний день желательно использовать mysqli или PDO (PHP Data Objects). Кроме того, mysqli — эта библиотека, которая по большому счёту, не предназначена для использования напрямую в коде. Она может послужить хорошим строительным материалом для создания библиотеки более высокого уровня. При работе с mysqli следует также помнить об обеспечении безопасности вашего приложения, в частности о защите от SQL-инъекций. В случае использования PDO (с его подготовленными запросами), такая защита идёт уже «из коробки», главное правильно применить необходимые методы.

Тестовая база данных с таблицей

Установка PDO

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

Соединение с базой данных

Соединения устанавливаются автоматически при создании объекта PDO от его базового класса.

При ошибке подключения PHP выдаст ошибку:

В этом примере подключения мы используем конструкцию try. catch . Многие спорят о целесообразности её использования. Лично я использую try. catch , она мне не мешает.


Подготовленные и прямые запросы

В PDO два способа выполнения запросов:

  • Прямой — состоит из одного шага;
  • Подготовленный — состоит из двух шагов.

Прямые запросы

  • query() используется для операторов, которые не вносят изменения, например SELECT . Возвращает объект PDOStatemnt , из которого с помощью методов fetch() или fetchAll извлекаются результаты запроса. Можно его сравнить с mysql resource , который возвращала mysql_query() .
  • exec() используется для операторов INSERT, DELETE, UPDATE . Возвращает число обработанных запросом строк.

Прямые запросы используются только в том случае, если в запросе отсутствуют переменные и есть уверенность, что запрос безопасен и правильно экранирован.

Подготовленные запросы

Если же в запрос передаётся хотя бы одна переменная, то этот запрос в обязательном порядке должен выполняться только через подготовленные выражения . Что это значит? Это обычный SQL запрос, в котором вместо переменной ставится специальный маркер — плейсхолдер. PDO поддерживает позиционные плейсхолдеры ( ? ), для которых важен порядок передаваемых переменных, и именованные ( :name ), для которых порядок не важен. Примеры:

Чтобы выполнить такой запрос, сначала его надо подготовить с помощью метода prepare() . Она также возвращает PDO statement , но ещё без данных. Чтобы их получить, надо исполнить этот запрос, предварительно передав в него наши переменные. Передать можно двумя способами: Чаще всего можно просто выполнить метод execute() , передав ему массив с переменными:

Как видно, в случае именованных плейсхолдеров в execute() должен передаваться массив, в котором ключи должны совпадать с именами плейсхолдеров. После этого можно извлечь результаты запроса:

ВАЖНО! Подготовленные запросы — основная причина использовать PDO, поскольку это единственный безопасный способ выполнения SQL запросов, в которых участвуют переменные.

Получение данных. Метод fetch()

Мы уже выше познакомились с методом fetch() , который служит для последовательного получения строк из БД. Этот метод является аналогом функции mysq_fetch_array() и ей подобных, но действует по-другому: вместо множества функций здесь используется одна, но ее поведение задается переданным параметром. В подробностях об этих параметрах будет написано в другой заметке , а в качестве краткой рекомендации посоветую применять fetch() в режиме FETCH_LAZY

В этом режиме не тратится лишняя память, и к тому же к колонкам можно обращаться любым из трех способов — через индекс, имя, или свойство (через -> ). Недостатком же данного режима является то, что он не работает с fetchAll()

Получение данных. Метод fetchColumn()

Также у PDO statement есть метод для получения значения единственной колонки. Очень удобно, если мы запрашиваем только одно поле — в этом случае значительно сокращается количество кода:

Получение данных. Метод fetchAll()

PDO и оператор LIKE

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

Здесь может вознинуть проблема! Поиск может не работать, потому как из базы у вас приходят данные в неправильной кодировке. Необходимо добавить кодировку в подключение, если она там не указана!

PDO и оператор LIMIT

Важно! Когда PDO работает в режиме эмуляции, все данные, которые были переданы напрямую в execute() , форматируются как строки. То есть, эскейпятся и обрамляются кавычками. Поэтому LIMIT . превращается в LIMIT ’10’, ’10’ и очевидным образом вызывает ошибку синтаксиса и, соответственно, пустой массив данных.

Решение #1 : Отключить режим эмуляции:

Решение #2 : Биндить эти цифры через bindValue() , принудительно выставляя им тип PDO::PARAM_INT :

PDO и оператор IN

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

Добавление записей

Изменение записей

Удаление записей

Использование транзакций

Важно! Транзакции в PDO работают только с таблицами InnoDB

В данной заметке мы познакомились с основными понятиями PDO, его установкой, подключением к БД и самые простые возможности выборки, изменения и удаления данных. В следующих заметках мы рассмотрим ещё несколько тем, касающихся PDO.

Защита от взлома

04.05.2015, 13:11

Защита WP от взлома
Как защитить сайт на WP от взлома?

Защита от Взлома
У меня есть программа,которую можно взломать разными Программами для взлома, Я хочу сделать.

Защита от взлома
Помогите организовать защиту от взлома. Слышал что можно в input’ах вводить sql код.Если это.

Защита от взлома
Имеется простенький скрипт реги&авториз нужно: «обработка всех переданных через форму данных.

Защита локального ПО от взлома
Хочу попробовать создать программу обмена мгновенными сообщениями с поддержкой шифрования (просто.

04.05.2015, 13:23 2 04.05.2015, 13:46 [ТС] 3 04.05.2015, 13:53 4
04.05.2015, 13:53
04.05.2015, 14:01 5

Решение

04.05.2015, 14:29 [ТС] 6
04.05.2015, 14:46 7
04.05.2015, 15:56 [ТС] 8

0) <
header(‘Location: /pay-error/’);
exit();
>
else <
$AddMoneys = $UserMoney + $amout;
$UpdateBalacne = mysql_query(«UPDATE `users` SET `money`=’$AddMoneys’ WHERE `steam_ «)or die(mysql_error());
$UpdateHistory = mysql_query («INSERT INTO user_money (user_id,username,ip_users,chet,date_n,date_p,sposob,status,money) VALUES (‘$uid’, ‘$users’,’$ip’,’$chet’,’$nachalo’,’$TODAY’,’$sposob’,’$status’,’$amout’)»)or die(mysql_error());
if(isset($UserRefer)) <

if($UserRefer != $UserUID) <
$BonustUser = mysql_query(«SELECT * FROM `users` WHERE `steam_ «) or die(mysql_error());
$RowBonus = mysql_fetch_array($BonustUser);

$Bonus = $amout/100*$PARTHNER_PR+$RowBonus[‘money’];
$AddBonus = mysql_query(«UPDATE `users` SET `money`=’$Bonus’ WHERE `steam_ «)or die(mysql_error());

Защищенная Авторизация и Регистрация на PHP + MySQL через PDO

В этой статье Вы найдете скрипт на языке программирования PHP, который позволяет пользователю зарегистрироваться и авторизоваться на сайте. Скрипт на 100% защищает от SQL-инжекций, поскольку использует PDO (система подготовленных запросов) и библиотеку RedBeanPHP, которая реализует ORM. Использовать RedBeanPHP мы будем только, чтобы присоединиться к базе данных и легко ей манипулировать, не используя стандартные команды в PHP, такие как mysql_connect и подобные, потому что они устаревшие и не очень эффективные.

Скрипт использует сессии ($_SESSION) и позволяет узнать авторизован сейчас человек или нет. Также в скрипте предусмотрена капча с рандомными вопросами, которая защищает сайт от надоедливого спама.

Скрипт состоит из следующих файлов:

  • index.php — содержит 2 ссылки (на форму авторизации и регистрации);
  • rb.php — ORM-библиотека RedBeanPHP;
  • db.php — подключение к базе данных;
  • login.php — обработчик авторизации пользователя и форма авторизации;
  • signup.php — обработчик регистрации пользователя и форма регистрации;
  • logout.php — выход из сессии.

Как подключить скрипт?

Скачайте готовый скрипт и перенесите все файлы на свой хостинг или локальный сервер (Denwer, OpenServer). Для работы скрипта Вам потребуется версия PHP не ниже 5.6. Далее необходимо создать базу данных и подсоединиться к ней. Для этого потребуется поменять значения в файле db.php. Если с этим возникнут трудности, то Вы можете задавать свои вопросы в комментариях под статьей.

Форма авторизации

В файле login.php находится обработчик и сама форма авторизации, которая состоит из двух полей (логин, пароль). Значок @ (собачка) перед переменными служит в PHP для отключения ошибки, если такая возникнет.

PHP обработчик формы авторизации пользователя

Все переменные, которые возвращаются по методу POST — мы присваиваем переменной $data.

Форма регистрации

В файле signup.php находится обработчик и сама форма регистрации. Для таких форм рекомендуется использовать метод запроса POST, при котором веб-сервер принимает данные, заключённые в тело сообщения, для хранения.

PHP обработчик формы регистрации пользователя

Смотреть видеоурок

Статья была написана на основе видеоурока Хауди Хо, который Вы можете посмотреть ниже. Скрипт из видео был немного доработан (добавлена капча function captcha_show).

Ограничение доступа на PHP и MySQL

30.01.13 25.01.15 2 7854

Скрипт ( PHP Authenticate) предназначен для ограничения доступа к веб страницам по паролю и логину. Пароли шифруются MD5, хранятся в базе MySQL. Версии 2.1 и 3.0.1.

Для надежной организации защиты пароли, зашифрованные методом MD5, хранятся в базе данных MySQL, что многократно повышает эффективность защиты. Даже если злоумышленник взломает базу данных, то он не сможет их расшифровать (в зависимости от сложности пароля), т.к. алгоритма дешифровки для MD5 не существует.

При первом обращении к защищенной странице система запрашивает пароль и логин. Введенный пароль шифруется необратимым алгоритмом шифрования MD5. Полученный зашифрованный пароль сверяется с хешем из базы данных.
Если хеши совпадают, доступ к защищенной странице открыт, если нет, то выводится сообщение об ошибке.
При неправильном вводе пароля и логина более 3 раз, доступ к странице блокируется, с последующей отправкой сообщения на e-mail администратора с данными о нарушителе.

Также есть возможность добавлять и удалять неограниченное количество учетных записей. Для управления учетными записями откройте страницу по адресу http: ваш_сайт/users.php .

— PHP4/PHP5;
— MySQL 4.0 и выше.

— шифрование пароля алгоритмом md5 ;
— добавление и удаление учетных записей;
— предотвращение повторного ввода пароля и логина при их неправильном вводе более 3 раз;
— отправка сообщения на e-mail администратора с данными о нарушителе;
— введение логов в базе данных.

Создайте базу данных и разместите в неё таблицы путем SQL -запроса из файла AUT.sql . Укажите в connect.php настройки (сервер базы данных, имя базы данных, логин, пароль, адрес хоста вашего сайта и свой e-mail.

Для защиты страницы впишите в самом начале следующею строку:

PHP защита полей от SQL инъекций

#1 Шальной

#2 matroskin8

  • Администраторы
  • 12 403 сообщений
  • Шальной (26 Март 2013 — 05:53) писал:

    #3 Шальной

    #4 matroskin8

  • Администраторы
  • 12 403 сообщений

  • Шальной (26 Март 2013 — 08:09) писал:

    #5 kashirinav

    Андрей, добрый день!
    Потихоньку я перебрался в эту часть форума />. Сейчас изучаю php и по ходу внедрения изученного в свой сайт возникают вопросы.
    Один из таких вопросов мучает долго — использование функции htmlspecialchartы(). Учитывая мой опыт по борьбе с вирусами на сайте, пытаюсь максимально защитить его.
    У меня на сайте есть несколько он-лайн сервисов по расчету normirovanie-truda.ru/optimizaciya-chislennosti/. В них есть поля ввода.
    После ввода хочу обработать полученную информацию с помощью вышеуказанной функции. Пока все попытки безуспешны.
    Вот код:
    Функция explodeX позволяет мне учитывать разные варианты разделителя.
    Пытаюсь вставить htmlspecialchartы() в начале строки
    Выдает ошибку.
    Подскажите, плиз:
    1. Нужна ли мне вообще такая защита и поможет ли мне она от SQL инъекций (прочитал только что) и всяких нехороших запросов?
    2. В каком месте кода должна находится функция htmlspecialchars?
    Спасибо!

    P.S. сейчас переписал код и вставил htmlspecialchars перед $_POST, ошибка ушла. Но как проверить работает ли функция htmlspecialchars или нет?

    #6 matroskin8

  • Администраторы
  • 12 403 сообщений
  • Привет, мир!

    #7 kashirinav

    #8 matroskin8

  • Администраторы
  • 12 403 сообщений
  • kashirinav (19 Июль 2013 — 11:17) писал:

    Ну, если он работает — значит да. касательно кода PHP, его работоспособность чаще всего нужно проверять на практике, поскольку визуально бывает сложно разобраться что и к чему.

    kashirinav (19 Июль 2013 — 11:17) писал:

    #9 kashirinav

    Андрей, здравствуйте!
    Пытаюсь оптимизировать код блога и хочу вынести часто используемые функции в файл «function».
    Есть функция explodeX, используется в трех файлах. Сейчас она вставлена в каждый из этих файлов.
    Файлы получают из формы данные и выводят результат обработки в новую страницу.
    Прописал функцию explodeX в function.
    В файлах обработки пишу такую строку:
    Далее проверяю свой массив print_r($hum1); и ничего нет.
    В чем моя ошибка?

    #10 matroskin8

  • Администраторы
  • 12 403 сообщений
  • Здравствуйте.
    Если сам массив $hum1 создался, но он пуст, то это один вопрос. Здесь нужно проверять входящие данные и корректность работы функции.
    Если же не создается и сам массив, тогда, скорее всего, проблема именно в корректности работы функции.
    Дебаг лучше в таких случаях проводить функцией var_dump(), которая не только покажет содержимое, но и его тип:
    Также возможен вариант, что попросту в этом файле не видна данная функция. в таком случае можно пропустить проверку на существование функции. вообще, на этапе разработки иногда лучше пропускать подобные проверки, тем самым облегчая процесс дебагга приложения:

    #11 kashirinav

    #12 matroskin8

  • Администраторы
  • 12 403 сообщений
  • Ну тогда ответ очевиден — при вызове функции о ней ничего не известно, поскольку получаем ответ «нет».
    Только что попробовал у себя поработать с пользовательской функцией. В файле functions.php прописал:
    Ну и в нужном шаблоне (например, index.php) спокойно работаю с результатом функции:

    #13 Гость_Sokol Skye_*

    Шальной (26 Март 2013 — 05:53) писал:

    #14 Artex

    Ну я, например, делаю вот в такой последовательности:

    И сама функция clear():

    Не думаю, что возможна инъекция. Касательно mysql_real_escape читал, что сильно грузит сервер (или что-то другое ).

    #15 Гость_Sokol Skye_*

    #16 matroskin8


  • Администраторы
  • 12 403 сообщений
  • Sokol Skye (11 Октябрь 2013 — 15:29) писал:

    Да, конечно, именно для этого и существуют подготовленные запросы.

    Artex (11 Октябрь 2013 — 15:55) писал:

    #17 Artex

    matroskin8 (11 Октябрь 2013 — 17:52) писал:

    Ну если не сложно, попробуйте привести пример. Все ковычки придут экранированными, то бишь ничего, кроме как строка с текстом в $login не прийдет, но может быть sql запрос, который отфильтруется моей регуляркой, в текущем проекте такой:

    #18 matroskin8

  • Администраторы
  • 12 403 сообщений
  • Artex (12 Октябрь 2013 — 00:10) писал:

    Ну я же не хакер я просто-напросто отметил, что данные функции не предназначены для защиты от sql-инъекций (они предназначены для другого, и я назвал для чего) и вот по какой причине: попробуйте зарегистрировать юзера с логином d’Artanian. а теперь посмотрите, что попало в БД — там будет уже не d’Artanian, а там лежит d’Artanian. т.е. один символ апострофа был заменен на 6 символов его сущности. это не критично, но это уже не хорошо. по той причине, что порой в текстовые поля (типа CHAR / VARCHAR — поля ограниченной длины) должно попадать ровно столько символов, сколько задумывалось, а все лишнее будет просто обрезаться. в то же время функция mysql(i)_real_escape_string() положит туда то, что там и должно быть — кавычку, один символ (а не 6), как и задумывалось.
    Ну а примеры sql-инъекций можно во множестве найти в сети. например, в статье в Википедии. можно увидеть, что sql-инъекции возможны не только для строковых данных, но и для числовых.

    Artex (12 Октябрь 2013 — 00:10) писал:

    т.е. логин d’Artanian уже запрещен?
    В общем-то, если использовать такой шаблон, то надобность в функции clear() просто отпадает, поскольку шаблон итак не пропустит ничего, кроме альфа-нумериков.

    Установка защиты на страницу используя MySQL и PHP

    Одним из наиболее значимых вопросов для web-программистов является безопасность php-скриптов. Все программисты в той или иной мере используют различные методы чтобы обезопасить свой проект, но, к сожалению, в большинстве случаев используется защита от нескольких уязвимостей, при этом остальные проблемные места даже не рассматриваются.
    В данной статье перечислены основные виды уязвимостей PHP и рассмотрены способы защиты от них.

    Виды уязвимостей PHP

    Правила написания безопасного кода на PHP

    1. Блокирование вывода ошибок
      Для этого достаточно в программном коде задать или в файле добавить строку
    2. Использование сложных паролей для доступа к административным страницам
      Для этого достаточно использовать многозначные пароли, не имеющие семантического значения (например, К7O0iV98dq).
    3. Логирование критических действий пользователя
      Не обеспечивает защиту напрямую, но позволяет выявить взломщиков и определить уязвимости, которые они использовали. Для этого действия пользователя и переданные им данные, которые касаются критических моментов работы системы, достаточно записывать в обычный текстовый файл.
      Пример функции логирования и её работы:
    4. Закрытие доступа к модулям сайта
      Обеспечивает защиту от попыток просмотра их содержимого или выполнения. Для этого достаточно в файле настроить доступ к файлам модулей при помощи конструкций и .
      Например, мы закрываем доступ ко всем модулям с расширением , кроме файла :
    5. Отключение возможности задания глобальных переменных
      Для этого достаточно в настройках сервера задать или в файле добавить строку . Использование проблему не решит так, как переменные задаются до начала выполнения скрипта.
    6. Отключение возможности использования удаленных файлов
      Для этого достаточно в настройках сервера задать . Это обеспечивает частичную защиту от PHP-инъекций, но не полную, так как взломщик может передавать не ссылку на файл с программным кодом, а сам программный код. Для полной защиты от PHP-инъекций необходимо дополнительно использовать фильтрацию поступивших данных. Иногда данную меру защиты невозможно использовать из-за особенностей работы проекта (нужно обращаться к удалённым файлам).
    7. Фильтрация поступающих данных
      Обеспечивает защиту от большенства уязвимостей. Универсального решения не существует. Желательно использовать проверку по «белому» списку символов в совокупности с проверкой на запрещённые слова. «Белым» называется список разрешенных символов. В этот список не должны входить опасные символы, например, . К запрещённым словам можно отнести: , а также html-теги.
      Пример фильтрации поступающих данных:
    8. Проверка на загрузку файла при помощи HTTP POST
      Обеспечивает защиту от PHP-инъекций через загрузку файлов. Для обеспечения этого загруженные на сервер файлы необходимо проверять функцией или перемещать функцией . Данный вид защиты можно не использовать, если отключена возможность задания глобальных переменных.
    9. Экранирование символов кавычек данных, передаваемых в базу данных
      Обеспечивает защиту от SQL-инъекций. Наиболее оптимальным методом является обработка всех поступивших не числовых данных с помощью функции . Можно так же использовать автоматическое экранирование, поступающих данных. Для этого достаточно в файле добавить строку , но этот способ не является надёжным, так как может привести к двойному экранированию.
      Пример экранирования кавычек с помощью функции :

  • Преобразование специальных символов в html-сущности перед выводом
    Обеспечивает защиту от XSS. Для этого данные, введенные пользователем, которые могут содержать нежелательные html-тэги, при выводе достаточно обработать функцией . Данный вид защиты можно не использовать, если фильтрация поступающих данных отсеивает опасные html-тэги.
  • Как видите создание продуманной системы безопасности скриптов не такое трудоёмкое дело как кажется.
    Данная статья не претендует на роль учебника по безопасности скриптов, но Я надеюсь, что она подтолкнёт php-программистов использовать более продуманные методы защиты.

    Как защитить строку подключения mySQL в PHP?

    Я знаю правило: никогда не записывайте свой пароль, и я видел этот вопрос здесь, который объясняет, что с Java и mySQL, но я не знаю что делать для PHP и mySQL.

    Текущая строка соединения выполнена так:

    • но мне нужно, чтобы пароль был защищен, т.е. не был жестко закодирован в этом файле. Как мне это сделать?

    EDIT: Для всех downvotes, которые я получаю от этого, я до сих пор не получил ответа на вопрос, касающийся подлинной проблемы безопасности — жестко закодированные пароли. Нецелесообразно голосовать по подлинному вопросу, не публикуя ни комментариев, ни ответов, которые отвечают на этот вопрос.

    Сохраните ваши конфигурации в другой файл.

    Установка git игнорировать этот файл конфигурации.

    Вам придется записывать пароль где-то в другом месте. Даже если вы хотите использовать DSN, вам придется жестко закодировать пароль в строке DSN. Как я вижу, не получается уйти от жесткого кодирования пароля.

    Итак, вопрос сводится к тому, что вы можете сделать, чтобы защитить файл/строку, содержащую пароль. Установка правильных разрешений файловой системы для файла, содержащего пароль, и установка правильного значения open_basedir — это то, что вы можете сделать. Как упоминалось в одном из сообщений в Какой лучший способ защитить строку подключения к базе данных?, вы также можете рассмотреть использование зашифрованного раздела.

    Ссылка, которую вы опубликовали в своем вопросе, насколько я понимаю, рассказывает о настольных приложениях. И настольных приложений на PHP слишком мало, чтобы серьезно подумать о защите паролей базы данных для настольных приложений php.

    Я тоже занимаюсь исследованиями по этой теме. Разрешение файла является одной из стратегий, но существует так много векторов.

    Но скажем, в одном сценарии у вас есть FTP или SSH-доступ к серверу, а кто-то компрометирует FTP-вход. Этот логин совпадает с папкой пользователя public_html. Этот человек мог просматривать и читать эти файлы. В значительной степени в этот момент это плохо. Однако вы можете иметь конфигурацию в системе, в которой вы помещаете пользователя в тюрьму только в своем домашнем каталоге.

    Возможно, тогда вы могли бы создать .private-папку на один уровень за пределами этого домашнего каталога пользователя. Затем в php файлах для этого пользователя, у которого есть свои скрипты в public_html, есть файл подключения, который существует в папке .private(../../.private/connect.php, например).

    Я не знаю, будет ли это работать, если пользователь будет заключен в тюрьму, но этот вид кажется безопасным через неясную вещь.

    Основываясь на том, что Cajus Kuinzinas избежал. Рассмотрите наличие ограниченной базы данных, в которой хранятся учетные данные приложения. Когда ваше приложение инициируется, выполните запрос, используя учетную запись только для чтения, которая может искать учетные данные в фактической базе данных приложений.

    Чтобы сделать его более безопасным, значение, хранящееся в базе данных поиска, не должно быть полным паролем. Ваше приложение может использовать это значение вместе с солью для генерации реального пароля. Кроме того, вы можете кэшировать это в памяти, если хотите, для уменьшения будущих ударов.


    Нет необходимости в кодировании учетных данных в файле конфигурации.

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

    В любом развертывании вы должны затем изменить эти заполнители, чтобы они выполняли проверку учетных данных в реальном времени. Это также поможет любому, кто использует ваш проект, если вы собираетесь его открыть.

    Обновлено (чтобы ответить на вопрос)

    Конфигурация базы данных действительно должна быть в виде простого текста, жестко закодированного в файл PHP, однако вы можете кое-что убедиться, что она более безопасна:

    • Проверьте конфигурацию Apache. open_basedir ограничивает другие экземпляры vhost из файлов доступа вне их веб-корня.
    • Проверьте разрешение файловой системы, чтобы обеспечить только apache, и ваш пользователь может получить доступ к файлу
    • Убедитесь, что ваш пользователь mysql установлен только для действительности из контекста localhost, т.е. grant all privileges on mydatabase.* to myuser@localhost и т.д.
    • Использование брандмауэра для блокировки внешних подключений к mysql

    Работа с MySQL в PHP

    PHP поддерживает работу с базой данных MySQL.
    Специальные встроенные функции для работы с MySQL позволяют просто и эффективно работать с этой СУБД: выполнять любые запросы, читать и записывать данные, обрабатывать ошибки.
    Сценарий, который подключается к БД, выполняет запрос и показывает результат, будет состоять всего из нескольких строк. Для работы с MySQL не надо ничего дополнительно устанавливать и настраивать; всё необходимое уже доступно вместе со стандартной поставкой PHP.

    Что такое mysqli?

    mysqli (MySQL Improved) — это расширение PHP, которое добавляет в язык полную поддержку баз данных MySQL. Это расширение поддерживает множество возможностей современных версий MySQL.

    Как выглядит работа с базой данных

    Типичный процесс работы с СУБД в PHP-сценарии состоит из нескольких шагов:

    1. Установить подключение к серверу СУБД, передав необходимые параметры: адрес, логин, пароль.
    2. Убедиться, что подключение прошло успешно: сервер СУБД доступен, логин и пароль верные и так далее.
    3. Сформировать правильный SQL запрос (например, на чтение данных из таблицы).
    4. Убедиться, что запрос был выполнен успешно.
    5. Получить результат от СУБД в виде массива из записей.
    6. Использовать полученные записи в своём сценарии (например, показать их в виде таблицы).

    Функция mysqli connect: соединение с MySQL

    Перед началом работы с данными внутри MySQL, нужно открыть соединение с сервером СУБД.
    В PHP это делается с помощью стандартной функции mysqli_connect() . Функция возвращает результат — ресурс соединения. Данный ресурс используется для всех следующих операций с MySQL.

    Но чтобы выполнить соединение с сервером, необходимо знать как минимум три параметра:

    Если вы следовали стандартной процедуре установки MySQL или используете OpenServer, то адресом сервера будет localhost , логином — root . При использовании OpenServer пароль для подключения — это пустая строка ‘’, а при самостоятельной установке MySQL пароль ты задавал в одном из шагов мастера установки.

    Базовый синтаксис функции mysqli_connect() :

    Проверка соединения

    Первое, что нужно сделать после соединения с СУБД — это выполнить проверку, что оно было успешным.
    Эта проверка нужна, чтобы исключить ошибку при подключении к БД. Неверные параметры подключения, неправильная настройка или высокая нагрузка заставит MySQL отвеграть новые подключения. Все эти ситуации приведут к невозможности соединения, поэтому программист должен проверить успешность подключения к серверу, прежде чем выполнять следующие действия.

    Соединение с MySQL устанавливается один раз в сценарии, а затем используется при всех запросах к БД.
    Результатом выполнения функции mysqli_connect() будет значение специального типа — ресурс.
    Если подключение к MySQL не удалось, то функция mysqli_connect() вместо ресурса вернет логическое значение типа «ложь» — false .
    Хорошей практикой будет всегда проверять значение результа выполнения этой функции и сравнивать его с ложью.

    Соединение с MySQL и проверка на ошибки:

    Функция mysqli_connect_error() просто возвращает текстовое описание последней ошибки MySQL.

    Установка кодировки

    Первым делом после установки соединения крайне желательно явно задать кодировку, которая будет использоваться при обмене данными с MySQL. Если этого не сделать, то вместо записей со значениями, написанными кириллицой, можно получить последовательность из знаков вопроса: ‘. ’.
    Вызови эту функцию сразу после успешной установки соединения: mysqli_set_charset($con, «utf8»);

    Выполнение запросов

    Установив соединение и определив кодировку мы готовы выполнить свои первые SQL-запросы. Ты уже умеешь составлять корректные SQL команды и выполнять их через консольный или визуальный интерфейс MySQL-клиента.
    Те же самые запросы можно отправлять без изменений и из php-сценария. Помогут в этом несколько встроенных функций языка.

    Два вида запросов

    Следует разделять все SQL-запросы на две группы:

    1. Чтение информации (SELECT).
    2. Модификация (UPDATE, INSERT, DELETE).

    При выполнении запросов из среды PHP, запросы из второй группы возвращают только результат их исполнения: успех или ошибку.
    Запросы первой группы при успешном выполнении возвращают специальный ресурс результата. Его, в свою очередь, можно преобразовать в ассоциативный массив (если нужна одна запись) или в двумерный массив (если требуется список записей).

    Добавление записи

    Вернёмся к нашему проекту — дневнику наблюдений за погодой. Начнём практическую работу с заполнения таблиц данными. Для начала добавим хотя бы один город в таблицу cities.

    Выражение INSERT INTO используется для добавления новых записей в таблицу базы данных.

    Составим корректный SQL-запрос на вставку записи с именем города, а затем выполним его путём передачи этого запроса в функцию mysqli_query() , чтобы добавить новые данные в таблицу.

    Обратите внимание, что первым параметром для функциии mysqli_query() передаётся ресурс подключения, полученный от функции mysqli_connect() , вторым параметром следует строка с SQL-запросом.
    При запросах на изменение данных (не SELECT) результатом выполнения будет логическое значение — true или false.
    false будет означать, что запрос выполнить не удалось. Для получения строки с описанием ошибки существует функция mysqli_error($link) .

    Функция insert id: как получить идентификатор добавленной записи

    Следующим шагом будет добавление погодной записи для нового города.
    Погодные записи хранит таблица weather_log, но, чтобы сослаться на город, необходимо знать идентификатор записи из таблицы cities.
    Здесь пригодится функция mysqli_insert_id() .
    Она принимает единственный аргумент — ресурс соединения, а возвращает идентификатор последней добавленной записи.

    Теперь у нас есть всё необходимое, чтобы добавить погодную запись.
    Вот как будет выглядеть комплексный пример с подключением к MySQL и добавлением двух новых записей:

    Чтение записей

    Другая частая операция при работе с базами данных в PHP — это получение записей из таблиц (запросы типа SELECT).
    Составим SQL-запрос, который будет использовать SELECT выражение. Затем выполним этот запрос с помощью функции mysqli_query() , чтобы получить данные из таблицы.

    В этом примере показано, как вывести все существующие города из таблицы cities:

    В примере выше результат выполнения функции mysqli_query() сохранён в переменной $result .
    Важно понимать, что в этой переменной находятся не данные из таблицы, а специальный тип данных — так называемая ссылка на результаты запроса.

    Чтобы получить действительные данные, то есть записи из таблицы, следует использовать другую функцию — mysqli_fetch_array() — и передать ей единственным параметром эту самую ссылку.
    Теперь каждый вызов функции mysqli_fetch_array() будет возвращать следующую запись из всего результирующего набора записей в виде ассоциативного массива.

    Цикл while здесь используется для «прохода» по всем записям из полученного набора записей.
    Значение поля каждой записи можно узнать просто обратившись по ключу этого ассоциативного массива.

    Как получить сразу все записи в виде двумерного массива

    Иногда бывает удобно после запроса на чтение не вызывать в цикле mysqli_fetch_array для извлечения очередной записи по порядку, а получить их сразу все одним вызовом. PHP так тоже умеет. Функция mysqli_fetch_all($res, MYSQLI_ASSOC) вернёт двумерный массив со всеми записями из результата последнего запроса.
    Перепишем пример с показом существующих городов с её использованием:

    Как узнать количество записей

    Часто бывает необходимо узнать, сколько всего записей вернёт выполненный SQL запрос.
    Это может помочь при организации постраничной навигации, или просто в качестве информации.
    Узнать число записей поможет функция mysqli_num_rows() , которой следует передать ссылку на результат запроса.

    Мастер Йода рекомендует:  Марафон «Создай свою веб-студию за 7 недель» — проект, который подтолкнет вас открыть свой
    Добавить комментарий