|
Пишем на PHP: in.class (начало)Руслан Курепин
Ну как читабельно пока еще? Раз читаете, значит —
читабельно. Честно говоря, добавление и редактирование рубрик — настолько редкая задача, что можно было бы не писать ничего подобного, а ручками отправлять в SQL-запросы, когда надо что-то изменить в таблице рубрик. Но поскольку мы пишем большой и самодостаточный проект, то пропустить даже такую мелкую задачу не приходится. Для начала, я вас прошу, создайте новый класс. Класс, который будет отвечать за добавление данных. По нашей с вами терминологии он называется class.in. А файл, соответственно, in.class. Создали? Все заголовки для нового класса оформили? Все парные теги и скобочки закрыли? Ай, молодцы. Приятно работать с внимательными учениками. Ввод данных. Прежде чем броситься писать функцию, пихающую в базу какие-то данные, давайте поразмыслим о том, какие подготовительные этапы могут нам понадобиться. "Ну какие еще подготовительные этапы", — скажет нетерпеливый программист. Написать один запрос в базу, запихивающий строку-название раздела, и всего делов. Так-то оно так... да не так. А если сайтом управляет полный неуч? Или, того хуже, — в руки к злоумышленнику попала панель управления сайтом, и он начнет искать уязвимые места, чтобы нанести урон системе? Вот именно! Первым этапом мы обязаны проверить те данные, которые собираемся заносить в базу. Это не сложно. Надо для себя описать условия, которым должна удовлетворять строка текста, которую мы добавляем в качестве названия раздела. Я говорю добавляем, так как сначала пишем функцию добавления нового раздела. Если я не ошибаюсь, то наша строка-название должна удовлетворять следующим параметрам: быть не короче одного символа, быть не длиннее пятидесяти символов и не должна дублировать уже существующую рубрику. Вот так и напишем (готовьте файл utils, будем добавлять в него первые сообщения об ошибках). И сразу, чтобы ничего не забыть, добавляем в список ошибок (файл utils.class) наши новые ошибки. Вот так. Теперь, уже по традиции, пережевываю написанное в кашку. $name=AddSlashes($name); — это очень важная и очень удобная функция PHP, которая добавляет слеши "\" ко всем символам, которые MySQL может интерпретировать как управляющие команды, превращая их в обычные текстовые символы. Более всего, это относится к кавычкам. Если в названии нашей рубрики встретится кавычка, то интерпретатор MySQL воспримет эту кавычку как управляющую (открывающую или закрывающую) и наш запрос к базе данных будет иметь совсем не тот вид, на который мы рассчитываем. К сожалению, многие забывают об этом (или не обращают на это внимание), за что и расплачиваются. В Сети добрая половина скриптов не имеет подобных превентивных проверок, что приводит к частым взломам сайтов и проникновению в их базы данных. Я бы мог показать вам серию несложных приемов, с помощью которых можно прощупать систему и нарушить работу стандартных функций сайтов: гостевых книг, форумов, форм оправки почты и получения чужих паролей, содержащихся в базах. Но я вас учу не взламывать чужие сайты, а защищать свои. Поэтому, будем заострять внимание на том, как надо оформлять безопасность скриптов, а не наоборот. Вам не надо помнить весь набор управляющих символов. Функция PHP AddSlashes() сама знает, куда надо добавить слеши. Обращаю ваше внимание на то, что в конфигурационном файле php.ini, где лежат настройки правил работы php-интерпретатора, есть параметр, отвечающий да добавление слешей в данные, передаваемые скрипту через web-форму. Проконсультируйтесь в службе поддержки вашего провайдера: включен ли этот параметр управления. Я предпочитаю его выключать и самостоятельно заботиться о безопасности. В противном случае мои скрипты могут в миг оказаться "дырявыми", если этот параметр по чьей-то воле изменит свое значение. Далее мы производим проверку на длину строки, которую получили в качестве параметра. Функция PHP strlen() вернет нам количество символов в той строке (или переменной), которую мы передали ей в качестве параметра. Тут все очевидно и пояснять нечего, только обратите внимание, что в PHP знак сравнения обозначается в виде сдвоенного "равно". Ибо одинарное "=" — во всех ситуациях выполняет присваивание. Будьте с эти внимательны. И, наконец, мы производим проверку на существование такого раздела в базе. В четыре строки. 1. Оформляем запрос в базу. Запрос совсем простой — комментировать его не стану. 2. Вызываем нашу функцию активации запроса (кто забыл, как она работает, обратитесь к главе "PHP: mysql.class"). 3. Проверяем, не случилось ли ошибки. Обратите внимание, в классическом виде строка в скобках if() должна была бы иметь условие: if($this->sql_err>0) return(11); Но, так как 0 — это "правда" по логике PHP, а любое другое число — "ложь", мы опускаем знак "больше", будучи уверенными, что условие сработает и без этого, если значение переменной sql_err не равно 0 — нормальному завершению операции. 4. И четвертой строкой мы проводим ту самую проверку на дублирование строки в базе. Функция PHP mysql_num_rows(), получая в качестве параметра ссылку на результат запросу в БД, возвращает нам количество найденных запросом строк. И если возвращенное значение не равно 0, значит такая строка в базе найдена, и нам остается только вернуть соответствующий код ошибки — 23. Поэтому, тут мы тоже можем смело опустить условие ">0". Не знаю, догадались ли вы уже или нет, команда PHP return() не только возвращает из нашей функции указанное в скобках значение, но и немедленно прекращает выполнение данной функции, возвращая управление той, из которой произошло обращение. Другими словами, в цепочке наших проверок остановка выполнения скрипта произойдет на той строке, где прежде всего сработает команда return. Это очень удобно. И так. Мы с вами написали функцию проверки корректности добавляемого названия раздела и приведения строки к безопасному виду, готовому к употреблению в MySQL. Завтра мы совершим добавление самой строки, изменение ее и удаление, если ничто не помешает нам это сделать.
|
Copyright © <LMTH>. Все материалы являются собственностью их авторов.
При перепечатывании ссылка на http://www.magaz.org/ как на источник информации обязательна. Правила использования материалов журнала |