Вывод сообщений пользователю в веб-приложениях. PHP


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

Система уведомлений с использованием php и mysql

Я хотел внедрить систему уведомлений для нашей школы, это веб-приложение php / mysql, которое не открыто для общественности, поэтому оно не получает много трафика. «ежедневно 500-1000 посетителей».

1. Вначале я использовал триггеры MYSQL:

Я использовал Mysql AFTER INSERT trigger добавить записи в таблицу с именем notifications , Что-то вроде.

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

Уведомления извлекаются с чем-то вроде

Примечание: таблица user_class связывает пользователя с классом «user_id, class_id, subject_id» -subject — ноль, если пользователь не является учителем

Теперь мои следующие проблемы.

  1. Как отслеживать новые и старые уведомления на пользователя?
  2. Как я могу объединить уведомления, похожие на пользователя в одну строку?

Например, если 2 пользователя прокомментировали что-то, то не вставляйте новую строку, просто обновите старую что-то вроде ‘userx и еще 1 прокомментировал hw’.

редактировать

В соответствии с ответом ниже, чтобы установить флаг чтения / непрочитания в строке, мне нужно иметь строку для каждого ученика, а не только строку для всего класса … что означает изменение триггера на что-то вроде

Решение

Ну, этому вопросу 9 месяцев, так что я не уверен, что ОП все еще нуждается в ответе, но из-за множества мнений и вкусной щедрости я хотел бы также добавить свою горчицу (немецкая поговорка ..).

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

Редактировать: Ну ладно, это оказалось намного, намного дольше, чем я ожидал. Я очень устал, в конце концов, извините.

WTLDR;

Вопрос 1: иметь флаг на каждом уведомлении.

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

Состав

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

За шторами это может выглядеть примерно так:

Замечания: Я не рекомендую группировать уведомления внутри базы данных, делайте это во время выполнения, это делает вещи более гибкими.

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

Каждая система, над которой я работал, имела простой 1 к 1 ссылочные отношения в уведомлении, вы можете иметь От 1 до n имейте в виду, что я продолжу свой пример с 1: 1. Это также означает, что мне не нужно поле, определяющее тип объекта, на который ссылаются, потому что это определяется типом уведомления.

Таблица SQL

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

Или для ленивых людей Команда SQL создать таблицу для этого примера:

PHP Сервис

Эта реализация полностью зависит от потребностей вашего приложения, Замечания: Это пример не золотой стандарт о том, как построить систему уведомлений в PHP.

Модель уведомления

Это пример базовой модели самого уведомления, ничего особенного, только необходимые свойства и абстрактные методы messageForNotification а также messageForNotifications мы ожидали, что будут реализованы в различных типах уведомлений.

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


Типы уведомлений

Теперь вы можете создать новый Notification подкласс для каждого типа. Этот следующий пример будет обрабатывать как действие комментария:

  • Рэй понравился твой комментарий. (1 уведомление)
  • Джону и Джейн понравился твой комментарий. (2 уведомления)
  • Джейн, Джонни, Джеймсу и Дженни понравился твой комментарий. (4 уведомления)
  • Джонни, Джеймсу и еще 12 понравился ваш комментарий. (14 уведомлений)

Менеджер уведомлений

Для работы с уведомлениями внутри приложения создайте что-то вроде диспетчера уведомлений:

notificationAdapter свойство должно содержать логику в прямой связи с вашим бэкэндом данных в случае этого примера mysql.

Создание уведомлений

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

Так что в диспетчере уведомлений вы можете сделать что-то вроде этого:

За add метод notificationAdapter может быть необработанной командой вставки mysql. Использование этой абстракции адаптера позволяет вам легко переключаться с MySQL на базу данных на основе документов, например MongoDB что имело бы смысл для системы уведомлений.

isDoublicate метод на notificationAdapter следует просто проверить, есть ли уже уведомление с таким же recipient , sender , type а также reference ,

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

Итак, если у вас есть какой-то контроллер с действием, когда учитель загружает домашнее задание:

Создаст уведомление для ученика каждого учителя, когда он загрузит новую домашнюю работу.

Чтение уведомлений

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

Простое решение — просто ограничить количество запрошенных уведомлений и только группировать их. Это будет хорошо работать, когда не так много похожих уведомлений (например, 3-4 на 20). Допустим, пост пользователя / студента получает около ста лайков, а вы выбираете только последние 20 уведомлений. После этого пользователь увидит, что его публикация понравилась 20 людям, и это будет его единственным уведомлением.

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

Вы, вероятно, не читали текст ниже, поэтому позвольте мне продолжить с фрагментом:

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

А теперь дерьмовая часть. Я все еще не мог найти лучший способ выбрать ограниченное количество уведомлений для каждой группы без выполнения запроса для каждой группы. Все предложения здесь очень приветствуются.

Поэтому я делаю что-то вроде:

Теперь я продолжу предполагать, что notificationAdapter s get Метод реализует эту группировку и возвращает массив следующим образом:

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

Таким образом, чтобы иметь возможность работать с этими сгруппированными уведомлениями, нам нужен новый объект:

И, наконец, мы можем собрать все вещи вместе. Вот как функция get на NotificationManager может выглядеть так:

И, наконец, внутри возможного действия контроллера:

Другие решения

Введите переменную для чтения / чтения в уведомлении. Затем вы можете извлекать только непрочитанные уведомления, выполнив … WHERE status = ‘UNREAD’ в вашем sql.

Вы не можете на самом деле … вы хотите нажать это уведомление. Что вы можете сделать, так это объединить их, используя GROUP BY. Вы, вероятно, захотите сгруппировать что-то уникальное, например, новую домашнюю работу, так что это может быть что-то вроде … GROUP BY homework , id

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

Ответ Geggleto был прав насчет второй части, вы можете получить уведомления с SELECT *, COUNT(*) AS counter WHERE . GROUP BY ‘type’ тогда вы узнаете, сколько у вас там того же типа, и сможете подготовить «userx и еще 1 комментарий с hw».

Я бы также посоветовал вам не хранить весь текст, который вы хотите отобразить, вместо этого хранить требуемую информацию, например: from_id, class_id, type, name и т. Д. — таким образом, вы можете легче изменить механизмы позже, если вам нужно, и вы хранить меньше.


Скрипт личных сообщений на PHP

Приветствую! Сегодня будем учиться создавать систему личных сообщений на PHP. Для чего это нужно, думаю, всем будет понятно. Предположительно, на вашем сайте есть некоторые пользователи, которые бы хотели связываться между собой не прибегая к помощи посторонних сервисов и оставаясь на вашем сайте. PHP сообщения решают эту проблему. Мы сделаем скрипт личных сообщений на PHP, который будет состоять из таблицы БД для хранения личных сообщений, скрипта отправки сообщения и скрипта чтения сообщения.

Мастер Йода рекомендует:  10 шагов навстречу собственному безлимитному VPN

Создания таблицы БД на PHP:

Начнем с базы данных для наших личных сообщения. Она представляет собой таблицу со следующими полями:

  1. ID
  2. Дата отправки
  3. Отправитель
  4. Получатель
  5. Содержимое
  6. Флаг сообщения

Мы назовем таблицу messages. Вот код создания такой таблицы БД:

  • data — дата отправки сообщения
  • from — уникальный номер отправителя
  • to — номер получателя
  • message — сообщение
  • flag — индикатор того, прочтено сообщение или еще нет

После этого начнем работу над клиентской частью — напишем форму отправки сообщения и php-обработчик формы отправки.

Форма отправки сообщения PHP:

Форма отправки сообщения необходимо для ввода пользователем самого сообщения и адреса получателя. В форме требуется указать обработчик и метод передачи.

Форма ввода сообщения:

Обработчик отправки сообщения:

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

В нашем случае сообщение отправляется от пользователя с >

Чтение сообщений:

Последний скрипт направлен на чтение личных сообщений, которые он вытаскивает из БД.

Форум PHP программистов ► PHP практикум ► PHP для начинающих

Пейджер выключен!

Профиль
Группа: Пользователь
Сообщений: 4
Пользователь №: 21908
На форуме:
Карма:

Уважаемые знатоки, помогите решить проблему, уже целый час Гуглил по запросам:
Как вывести окно сообщения на PHP.
Нечего подходящего не нашёл, последняя надежда на Вас!

«Как вывести окно сообщения на PHP?»

П.С. только начал изучать ПХП, поэтому нуждаюсь в подробном описании ))
Зарание Спасибо!

Как вывести информационное сообщение автора на страничках блога — php html

Выводить нужную информацию в качестве сообщений администратора сайта, а в том числе «приветствие» или всевозможные «подписки», можно различными способами (например, как описано ЗДЕСЬ) — но —

…иногда у админа возникают какие-то свои требования, а, следовательно, и решения должны быть соответствующими.

Вот их сегодня и рассмотрим:

Конечно, возможно инфу вписать непосредственно в определённый HTML документ, соорудив кодик и поместив его в файл single.php или post-single.php и т.п. А возможно прямо в тело статьи, использовав теги шорткода, а возможно… !!

О всех плюсах и минусах этих предприятий написано вот тут — правильное использование кода …

Главнейшим минусом правки нескольких HTML документов — является — правка нескольких документов )) — при смене характера информационного сообщения возникает необходимость править код во всех включенных документах… А это неудобно!!

Посему сегодня поступим немного иначе: рассмотрим в качестве примера «приветствие автора», форму которого можно будет при необходимости заменить подправив один только файл, а именно файл functions.php … Хотя, как понимаете, вариации сообщений могут быть какими угодно и если вы выводите какие-то совершенно разные информационные сообщения, к примеру, рекламные строки в разделах категорий, меток, отдельных записей, страничках и т.п. всегда выручит PHP…

как вывести сообщение в блоге посредством файла functions.php

Воспользуемся вот этой достаточно известной функцией (я её только фамильным гербом обозначил: а вообще имя может быть любое):


Вот такой незамысловатый кодик нам нужно прописать в наш легендарный файл функций functions.php — перед закрывающим тегом ?> .

Одно дело сделано!

А о том как выводить сообщение-информацию администратора (автора) блога непосредственно на «ЛИЦО» сайта рассмотрим ниже, а пока разберём некоторые нюансы:

Общеизвестно, что характер информационной фразы т. е. её написание — разнообразно !! — информационная фраза может быть, например, закавычена внутри… (т.е проставлена какая-то символика, которая используется и в программировании) и коли такую многосимволичную фразу поместить в php файл — будет ошибка !! ибо символика же несёт определённую нагрузку в системном чтении документа.

Так как же поместить кавычки внутри других кавычек в коде php.

…и заставить правильно отрабатывать документ…

…проблему можно решить такими способами:

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

И ещё один вариант — это экранирование проблемной символики с помощью обратной косой черты ( бэкслеш — backslash) \ . Так называемое экранирование задаёт отмену кавыч-функции, которую обозначал символ — и превращает его в обычный.

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

В программировании нельзя забывать об ЭКРАНЕ каким бы тот экран ни был), посему необходимо умение им пользоваться.

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

Как понимаете, код вывода функции правильнее завернуть в id-класс, чтобы предложение имело соответственно характерную стилистику…

…Ну — к примеру, путь id будет таким:

А вот и примерные стили нашего чуда:

Свойства и значения CSS возможно менять соответственно вашей фантазии…

На этой высокой ноте завершу сегодняшнее повествование, ибо всё. рассказал.

В следующих статьях научимся выводить более сложные комбинирования кода HTML и PHP!

вероятно, имеет смысл подписаться:

В качестве бонуса: только нужно непременно прочесть этот пост …ибо я расскажу кратко.

Можно к примеру добавить кнопочку в HTML редактор вордпресс «завершение» или, мол, «поделитесь в соцсетях» чтобы не писать однообразный текст сотни раз!

Например, такие экзерсисы… ))

Естественно, всю стилистику фраз (в коде) можно поубирать напрочь, а уж подстраивать всяческую гармонию буков непосредственно в статье…

Но — для реализации этих примочек напоминаю: прочтите пост — ссылка выше…

Михаил ATs — владелец блога запросто с Вордпресс — в сети нтернет давным-давно.

. веб разработчик студии ATs media: помогу в создании, раскрутке, развитии и целенаправленном сопровождении твоего ресурса в сети. — заказы, вопросы. разработка.

Пошаговая PHP инструкция – Создайте новое SMS веб-приложение, используя SMS API от Infobip

Ознакомьтесь с Infobip инструкцией по созданию вашего SMS веб-приложения.

October 20 2015

Добро пожаловать в Infobip инструкцию по созданию вашего собственного SMS веб-приложения для начинающих. Мы поможем вам шаг за шагом пройти через сложности установки SMS API от Infobip и SMS-сервисов. Инструкция включает 3 примера важнейших опций для отправки SMS-сообщений и проверки их статуса:

Мы начнем с примеров и презентаций, чтобы вы могли выбрать то, что вам наиболее интересно.

Чтобы следовать данной инструкции, писать и тестировать все самостоятельно, вам необходимо подготовиться (и мы не имеем в виду налить чашку кофе и погасить свет). Чтобы отправлять сообщения, получать логи и отчеты по доставке сообщений, вам необходимо установить cURL php расширение для вашего веб-сервера.

Для работы с этой инструкцией вы можете использовать решение из стека AMP (wamp, xampp или др.). Этот стек для ПО по различным ОС состоит из веб-сервера Apache, базы данных MySQL и поддержки языка программирования PHP. В любом случае вы должны установить расширение phpcurl

Примечание: для безопасной отправки SMS сообщений, эти примеры при запуске должны быть размещены на HTTPS (используя TLS). Для упрощения инструкции, мы использовали HTTP.


PHP скрипт сообщений

При помощи php можно «отправлять сообщения» друг другу. Предположим что у на сайте есть пользователи и необходимо организовать систему личных сообщений.
Для реализации этого нам потребуются: таблица в БД для сообщений, скрипт для отправки сообщений и скрипт для чтения сообщений.
Идем по порядку-таблица. В таблице будут следующие поля: id, дата отправки, отправитель, получатель, содержимое сообщения и флаг.
Код создания таблицы будет выглядеть так, назовем её messages.

Дамп таблицы

CREATE TABLE IF NOT EXISTS `messages` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`from` int(11) NOT NULL,
`to` int(11) NOT NULL,
`message` text NOT NULL,
`flag` int(11) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

В поле data будет дата отправки сообщения,поле from-уникальный номер отправителя,to-номер получателя,message-само сообщение и поле flag-отметка о том-прочтено сообщение или ещё нет.

Теперь займемся клиентской частью-напишем форму отправки сообщения и php обработчик формы отправки.


Форма отправки и обработчик

В форме отправки нам потребуется ввести сам текст сообщения и выбрать адресата. В форме укажем обработчик и метод передачи.
Подробнее о формах в phpчитайте тут.

Форма ввода сообщения

Обработчик отправки сообщения

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

/**
* Принимаем постовые данные. Очистим сообщение от html тэгов
* и приведем id получателя к типу integer
*/
$message= htmlspecialchars($_POST[‘message’]);
$to=(int)$_POST[‘to’];

/**
* Я использую библиотеку PDO
*/
$db_user=’db_username’;
$db_name=’db_name’;
$db_pass=’db_userpassword’;

$db = new PDO(‘mysql:dbname=’.$db_name.’; host=localhost’,$db_user,$db_pass);
$db->exec(«SET CHARACTER SET utf8»);

$sql=»insert into messages (u_from,u_to,message,flag) values
(:u_from,:u_to,:message,:flag)»;
$sth=$db->prepare($sql);
$sth->bindValue(‘:u_from’, 1);// тут 1-это номер отправителя
$sth->bindValue(‘:u_to’, $to);
$sth->bindValue(‘:message’, $message);
$sth->bindValue(‘:flag’, 0);
$sth->execute();
$error=$sth->errorInfo();
/**
* Проверка результата запроса
*/
if($error[0]==0) <
echo ‘Сообщение успешно отправлено’;
>else <
echo ‘Ошибка отправки сообщения’;
>

Вот таким образом можно отправить сообщение одному пользователю от другого.
В моем скрипте сообщение отправляется от пользователя с >

Теперь напишем скрипт, который выведет все сообщения,адресованные конкретному пользователю. Опять же подтягивайте номер пользователя из сессии или куки.

/**
* Номер пользователя,для которого отображать сообщения
*/
$u_ >
$db_user=’db_username’;
$db_name=’db_name’;
$db_pass=’db_userpassword’;

$db = new PDO(‘mysql:dbname=’.$db_name.’; host=localhost’,$db_user,$db_pass);
$db->exec(«SET CHARACTER SET utf8»);

/**
* Достаем сообщения
*/
$sql=»select * from messages where u_to=? order by id desc»;
$sth=$db->prepare($sql);
$sth->bindParam(1,$u_id,PDO::PARAM_INT);
$sth->execute();
$res=$sth->fetchAll(PDO::FETCH_ASSOC);
foreach ($res as $row)<

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

Чтение сообщения

/**
* Номер пользователя
*/
$u_ >
/**
* Получаем номер сообщения. Приводим его типу Integer
*/
$ ];

$db = new PDO(‘mysql:dbname=’.$db_name.’; host=localhost’,$db_user,$db_pass);
$db->exec(«SET CHARACTER SET utf8»);

/**
* Достаем сообщение. Помимо номера сообщения ориентируемся и на id пользователя
* Это исключит возможность чтения чужого сообщения, методом подбора id сообщения
*/
$sql=»select * from messages where u_to = :u_to and >$sth=$db->prepare($sql);
$sth->bindParam(‘:u_to’,$u_id,PDO::PARAM_INT);
$sth->bindParam(‘:id_mess’,$id_mess,PDO::PARAM_INT);
$sth->execute();
$res=$sth->fetch(PDO::FETCH_ASSOC);

/**
* Установим флаг о прочтении сообщения
*/
$sql=»update messages set flag = 1 where u_to = :u_to and >$sth=$db->prepare($sql);
$sth->bindParam(‘:u_to’,$u_id,PDO::PARAM_INT);
$sth->bindParam(‘:id_mess’,$id_mess,PDO::PARAM_INT);
$sth->execute();

/**
* Выводим сообщение с датой отправки
*/
if($res[‘id’]<>») <
echo ‘

echo ‘Сообщение №’.$row[‘id’].’ О

Вот и всё. Если вы поняли как Всё это работает — вы сможете сами сделать список отправленных сообщений. С помощью поля flag можно подсвечивать новые/непрочитанные сообщения.

Задавайте ваши вопросы. Все скрипты приаттачены к статье,качайте. На этом всё 🙂

Ссылки по теме

Популярные статьи
Информационная безопасность Microsoft Офисное ПО Антивирусное ПО и защита от спама Eset Software
Мастер Йода рекомендует:  IT-аутсорсинг что это


Бестселлеры
Курсы обучения «Atlassian JIRA — система управления проектами и задачами на предприятии»
Microsoft Office 365 для Дома 32-bit/x64. 5 ПК/Mac + 5 Планшетов + 5 Телефонов. Подписка на 1 год. Электронный ключ
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2020. Все языки. Электронный ключ
Курс «Oracle. Программирование на SQL и PL/SQL»
Курс «Основы TOGAF® 9»
Microsoft Windows Professional 10 Sngl OLP 1 License No Level Legalization GetGenuine wCOA (FQC-09481)
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Windows Server 2020 Standard
Курс «Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации»
Антивирус ESET NOD32 Antivirus Business Edition
Corel CorelDRAW Home & Student Suite X8

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

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

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

Приемы безопасного программирования веб-приложений на PHP.

Данная статья не претендует на роль всеобъемлющего руководства на тему «как сделать так, чтоб меня никто не поломал». Так не бывает. Единственная цель этой статьи — показать некоторые используемые мной приемы для защиты веб-приложений типа WWW-чатов, гостевых книг, веб-форумов и других приложений подобного рода. Итак, давайте рассмотрим некоторые приемы программирования на примере некоей гостевой книги, написанной на PHP.

Первой заповедью веб-программиста, желающего написать более-менее защищенное веб-приложение, должно стать «Никогда не верь данным, присылаемым тебе пользователем». Пользователи — это по определению такие злобные хакеры, которые только и ищут момента, как бы напихать в формы ввода всякую дрянь типа PHP, JavaScript, SSI, вызовов своих жутко хакерских скриптов и тому подобных ужасных вещей. Поэтому первое, что необходимо сделать — это жесточайшим образом отфильтровать все данные, присланные пользователем.

Допустим, у нас в гостевой книге существует 3 формы ввода: имя пользователя, его e-mail и само по себе тело сообщения. Прежде всего, ограничим количество данных, передаваемых из форм ввода чем-нибудь вроде:

На роль настоящей защиты, конечно, это претендовать не может — единственное назначение этого элемента — ограничить пользователя от случайного ввода имени длиннее 20-ти символов. А для того, чтобы у пользователя не возникло искушения скачать документ с формами ввода и подправить параметр maxlength, установим где-нибудь в самом начале скрипта, обрабатывающего данные, проверку переменной окружения web-сервера HTTP-REFERER:

Теперь, если данные переданы не из форм документа, находящегося на сервере www.myserver.com, хацкеру будет выдано деморализующее сообщение. На самом деле, и это тоже не может служить 100%-ой гарантией того, что данные ДЕЙСТВИТЕЛЬНО переданы из нашего документа. В конце концов, переменная HTTP_REFERER формируется браузером, и никто не может помешать хакеру подправить код браузера, или просто зайти телнетом на 80-ый порт и сформировать свой запрос. Так что подобная защита годится только от Ну Совсем Необразованных хакеров. Впрочем, по моим наблюдениям, около 80% процентов злоумышленников на этом этапе останавливаются и дальше не лезут — то ли IQ не позволяет, то ли просто лень. Лично я попросту вынес этот фрагмент кода в отдельный файл, и вызываю его отовсюду, откуда это возможно. Времени на обращение к переменной уходит немного — а береженого Бог бережет.

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

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

Запретим пользователю использовать в своем имени любые символы, кроме букв русского и латинского алфавита, знака «_» (подчерк), пробела и цифр:

Я предпочитаю везде, где нужно что-нибудь более сложное, чем проверить наличие паттерна в строке или поменять один паттерн на другой, использовать Перл-совместимые регулярные выражения (Perl-compatible Regular Expressions). То же самое можно делать и используя стандартные PHP-шные ereg() и eregi(). Я не буду приводить здесь эти примеры — это достаточно подробно описано в мануале.

Для поля ввода адреса e-mail добавим в список разрешенных символов знаки «@» и «.», иначе пользователь не сможет корректно ввести адрес. Зато уберем русские буквы и пробел:

Поле ввода текста мы не будем подвергать таким жестким репрессиям — перебирать все знаки препинания, которые можно использовать, попросту лень, поэтому ограничимся использованием функций nl2br() и htmlspecialchars() — это не даст врагу понатыкать в текст сообщения html-тегов. Некоторые разработчики, наверное, скажут: «а мы все-таки очень хотим, чтобы пользователи _могли_ вставлять теги». Если сильно неймется — можно сделать некие тегозаменители, типа «текст, окруженный звездочками, будет высвечен bold’ом.». Но никогда не следует разрешать пользователям использование тегов, подразумевающих подключение внешних ресурсов — от тривиального до супернавороченного .

Как-то раз меня попросили потестировать html-чат. Первым же замеченным мной багом было именно разрешение вставки картинок. Учитывая еще пару особенностей строения чата, через несколько минут у меня был файл, в котором аккуратно были перечислены IP-адреса, имена и пароли всех присутствовавших в этот момент на чате пользователей. Как? Да очень просто — чату был послан тег , в результате чего браузеры всех пользователей, присутствовавших в тот момент на чате, вызвали скрипт myscript.pl с хоста myserver.com. (там не было людей, сидевших под lynx’ом 🙂 ). А скрипт, перед тем как выдать location на картинку, свалил мне в лог-файл половину переменных окружения — в частности QUERY_STRING, REMOTE_ADDR и других. Для каждого пользователя. С вышеупомянутым результатом.

Посему мое мнение — да, разрешить вставку html-тегов в чатах, форумах и гостевых книгах — это красиво, но игра не стоит свеч — вряд ли пользователи пойдут к Вам на книгу или в чат, зная, что их IP может стать известным первому встречному хакеру. Да и не только IP — возможности javascript’a я перечислять не буду 🙂

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

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

Простейший и надежнейший способ аутентикации пользователя — размещение скриптов в директории, защищенной файлом .htaccess. Для преодоления такой защиты нужно уже не приложение ломать, а web-сервер. Что несколько сложнее и уж, во всяком случае, не укладывается в рамки темы этой статьи. Однако не всегда этот способ пригоден к употреблению — иногда бывает надо проводить авторизацию средствами самого приложения.

Первый, самый простой способ — авторизация средствами HTTP — через код 401. При виде такого кода возврата, любой нормальный браузер высветит окошко авторизации и попросит ввести логин и пароль. А в дальнейшем браузер при получении кода 401 будет пытаться подсунуть web-серверу текущие для данного realm’а логин и пароль, и только в случае неудачи потребует повторной авторизации. Пример кода для вывода требования на такую авторизацию есть во всех хрестоматиях и мануалах:

Разместим этот кусочек кода в начале скрипта admin1.php. После его выполнения, у нас будут две установленные переменные $PHP_AUTH_USER и PHP_AUTH_PW, в которых соответственно будут лежать имя и пароль, введенные пользователем. Их можно, к примеру, проверить по SQL-базе:

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

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

Итак, раскрываю секрет: допустим, хакер вводит заведомо несуществующее имя пользователя и пустой пароль. При этом в результате выборки из базы переменная $rpassword принимает пустое значение. А алгоритм шифрования паролей при помощи функции СУБД MySQL Password(), так же, впрочем, как и стандартный алгоритм Unix, при попытке шифрования пустого пароля возвращает пустое значение. В итоге — $password == $rpassword, условие выполняется и взломщик получает доступ к защищенной части приложения. Лечится это либо запрещением пустых паролей, либо, на мой взгляд, более правильный путь — вставкой следующего фрагмента кода:

То есть — проверкой наличия одного и только одного пользователя в базе. Ни больше, ни меньше.

Точно такую же проверку на авторизацию стоит встроить и в скрипт admin2.php. По идее, если пользователь хороший человек — то он приходит к admin2.php через admin1.php, а значит, уже является авторизованным и никаких повторных вопросов ему не будет — браузер втихомолку передаст пароль. Если же нет — ну, тогда и поругаться не грех. Скажем, вывести ту же фразу «hacker? he-he. «.

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

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

Остальные скрипты защищенной части приложения каким-нибудь образом проверяют факт авторизованности пользователя.

Такая модель называется сессионной — после прохождения авторизации открывается так называемая «сессия», в течение которой пользователь имеет доступ к защищенной части системы. Сессия закрылась — доступ закрывается. На этом принципе, в частности, строится большинство www-чатов: пользователь может получить доступ к чату только после того, как пройдет процедуру входа. Основная сложность данной схемы заключается в том, что все скрипты защищенной части приложения каким-то образом должны знать о том, что пользователь, посылающий данные, успешно авторизовался.

Рассмотрим несколько вариантов, как это можно сделать:

После авторизации все скрипты защищенной части вызываются с неким флажком вида adminmode=1. (Не надо смеяться — я сам такое видел).

Ясно, что любой, кому известен флажок adminmode, может сам сформировать URL и зайти в режиме администрирования. Кроме того — нет возможности отличить одного пользователя от другого.

Скрипт авторизации может каким-нибудь образом передать имя пользователя другим скриптам. Распространено во многих www-чатах — для того, чтобы отличить, где чье сообщение идет, рядом с формой типа text для ввода сообщения, пристраивается форма типа hidden, где указывается имя пользователя. Тоже ненадежно, потому что хакер может скачать документ с формой к себе на диск и поменять значение формы hidden. Некоторую пользу здесь может принести вышеупомянутая проверка HTTP_REFERER — но, как я уже говорил, никаких гарантий она не дает.


Определение пользователя по IP-адресу. В этом случае, после прохождения авторизации, где-нибудь в локальной базе данных (sql, dbm, да хоть в txt-файле) сохраняется текущий IP пользователя, а все скрипты защищенной части смотрят в переменную REMOTE_ADDR и проверяют, есть ли такой адрес в базе. Если есть — значит, авторизация была, если нет — «hacker? he-he. » 🙂

Это более надежный способ — не пройти авторизацию и получить доступ удастся лишь в том случае, если с того же IP сидит другой пользователь, успешно авторизовавшийся. Однако, учитывая распространенность прокси-серверов и IP-Masquerad’инга — это вполне реально.

Единственным, известным мне простым и достаточно надежным способом верификации личности пользователя является авторизация при помощи random uid. Рассмотрим ее более подробно.

После авторизации пользователя скрипт, проведший авторизацию, генерирует достаточно длинное случайное число:

  1. заносит в локальный список авторизовавшихся пользователей;
  2. Выдает пользователю.

Пользователь при каждом запросе, помимо другой информации (сообщение в чате, или список сообщений в гостевой книге), отправляет серверу свой uid. При этом в документе с формами ввода будет присутствовать, наряду с другими формами, тег вида:

Форма uid невидима для пользователя, но она передается скрипту защищенной части приложения. Тот сличает переданный ему uid с uid’ом, хранящимся в локальной базе и либо выполняет свою функцию, либо. «hacker? he-he. «.

Единственное, что необходимо сделать при такой организации — периодически чистить локальный список uid’ов и/или сделать для пользователя кнопку «выход», при нажатии на которую локальный uid пользователя сотрется из базы на сервере — сессия закрыта.

Некоторые программисты используют в качестве uid не «одноразовое» динамически генерирующееся число, а пароль пользователя. Это допустимо, но это является «дурным тоном», поскольку пароль пользователя обычно не меняется от сессии к сессии, а значит — хакер сможет сам открывать сессии. Та же самая модель может быть использована везде, где требуется идентификация пользователя — в чатах, веб-конференциях, электронных магазинах.

В заключение стоит упомянуть и о такой полезной вещи, как ведение логов. Если в каждую из описанных процедур встроить возможность занесения события в лог-файл с указанием IP-адреса потенциального злоумышленника — то в случае реальной атаки вычислить хакера будет гораздо проще, поскольку хакеры обычно пробуют последовательно усложняющиеся атаки. Для определения IP-адреса желательно использовать не только стандартную переменную REMOTE_ADDR, но и менее известную HTTP_X_FORWARDED_FOR, которая позволяет определить IP пользователя, находящегося за прокси-сервером. Естественно — если прокси это позволяет.

При ведении лог-файлов, необходимо помнить, что доступ к ним должен быть только у Вас. Лучше всего, если они будут расположены за пределами дерева каталогов, доступного через WWW. Если нет такой возможности — создайте отдельный каталог для лог-файлов и закройте туда доступ при помощи .htaccess (Deny from all).

Я буду очень признателен, если кто-нибудь из программистов поделится своими не описанными здесь методами обеспечения безопасности при разработке приложений для Web.

Язык Web-программирования — PHP (стр. 3 из 3)

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

Можно сделать вывод о том, что сайты с использованием связки HTML+PHP+MySQL в несколько раз превосходят обычные HTML сайты по функциональности, удобству и т.д.

Неудивительно, что эта связка PHP+MySQL развивается очень быстро. Постоянно появляются новые возможности, разные полезные скрипты, которые позволяют усовершенствовать свой сайт.

Различные технологи вроде Flash, Ajax, JavaScript хорошо взаимодействуют с PHP, что позволяет создавать просто сумасшедшие по функциональности и красоте сайты.

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ

  1. Джордж Шлосснейгл. Профессиональное программирование на PHP, 2006
  2. Уильям Стейнмец, Брайан Вард. 75 готовых решений для вашего web-сайта на РНР, 2009
  3. Мишель Е. Дэвис и Джон А. Филипс. Изучаем PHP и MySQL, 2008
  4. Николай Прохоренок. HTML, JavaScript, PHP и MySQL. Джентельменский набор Web-мастера, 2010
  5. Тим Конверс, Джойс Парк и Кларк Морган. PHP 5 и MySQL. Библия пользователя, 2006

Чат на php, mysql, ajax

В этой теме 9 ответов, 2 участника, последнее обновление 4 мес. назад.

Сегодня хочу рассказать и показать как написать чат на php используя технологию ajax и базу данных mysql. Ajax будем использовать для того, чтобы страница при отправке сообщений не перезагружалась [заметка про Ajax].

Ну для начала вам нужно написать регистрацию для будущего чата. Кто не читал статью как это делать, то вот она «Система регистрации на сайте«. Внимание: при создании регистрации сделайте БД с именем chat .

Теперь когда пользователи могут регистрироваться у нас в чате, приступим к написанию самого скрипта для обмена сообщениями на сайте. У нас есть страница index.php , то есть главная. Там после строки:
echo «Выход»;
Вставьте такую строчку:
include(«chat.php»);
Этим мы будем подключать файл chat.php на главную. Теперь создайте рядом со всеми файлами ( login.php , register.php и т.д. ) файл chat.php .

Там у нас будет храниться html-код (то есть каркас) и javascript (JQuery) код, которым мы будем отправлять данные на сервер и каждые 5 секунд подгружать сообщения в div .

В базу данных, помимо таблицы с пользователями ( users ), добавьте еще такой дамп (это таблица messages в которой мы будем хранить сообщения пользователей):

Теперь приведу хорошо закомментрированный код файла chat.php :

Как вы заметили, в функции добавления сообщений в базу отправляет Ajax запрос файлу add_mess.php , который уже добавит его в таблицу messages . Вот код этого файла:

Теперь последний код нашего чата, это php скрипт, который достает данные из БД и отдает их функции load_messes() на вывод. Вот он:

Вот и все скрипты закончены. Теперь осталось лишь все собрать. А для особо ленивых, выложу архив со всеми скриптами и дампом базы данных. Исходники чата на php+mysql+ajax.

Останется лишь создать БД с именем chat , залить дамп и скрипты. Но, хотел сказать, что такая версия чата очень простая, без наворотов и без защиты от флудеров и т.д.

Простейшая форма отправки данных на почту при помощи HTML и PHP


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

Язык разметки HTML сам по себе несложен, нужно всего лишь разобраться в том как и где ставить те или иные теги. С языком программирования PHP все немного сложнее.

Для программиста создать такую форму не составит труда, а вот HTML верстальщику может показаться сложным некоторые действия.

Создаем форму отправки данных в html

На этом этапе нужно создать файл form.php, в него добавить html код формы. Подробности о каждом элементе формы читайте в статье Как сделать форму в HTML для сайта.

Первая строка будет следующей

Теперь соберем все вместе.

Теперь сделаем так, чтобы поля в форме стали обязательными для заполнения. Имеем следующий код:

Создаем файл, принимающий данные из HTML формы

Это будет файл с именем send.php

В файле на первом этапе нужно принять данные из пост массива. Для этого создаем две переменные:

$fio = $_POST[‘fio’];
$email = $_POST[’email’];

Перед названиями переменных в php ставится знак $, в конце каждой строки ставиться точка с запятой. $_POST это массив в который передаются данный из формы. В форме html при этом указан метод отправки method=»post». Так, приняты две переменные из формы html. Для целей защиты своего сайта нужно провести эти переменные через несколько фильтров — функций php.

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

$fio = htmlspecialchars($fio);
$email = htmlspecialchars($email);

При этом новые переменные в php не создаются, а используются уже имеющиеся. Что сделает фильтр, он преобразует символ » $fio = urldecode($fio);
$email = urldecode($email);

Третей функцией мы удалим пробелы с начала и конца строки, если таковые имеются:

$fio = trim($fio);
$email = trim($email);

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

Проверка данных, передаваемых от HTML формы в файл PHP

Для того, чтобы проверить, работает ли этот код, передаются ли данные можно просто их вывести на экран при помощи функции echo:

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

Отправляем полученные данные из формы HTML на почту при помощи PHP

Для отправки данных на почту нужно воспользоваться функцией mail в PHP.

mail(«на какой адрес отправить», «тема письма», «Сообщение (тело письма)»,»From: с какого email отправляется письмо \r\n»);

Например, нужно отправить данные на email владельца сайта или менеджера example@mail.ru.

Тема письма должна быть понятной, а сообщение письма должно содержать то, что указал пользователь в HTML форме.

mail(«example@mail.ru», «Заявка с сайта», «ФИО:».$fio.». E-mail: «.$email ,»From: example2@mail.ru \r\n»);

Необходимо добавить условие, которе проверит отправилась ли форма при помощи PHP на указанные адрес электронной почты.

if (mail(«example@mail.ru», «Заказ с сайта», «ФИО:».$fio.». E-mail: «.$email ,»From: example2@mail.ru \r\n»))
<
echo «сообщение успешно отправлено»;
> else <
echo «при отправке сообщения возникли ошибки»;
>

Таким образом программный код файла send.php, который отправит данные HTML формы на почту будет выглядеть следующим образом:

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

Помещаем HTML и PHP код отправки формы в один файл

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

Мастер Йода рекомендует:  Изучаем Angular текстовые туториалы
Добавить комментарий