Pull to refresh

Comments 31

UFO just landed and posted this here
У вас просто задача была другая и это логично использовать для каждой свое решение.
Если чисто для отправки СМС, то это самый работоспособный метод. В сети также можно найти bash-скрипт, который делает тоже самое – отправляет СМС на латинице и в PDU и изначально я использовал его, но у него нет плюшек типа flash и replacemessage.
Если же PDU не требуется, то можно вообще отправлять через терминал AT-командами и тогда ни какие доп. скрипты не понадобятся

Объясни пожалуйста, что делает этот код?


function XSS_secure() {

    function replace($arr) {
        $filter = array("<", ">");
        $filter_replace = array("<", ">");

        for ($i=0; $i < count($filter) ; $i++) {
            $str = str_replace($filter[$i], $filter_replace[$i], $arr);
        }
    return $str;
    }

    if ($_GET) $_GET = replace($_GET);
    if ($_POST) $_POST = replace($_POST);

}

С виду — ничего. Заменяет «<» на «<» и «>» на «>». А что если я передам ?a[b][c]=hello? Код либо сломается, либо станет опасно.
Параметры из реквеста прямо в код. Хорошо, что prepared statements используются еще.
Ну и вообще, глядя на код, ощущение, что я вернулся на 10 лет назад. Очень небрежно.
Советовать другим сделать так же для отправки — это прям таки грех)

Он заменяет на lt; и gt; просто редактор Хабра показывает одно и то же…

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

Я на самом деле буду благодарен, если вы скажете, что можно поправить и где… Заранее спасибо!

UPD Проверил, если вы передадите smsc.php?a[b][c]=hello?, то получите в ответ:
{«error_code»:403,«error_message»:«Forbidden»,«description»:«Check your login and password»}

Хорошо. str_replace в 3 аргументе будет обрабатывать только корневые элементы. Если там массив — он их проигнорирует. Я не очень понимаю, зачем нужна такая замена, но выглядит так, что в какой-то версии php это вывалит ошибку


  1. Нужно валидировать те параметры, которые используются в апи.
  2. PSR. Классы с нижними подчеркиваниями использовали в php до 5.3 (кажется) версии, которые эмулировали namespace. autoload и прочее — лучше использовать это, т.к. такой код станет более понятен другим php-разработчикам
  3. cron — это привязка к железу. Запуск каждые 10 секунд таким образом — зачем? Запустите демона, который будет в цикле раз в 10 секунд вычитывать сообщение. А лучше отправляйте через очереди. Вы получите легкую возможность масштабирования и избавитесь от лага в 10 сек на отправку
    Со всем этим вам поможет справиться какой-нибудь небольшой фреймворк или пара пакетов из composer.

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

Что касается такой замены < на lt, это позволяет избавиться от возможности, например запустить скрипт, но при этом если этот символ реально нужен в тексте, то он визуально не изменится. Если бы мы меняли < на _/, к примеру, это бы изменило суть сообщения.


Пример текста сообщения — "Температура > 25 гр, влажность > 75%".


Символы нужны, но это не попытка атаки

А если у пользователя пароль с такой последовательностью символов? Он всегда будет получать ошибку

в паролях надо другие правила/ограничения использовать

Да. Просто в посте все входящие параметры обрабатываются так

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

Валидацию допишу, спасибо

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

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


Как новичку, такому как я, начать писать код лучше?
Статья живая, код на гитхаб. Пишите в комментариях советы, делитесь. Я сразу поправлю на гитхабе и код будет актуальный. И когда новичку попадется эта статья, он почитает комментарии, то он увидит о чем было обсуждение, увидит наглядные вещи и научится. Если у статьи просто поставлен минус — он ничему не научится… Ни он, ни автор.


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


Надо научиться делится информацией и знаниями в российской части интернета так, как это принято на stacko...

Пользователь отправляет запрос с параметрами:

.../smsc.php?login={user_name}&pass={user_password}&tel={phone_number}&msg={message}&flash=1&replacemessages_id=1

И светит данными авторизации всем кто между ним и сервером.
Юзайте POST метод.

При использовании https никто ничего не светит. То что вы видите строку которую сформировали, так там данные ваши, чего их скрывать?
В статье про это сказано, что прийдется использовать и post, и get. Если запрос отправляется с какого-то веб-сервиса, то лучше использовать post, а если с микроконтроллера atmega? Здесь легче использовать get. Просто опять таки задачи разные и решения разные.

Думаю, тут имеется в виду access_log сперли - пароли вместе с ними

Ну мне кажется это относится к безопасности сервера, а не коду, нет?
Для примера приведу api известного шлюза, вполне себе платного, у них точно такая же реализация – _https://smsc.ru/api/
Еще момент, на который мне кажется не обращают внимание – это суть статьи. Здесь рассматривается создание собственного шлюза для личных нужд, а не промышленного, к которому имеет доступ неограниченный круг лиц.
Есть же готовая железяка(и) GoIP-1 (~70USD), 4, 8 c готовым опять же PHP API…
Как говориться все что не выходит, все хорошо забытое старое. В конце нулевых море софта было для отправки SMS через USB модемы. Некоторые из этих программ можно было использовать через обычную веб страницу на компе. Нужно было сложное решение, денвер в помощь и можно было любую проблему решить.
С приемом SMS на модем было трудней. Все входящие SMS сохранялись в базу данных SQLite на модеме.
Ну это как бы не продукт, тем более для продажи, а эдакий homemade которым хотелось поделиться. Планировал делать 3ю часть по приему и обработке входящих SMS, но учитывая минусовку кармы за эту статью решил задумываться … :)
Объясните мне, пожалуйста, смысл фразы "… решил задумываться...".
Может быть "… решил начать обдумывать это..." будет звучать немного корректнее?
Писал с телефона, автозамена… Читать правильно – "… решил задуматься"
Зачем использовать стандартную пыховскую автоподгрузку классов, когда есть композер?)
Зачем использовать сторонний продукт если есть стандартное решение? )
Ну как минимум уже вошло в стандарт использовать Composer в любых проектах.
Я конечно ничего не имею против использование стандартных инструментов, но имхо.

А готовое решение в виде gammu smsd не рассматривали?)

Рассматривали, но написать свое лучше и проще потом нарастить функционал. В smsd нет возможности (если я не ошибаюсь) балансировать между разными модемами, нет возможности считать сколько вы смс отправили, например 200, в соответствии с этим выбрать другой модем и отправить с него и тд…
Но каждый вправе решать поставленную перед ним задачу по своему. Любая статья – не руководство к действию, а информация, которой автор хотел поделиться
Sign up to leave a comment.