Картинка captcha комбинация из любой картинки размером 400х40 пикселей и поля input
На работе потребовалось решить проблему со спамом, так как старую капчу легко обходили спамботы. Погуглив и не найдя нужных вариантов, решил написать свой, да и давно хотелось, если честно.
И так, суть капчи в том, что пользователю отображается несколько иконок и необходимо выбрать ту, которая логически не вписывается в общий ряд. Думаю в интернете таких вариантов море, но я не нашел (ну если честно не особо то и искал).
Начнем
Принцип работы следующий: собирается две группы иконок, одна это массив с правильными вариантами, другая с неправильным. Собирается в общий массив, при этом ключ неправильной картинки (порядковый номер элемента массива) записывается в сессию.
Из всех иконок собираем одно изображение, которое потом будем резать с помощью background-position.
Форма представляет собой радиокнопки с value от 1 и до количества иконок. Отправляем с помощью POST форму с нажатым value и сверяем его с тем числом, что мы положили в сессию, все довольно просто.
И так, есть директория, где лежат группы иконок:
Весь функционал реализован в одном классе. Разберем поподробнее:
1. Несколько приватных переменных, для хранения значений, которые пишутся в конструкторе.
2. Собственно сам конструктор, которому передается 4 параметра.
3. С набором правильных и неправильного вариантов все просто, обычный scandir() и запись в массив, разве что запись в сессию нужного варианта происходит следующим образом:
где $true_icon — искомая нами иконка, а $array_of_icons конечный массив с иконками.
4. Создание конечного изображения из иконок.
5. Получаем адрес, по которому будем вызывать создание полноценной картинки.
6. И наконец финальный метод, выводящий саму форму и все все все. Следовало бы тут, конечно, убрать стили, но т.к. тут задается background-image, который провоцирует вызов makeSprite() и собственно создается капча (а так же таким вот кривым методом решаем проблему с кэшированием), то решил оставить.
Вот как выглядит вызов на одном из примеров, происходит это дело в конфигурационном файле:
Далее просто подставляем ICONCAPTCHA в нужную нам форму, а проверяем ее банальным сравнением: $_POST[‘radio_val’] == $_SESSION[‘iconcaptcha’].
Сегодня, благодаря господам спам-ботам и иже с ними, в сети практически невозможно что-либо сделать без ввода символов со сгенерированного изображения — CAPTCHA (далее — капча). Фактически, это предотвращает выполнение какого-либо скрипта без участия человека, и в этом топике я расскажу, как такую капчу создать средствами PHP, а так же упомяну очень полезный топик другого хабраюзера, который пригодится при разработке изображения-капчи.
Сразу же предупреждаю, что топик может быть интересен только начинающим разработчикам, так как по сути я изобретаю велосипед, но зато своими руками.
Основные правила
При разработке капчи нужно обязательно соблюдать несколько основных правил:
1. Капча создана для людей
Она должна сходу читаться, но не в ущерб стойкости к распознаванию. Очень наглядный пример капчи, не соблюдающей это правило — изображение справа.
2. Генератор капчи должен быть четко ограничен в используемых символах
Наглядный пример — изображение в начале топика. Конечно, reCAPTCHA — чудесное изобретение, но порой она предлагает ввести символы, которые и в charmap найти сложно. Кстати, когда речь идет о капче с использованием кириллических символов — ни в коем случае генератор не должен использовать букву «ё». Лично я знаю много людей, у которых на ~ (тильда / ё) повешено какое-то действие в системе.
3. Капча должна быть стойкой к распознаванию
… но не в ущерб читаемости. Вообще, этот пункт — самый сложный во всей разработке. Необходимо найти золотую середину — капча сходу читается людьми и вообще (насколько возможно) не читается ботами. Так же необходимо учитывать специфику ресурса, на котором планируется использовать капчу, и его контингента. Если речь идет о, допустим, форуме читающих домохозяек за сорок, то на стойкость капчи можно плюнуть с высокой башни — никому он не упрется. Если речь идет о, например, имейджборде, то тут нужна капча а-ля вырвиглаз.
Проектирование
В качестве теоретического объекта, для которого мы будем делать капчу, выступит сферический форум в вакууме, с умеренно агрессивными, умеренно умными и вообще умеренными пользователями. В разработке такой капчи нам поможет очень полезный топик от хабраюзера Pastafarianist. А именно я обращу внимание на перечисленные недостатки и достоинства взятых им капчей.
Итак, по порядку перечислим, что же мы можем использовать:
1. В изображении должно использоваться хотя бы несколько цветов. Желательно всегда разные
Изображение выше — пример того, как это выглядит в действии. На самом деле, это не очень надежный вариант, так как текст с фоном очень контрастирует. Разберемся с цветами позже.
2. Должен присутствовать шум
Прописная истина. Практически в любой капче можно встретить шум, который чаще всего выражается во множестве линий, пересекающих текст, разной длины и под разным углом.
3. Буквы должны находиться на небольшом расстоянии друг от друга
Тут главное не перестараться. Чрезмерное сближение символов приведет к сильному ухудшению читаемости человеком. На примере выше можно заметить, что буквы слипаются, это создает препятствие для бота при сегментации изображения.
4. Размеры символов должны быть разными
Если применять этот трюк, то надо помнить, что препятствие фактически выражается в том, что для сегментации капчи бот не сможет использовать постоянную матрицу. Поэтому если и делать размер символов разным, то обязательно для каждого символа размер должен быть случайным, динамическим.
5. Отвратительный шрифт
Очень полезный способ. Засечки, курсив, стилизация — отличные подводные камни для бота. Так же в сочетании с шумом в виде линий очень хорошо будет смотреться тонкий шрифт. Если абстрагироваться от первого правила генерации капчи, то можно использовать множество шрифтов сразу, к примеру свой шрифт для каждого символа.
6. Символы под случайным углом
Весьма действенный способ оградиться от ботов. Опять же, сегментация будет усложнена, хоть и не значительно. Лучше всего выбрать небольшой диапазон угла, иначе же читаемость сильно испортится (буквы будут наплывать друг на друга).
7. Динамические искажения
Ничего ужаснее человечество еще не придумало. Искажения в капче зачастую очень сильно снижают читаемость человеком. Разумеется, это достаточно эффективно против ботов, но это так же эффективно и против людей. Главное — не перестараться, искажения должны быть незначительными.
Итак, что же мы сделаем:
— Контрастный фон, с шумом
— Линии за текстом, линии на тексте
— Текст в случайном положении
— Количество символов будет случайным, от 4 до 7
— Размер каждого символа будет случайным
— Цвет текста каждый раз будет случайным
— Символы будут слегка прикасаться
— Каждый символ будет под случайным небольшим углом
Разработка
Определимся с целью:
— Генерация шума
— Генерация текста
— Форма с возможностью обновления капчи
— Обработчик введенных данных
По мере написания статьи понял, что искажения в данном случае абсолютно неуместны. Для тех, кому они все же нужны — в конце топика ссылка на урок по созданию искажений.
Пишем форму
Тут все предельно ясно, но на всякий случай я откомментировал некоторые строчки. Кстати, обратите внимание, я не установил параметр maxlenght у поля ввода. В большинстве случаев, разработчики устанавливают этот параметр, указывая размер капчи. Во-первых это нехилая такая подсказка для бота, во-вторых у нас количество символов будет динамическим. Все, интерфейс мы написали, пора приступать к созданию скрипта генерации
Пишем генератор кода капчи (random.php)
Тут все ограничивается только вашим воображением. Как-то я видел иной способ — выбиралась текущая минута, час, месяц, все это перемножалось, из этого выбирались 10 случайных символов, дважды извлекался MD5-хеш, из него извлекались 6 случайных символов и затем все это еще и перемешивалось. Кстати, обратите внимание на выбранные мною символы — я исключил такие как i, l, 1 и 0, o, c, из-за того, что они слишком похожи друг на друга, в некоторых ситуациях пользователь может ошибиться. Генератор я назвал random.php (далее он будет запрашиваться в других скриптах).
Пишем генератор изображения (captcha.php)
Весь код максимально закомментирован. Для проверки введенной капчи обработчиков вносим ее хэш в куки. Для выбора шрифта и фона я сделал массивы, что бы можно было засунуть туда десяток шрифтов и десяток фонов, каждый раз выбираться будут случайные. Шрифт выбрал Droid Sans, он тонкий и среди шума плохо заметен. Кстати, в данном случае я выбрал ужасный, отвратительный и контрастный фон, демонстрация будет в конце топика. К моему удивлению, на читаемость человеком это не повлияло, шрифт достаточно хорошо выделяется, не смотря на то, что цвет шрифта выбирается из случайного пикселя на фоне.
Пишем обработчик (go.php)
Тут все предельно ясно. Берем куки, записанную ранее в captcha.php, берем введенный код, точнее его хэш и сравниваем. Внимание! Если планируете пользоваться этим кодом, не забудьте изменить алгоритм проверки.
Результат
Результат получился весьма неплохим, полностью оправдав мои ожидания (прошу, пожалуйста, заметить, что я не ставил себе цель сделать непробиваемую капчу). Протестировать на стойкость его можно вот тут (надеюсь, мой сервак не упадет под хабраэффектом).
На самом деле, мой код — это лишь шаблон, над которым вы можете издеваться как угодно. А еще на самом деле это не нужно — есть reCaptcha, но лично мне доставило удовольствие делать этот скрипт, пока делал прочитал гору документации, надеюсь, что кто-нибудь подчерпнет знания из моего топика :)
Footer
Как и обещал, вот очень полезный код для искажения текста, если кому пригодится.
Не кидайтесь помидорами, пожалуйста :) Это мой первый технический топик на хабре.
И да, я не имею понятия, каким образом работают современные капчи, я просто и не искал никакой информации на эту тему. Если мои методы кажутся вам индийскими — прошу немедленно написать об этом в ЛС / комментарии, я с удовольствием почитаю :) Из недостатков моего метода я вижу только то, что если в браузере не включены куки, то через эту капчу не пройти.
Captcha (капча) – это некий тест, который человек решает очень легко, а робот – нет (научить компьютер решать его крайне сложно и затруднительно).
Другими словами, основная цель капчи – это определить кем является пользователь: человеком или роботом .
В большинстве случаев капча отображается как некоторый искаженный или наложенный на фон текст, который посетителю сайта необходимо разобрать и ввести его в некоторое поле. Кроме текста на фоне используется и другие алгоритмы: найти среди множества картинок правильные, собрать пазл, переместить слайдер, нарисовать связь между несколькими картинками и т.д.
Получение ключей reCAPTCHA
Для доступа к консоли администратора необходимо иметь аккаунт в Gmail. Если учётной записи нет, то её нужно завести.
После этого необходимо нажать на значок «+».
В открывшейся форме нужно:
При успешной регистрации Google будут выданы 2 ключа:
- публичный (его нужно вставить в HTML-код);
- секретный (на сервере, для установления обмена данными между сайтом и сервисом reCAPTCHA, т.е. для получения ответа о результатах решения капчи пользователем);
Скрипт для обновления капчи на форме
Код для обновления капчи при нажатию на кнопку .captcha__refresh :
Добавление обработчика к кнопке выполняется через addEventListener .
Исходные коды капчи
Исходные коды капчи расположены на GitHub: itchief/captcha.
Скриншот формы с капчей:
Процесс разработки капчи представлен в виде следующих этапов:
- верстка формы;
- создания файла «captcha.php» для генерация кода капчи и изображения;
- написание обработчика для формы (файл «process-form.php»);
- написание JavaScript для отправки формы на сервер через AJAX и обработки ответа.
JavaScript для отправки формы на сервер через AJAX
Код для отправки формы на сервер через AJAX и обработки полученного результата:
В этом коде отправка данных через AJAX выполняется посредством fetch() . Получение данных формы с использованием FormData .
Для отправки и получения cookie посредством fetch() установим:
Если в success находится значение false , то будем помечать поля, которые не прошли валидацию и выводить подсказки:
Содержимое файла captcha.php :
Данный файл выполняет следующие действия:
- инициализацию системы MODX (это необходимо сделать для того, чтобы сгенерированный код капчи можно было использовать в элементах этой системы, например, в сниппетах);
- генерирование защитного кода и его регистрация в сессионной переменной;
- представление сгенерированного кода в виде изображения (в формате PNG).
Данный скрипт позволяет использовать несколько капч на одной странице. Это осуществляется посредством вызова данного файла с параметром id . В качестве значения ключа id необходимо указать имя CAPTCHA (например, captcha1 ).
Добавление капчи в HTML-форму
Вставить в HTML-форму, указанную в параметре form сниппета AjaxForm , следующий код капчи:
Сниппет randomNumber предназначен для добавления случайного GET параметра (текущей метки времени с микросекундами) к URL. Это действие необходимо сделать для того, чтобы браузер не кэшировал ответ файла captcha.php .
Пример сниппета RandomNumber :
Интегрирование recaptcha в php скрипт
Установка recaptcha в скрипт php осуществляется посредством внесения в файл process.php следующих изменений:
Пример использования нескольких капч на одной странице
Для того чтобы на одной странице можно было использовать несколько капч необходимо в каждую HTML форму внести следующие изменения:
Google reCAPTCHA – это сервис для защиты вашего сайта от ботов и других атак.
Формы обратной связи, комментирования, регистрации, авторизации, оформление заказа довольно часто подвергаются спам атаке. Чтобы их защитить от ботов и злоупотребление можно воспользоваться reCAPTCHA.
Версии Google reCAPTCHA:
- reCAPTCHA v2 – проверка пользователя с нажатием на флажок «Я не робот» («I'm not a robot»), бесплатно до 1 млн проверок в месяц;
- reCAPTCHA v3 – проверка пользователя в фоновом режиме не требующая от него никаких действий (бесплатно до 1 млн запросов в месяц);
- reCAPTCHA Enterprise – предназначена для комплексной защиты всего сайта от мошеннических действий (версия платная, ориентировочная стоимость около 1$ за 1000 запросов).
Применение капчи для защиты FormIt формы
Для обработки формы будем использовать дополнение (сниппет) FormIt в сочетании с AjaxForm . Сниппет AjaxForm необходим для того, чтобы обеспечить работу с FormIt через AJAX. Более подробно изучить работу сниппетов FormIt и AjaxForm можно в статье Как в MODX Revolution создать AJAX форму обратной связи.
Для внедрения капчи в форму необходимо выполнить следующие действия:
- создать кастомный валидатор для FormIt ;
- назначить проверку кода капчи этому валидатору;
- добавить в HTML форму элементы ( img - изображение капчи, input - поле для ввода разгаданного кода);
- вставить на страницу JavaScript сценарий, который будет обновлять код капчи.
Написание обработчика формы
Для обработки формы создадим файл «process-form.php» в папке «/assets/php/»
В этом файле будем сравнивать текст капчи, который пользователь ввел в форме с тем, который у нас хранится в сессии или куки.
В качестве результата будем возвращать JSON. В случае успеха:
В противном случае, success присвоим значение false , а в errors поместим ошибки:
По умолчанию этот файл сравнивает капчу со значением, находящимся в сессии. Если в «captcha.php» сохраняете капчу в куки, то здесь необходимо закомментировать секцию 1a и раскомментировать 1b:
Вызов сниппета AjaxForm с проверкой капчи
Добавить в вызов сниппета AjaxForm ( FormIt ):
- параметр customValidators со значением isCaptchaValid ;
- проверку поля CAPTCHA с помощью валидатора isCaptchaValid (параметр validate ).
Пример вызова сниппета AjaxForm с проверкой капчи:
Подключение recaptcha к HTML-документу
Подключение виджета reCAPTCHA к странице осуществляется посредством выполнения 2 действий:
- Включения в страницу JavaScript скрипта recaptcha.
- Добавление элемента div с классом "g-recaptcha" и атрибутом data-sitekey , имеющий в качестве значения ваш публичный ключ (public key) капчи.
Кроме этого, добавим на страницу ещё элемент div с идентификатором . Данный элемент будем использовать для отображения ошибки, связанной с google racaptcha.
Кроме этого необходимо будет внести ещё изменения в файл script.js , т.к. форма обратной связи отправляется на сервер через AJAX.
Генерация кода капчи и изображения
Формирование кода капчи и изображения выполним в файле «captcha.php», который поместим в папку «/assets/php»:
Генерирование текста капчи выполняется очень просто. Для этого в переменную $chars помещаются символы, из которых она может состоять. Далее с помощью функции str_shuffle() эти символы случайным образом перемешиваются и посредством substr выбирается первые шесть из них.
Сохранении полученной капчи по умолчанию осуществляется в сессионную переменную. Но если хотите в куки, то установите переменной $use_session значение false :
Для отправки капчи клиенту создается изображение, имеющее фон «bg.jpg», на котором с помощью функции imagefttext() пишется текст капчи.
JavaScript сценарий для обновления кода капчи
Вставить на страницу сценарий JavaScript, который будет обновлять код капчи в форме:
- после получения ответа от сервера;
- при нажатию на кнопку "Обновить".
Создание пользовательского валидатора для FormIt
Для проверки того правильно или нет пользователь решил капчу напишем кастомный валидатор (например, имеющий имя isCaptchaValid ):
Верстка формы
Подключение reCAPTCHA v2 или v3
Установку Google reCAPTCHA v2 или v3 для проверки форм можно представить в виде следующих шагов:
- получение ключей (site и secret) для сайта;
- вставка виджета и скриптов гугл капчи на HTML страницу;
- передача ответа на сервер;
- получение на сервере результата решения капчи.
Готовая форма обратной связи с recaptcha
Бесплатно загрузить форму обратной связи с recaptcha можно по следующей ссылке:
Изображения готовой формы, в которую интегрирована recaptcha.
Статьи, связанные с этой темой:
Установка recaptcha на сайт
Подключение reCAPTCHA к сайту (странице) осуществляется как на стороне клиента (в HTML), так на стороне сервера (в PHP).
Разберём, как это осуществляется более подробно. В качестве примере выберем ajax форму обратной связи.
Комментарии:
Преведствую, Вас Александр! Внедрил на сайт сие чудо творение. Все четко и слаженно работает! Вам огромная благодарнность за Ваши труды! Могли бы Вы помочь в доработке? А именно: подключить валидацию имени, e-mail, а также № тел — что бы могли вписывать не совсем умные, то есть просто набирать цифры, а символы и пробелы должны подставлятся автоматом с формы. как реализовать checkbox или другой вариант — возможность указать не только URL, а и возможность вставки URL страницы соцсети по клику или… варианты?
Заранее благодарен!
У себя на сайте в форме регистрации для валидации использую php либу grecaptcha:
На самой странице:
В принципе все отлично работает.
Но, к примеру при регистрации юзера после submit формы рекапча валидировалась, а какое-либо поле (логин, e-mail и т.п.) не прошло валидацию.
Юзер исправляет данные. При этом рекапча уже отмечена решенной.
А при повторном submit формы — получаем ошибку валидации timeout-or-duplicate
Погуглив данную ошибку понял, что API рекапчи не позволяет её верифицировать более одного раза по одному и тому же токену.
Думаю, что для решения проблемы, при получении ошибки либо НЕвалидации какого-либо поля нужно перезапускать рекапчу.
Долго гуглил — как я понял через php это не предусмотрено, а через js — grecaptcha.reset();.
Можете помочь советом, как это «прикрутить»?
В документации есть опция error-callback. Может можно решить задействовав её?
Привет! Необходимо вызвать grecaptcha.reset() в коде JavaScript в котором обрабатываете ответ от сервера.
Подскажите пожалуйста как использовать капчу дважды на одной странице?
У меня разные формы на странице. При отправке первой формы (идет выше в DOM) все прекрасно. При отправке второй формы grecaptcha.getResponse() не получает код капчи и соответственно дальше скрипт не работает
Посмотрите в этой теме: Защита сайта с помощью invisible reCAPTCHA.
В ней имеется раздел «Несколько invisible reCAPTCHA на одной странице». Здесь необходимо будет создать что-то подобное.
Recapcha нормально работает с contact form 7. Но мне нужно установить ее в вордпрессе на форму комментариев на других страницах сайта. Спам замучал… Как это сделать?
Заранее благодарен.
Добрый день Александр. А как можно сделать простую защиту файла от ботов. Чтобы файл открывалась только после recaptch'и.
Здравствуйте! Почта настраивается здесь:
Но, лучше, конечно, это сделать через SMTP. Для этого код, приведённый выше лучше заменить на этот (вместо звёздочек следует установить свои значения):
Спасибо за Ваш ответ. Я выбрал отправку по SMTP, но не знаю что прописать вместо ***
Вот данные почты, помогите пожалуйста заполнить.
SSL можно указать так:
Как добавить в форму новое поле подробно описывал в этой статье. Она, конечно, немного отличается от этой, но принцип такой же.
с этим вылезла ошибка, письмо не отправляется.
Как добавить в форму новое поле подробно описывал в этой статье. Она, конечно, немного отличается от этой, но принцип такой же.
Я посмотрел и попытался сделать. Добавил в индексный файл
а в файл process.php добавил:
перед:
добавил
далее добавил pol тут
и тут
в итоге письмо отправляется, на почту приходит слово Пол, но выбранная опция не приходит.
Я не разбираюсь в php, помогите пожалуйста.
Может порт с использованием ssl какой-то другой.
В этой форме ещё нужно добавить код в «script.js»:
Письмо не ушло. На почте ничего нет, но в файле message.txt оно появилось.
Приведу код на всякий случай
Добрый день.
Спасибо за инструкцию.
Помогите, пожалуйста.
1. Нет файла process.php Где он может лежать? Или его нужно создать?
2. Файл script.js у меня в шаблоне сайта, это нормально, код капчи будет в нем работать?
Спасибо.
process.php лежит в корне feedback, там же где и index.html
По: script.js Он может лежать где угодно, главное измените путь под комментарием //URL-адрес запроса
Спасибо за ответ.
Странно, прошерстил toal comannder, process.php нет нигде.
У меня cms joomla, может он имеет другое название?
Здравствуйте Александр.
Спасибо за труды и форму. Все работает отлично.
Не подскажете как добавить 4 input'a radio в вашу форму? Или хотя бы ссылку на мануал для нубов)
Буду очень благодарен.
Здравствуйте! Спасибо за отзыв!
Алгоритм для добавления радиокнопок в форму будет следующий.
1. Добавить переключатели в разметку формы (в «index.html»):
2. Включить значение выбранной радиокнопки в FormData (для отправки на сервер). Для этого нужно добавить следующий код в «script.js»:
3. Добавить в «process.php» код для получения значения поля color из POST и включить его значение в данные для отправки на почту:
Ссылка на архив: контактная форма с radio
Александр Мальцев, спасибо за суету с формой с радио, но я уже разобрался с этим.
Но труды я думаю не напрасны, кому то это пригодится
Сделал для нескольких типов файлов, как вы писали ниже.
// открываем сессию
session_start();
// переменная в которую будем сохранять результат работы
$data['result']='error';
// разрешённые типы файлов
$allowedExtension = array(«jpg», «jpeg», «gif», «png», «xls», «xlsx», «zip», «doc», «rar»);
// директория для хранения файлов ()
$pathToFile = $_SERVER['DOCUMENT_ROOT'].'/templates/mysite/feedback/files/';
// максимальный размер файла
$maxSizeFile = 3072000;
// ваш секретный ключ
$secret = '6gfgAAAgM458madp_-Qn9gRPSpmJm';
// функция для проверки длины строки
function validStringLength($string,$min,$max)
$length = mb_strlen($string,'UTF-8');
if (($length<$min)
else {
return true;
}
}
// если данные были отправлены методом POST, то…
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// если не существует ни одной ошибки, то прододжаем…
if ($data['result']=='success') {
// однократное включение файла autoload.php (клиентская библиотека reCAPTCHA PHP)
require_once (dirname(__FILE__).'/recaptcha/autoload.php');
// если в массиве $_POST существует ключ g-recaptcha-response, то…
if (isset($_POST['g-recaptcha-response'])) {
// создать экземпляр службы recaptcha, используя секретный ключ
$recaptcha = new \ReCaptcha\ReCaptcha($secret);
// получить результат проверки кода recaptcha
$resp = $recaptcha->verify($_POST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);
// если результат положительный, то…
if ($resp->isSuccess()){
// действия, если код captcha прошёл проверку
//обработаем файлы, загруженные пользователем посредством элементов с name=«images[]»
// если ассоциатианый массив $_FILES[«images»] существует, то
if(isset($_FILES[«images»])) {
// переберём все файлы (изображения)
$files = array();
foreach ($_FILES[«images»][«error»] as $key => $error) {
// если ошибок не возникло, т.е. файл был успешно загружен на сервер, то…
if ($error == UPLOAD_ERR_OK) {
// имя файла на устройстве пользователя
$nameFile = $_FILES['images']['name'][$key];
// расширение загруженного пользователем файла в нижнем регистре
$extFile = mb_strtolower(pathinfo($nameFile, PATHINFO_EXTENSION));
// размер файла
$sizefile = $_FILES['images']['size'][$key];
//myme-тип файла
$filetype = $_FILES['images']['type'][$key];
// проверить расширение файла, размер файла и mime-тип
if (!in_array($extFile, $allowedExtension)) {
$data['files']='Ошибка при загрузке файлов (неверное расширение).';
$data['result']='error';
} elseif ($sizefile > $maxSizeFile) {
$data['files']='Ошибка при загрузке файлов (размер превышает 3МБ).';
$data['result']='error';
} elseif (!in_array($filetype, $allowedExtension)){
$data['files']='Ошибка при загрузке файлов (неверный тип файла).';
$data['result']='error';
} else {
//ошибок не возникло, продолжаем…
// временное имя, с которым принятый файл был сохранён на сервере
$tmpFile = $_FILES['images']['tmp_name'][$key];
// уникальное имя файла
$newFileName = uniqid('img_', true).'.'.$extFile;
// полное имя файла
$newFullFileName = $pathToFile.$newFileName;
// перемещаем файл в директорию
if (!move_uploaded_file($tmpFile, $newFullFileName)) {
// ошибка при перемещении файла
$data['files']='Ошибка при загрузке файлов.';
$data['result']='error';
} else {
$files[] = $newFullFileName;
}
}
} else {
//ошибка при загрузке файл на сервер
$data['result']='error';
}
}
}
} else {
// иначе передать ошибку
$errors = $resp->getErrorCodes();
$data['error-captcha']=$errors;
$data['msg']='Код капчи не прошёл проверку на сервере';
$data['result']='error';
}
} else {
$data['result']='error';
}
}
} else {
//ошибка, не существует ассоциативный массив $_POST[«send-message»]
$data['result']='error';
}
// создаём экземпляр класса PHPMailer
$mail = new PHPMailer;
// отправляем письмо
if ($mail->Send()) {
$data['result']='success';
} else {
$data['result']='error';
}
//после загрузки веб-страницы
$(function () {
// если форма валидна и длина капчи не равно пустой строке, то отправляем форму на сервер (AJAX)
if ((formValid) && (captcha.length)) {
// объект, посредством которого будем кодировать форму перед отправкой её на сервер
var formData = new FormData();
// добавить в formData значение 'name'=значение_поля_name
formData.append('name', name);
// добавить в formData значение 'email'=значение_поля_email
formData.append('email', email);
// добавить в formData значение 'message'=значение_поля_message
formData.append('message', message);
// добавить в formData файлы
// получить все элементы с атрибутом name=«images[]»
var images = document.getElementsByName(«images[]»);
// перебрать все элементы images с помощью цикла
for (var i = 0; i < images.length; i++) {
// получить список файлов элемента input с type=«file»
var fileList = images[i].files;
// если элемент не содержит файлов, то перейти к следующей
if (fileList.length > 0) {
// получить первый файл из списка
var file = fileList[0];
// проверить тип файла и размер
if ((file.type.match('image.*')) && (file.size <524288)) {
// добавить его (файл (file) с именем file.name) в formData
formData.append('images[]', file, file.name);
}
}
}
// добавить в formData значение 'g-recaptcha-response'=значение_recaptcha
formData.append('g-recaptcha-response', captcha);
Читайте также: