За последние 24 часа нас посетили 17498 программистов и 1714 роботов. Сейчас ищут 1672 программиста ...

Вопросы безопасности, или «почему так делать нельзя»

Тема в разделе "PHP для новичков", создана пользователем Anonymous, 27 сен 2007.

Статус темы:
Закрыта.
  1. Ruzzz

    Ruzzz Активный пользователь

    С нами с:
    11 фев 2008
    Сообщения:
    148
    Симпатии:
    1
    Скажите делать так unset($var); $var = 'Что-то там'; - это глупость? Т.е. unset необязательно?
     
  2. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
  3. Ruzzz

    Ruzzz Активный пользователь

    С нами с:
    11 фев 2008
    Сообщения:
    148
    Симпатии:
    1
    Вопросов куча :) Буду рад если ув. знатоки помогут найти ответы хоть на часть!
    Вопросы по проверке переданых числовых параметрах.

    в дополнение к $param = intval($_GET['param']) и $param = (int) $_GET['param'];, нашел еще и sprintf("%d", $param);! :) Создаю запрос с помошью sprintf, есть переданые параметры-числа, так может и не проверять эти параметры, все что не так sprintf переведет в ноль?

    Где почитать: уязвимо ли приведение типов? Может все таки для int(4) приведение типов лучше? preg_match - просто проверит какие символы, но хотелось бы и в диапазон попасть. Например если число "помещается" в int(4), то перед тем как отдать его в MySQL - сделать приведение типов, а потом проверит if >= && <= или как?

    Для проверки на число использую if (preg_match("/\D/", _GET['param'])) { ОШИБКА: Присутствуют не числовые сиволы };. Но хотелось бы как-то красиво проверять и диапазон. Подскажите? Как быть с MySQL - bigint(20) unsigned, в PHP нет такого.

    Нашел еще settype, это одно и тоже что и преведение типав? ) Или есть какое-то отличие?
     
  4. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    А чё это такое? int(4)
     
  5. Ruzzz

    Ruzzz Активный пользователь

    С нами с:
    11 фев 2008
    Сообщения:
    148
    Симпатии:
    1
    ну я неправильно написал, int! Я так понимаю отличие только в 32бит 64бит - системах
    Но не суть это, а то мои вопросы убегут далеко вверх (
    вот еще нашел is_numeric -- Finds whether a variable is a number or a numeric string, что скажете, можна(точнее лучше) ли ею пользоваться для проверки переданого параметра-числа?
     
  6. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Да.
    Что значит уязвимо? Приведение типов это конструкция языка.
    PHP:
    1. <?php
    2. $id = isset($_GET['id']) ? (int)$_GET['id'] : 0;
    3.  
    4. if ($id < 0 || $id > 255) {
    5.     print 'ошибка';
    6. }
     
  7. Ruzzz

    Ruzzz Активный пользователь

    С нами с:
    11 фев 2008
    Сообщения:
    148
    Симпатии:
    1
    Спасибо!!!!!!!! )

    Еще на странице http://php.ru/manual/types.comparisons.html нашел
    :) Т.е для чисел не требуется никаких регулярных выражений. Остается только проверить диапазон перед "отправкой" в MySQL - получается так. Это понял! ) Остается вопрос на счет bigint(20)?.

    Есть еще кое-что не понятно
    - т.е. для не определенной переменной empty() также спокойно! выдасть True?

    Еще:
    Т.е. для чисел, которые могут содержать "0" empty() не подходит?

    - смущает ИЛИ в empty() или isset(), т.е. можно спокойно использовать просто empty()? И таким образом "облегчать" код?
     
  8. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    А что тебе не нравится? Никто не отменял if ($chislo>0) {}
    Вообще такие вещи можно и самому проверить.
    Нет, не подходит. Повнимательнее почитать про разницу между конструкциями "==" и "===" - тогда разберёшься.

    Разницу видишь?
     
  9. Ruzzz

    Ruzzz Активный пользователь

    С нами с:
    11 фев 2008
    Сообщения:
    148
    Симпатии:
    1
    RomanBush вам спасибо!
    Эх ссылку бы ) Поисщу сам ) (добавил: нашел http://php.ru/manual/language.operators.comparison.html :))
    да у меня просто как-то в голове не уложится что делать например если будет "999999999999999999999999999999999999999..." ну и так далее какое там максимум. Вообщем хочу чтобы SQL ошибку не выдавал, хочу перхватывать такое с пояснениями. Хотя может действительно это я зря? может хватит и if (mysql_query($query)) ? Просто охота как то уменьшить риск, а приведение к int не выход, может тогда делать if (!preg_match("/\D/", $_POST['ID'])) а потом strlen? тогда нужно узнать строку максимального числа для bigint(20) :)
     
  10. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Тебе реально необходимо хранить такие большие числа? Обычно, я знаю числа из какого диапазона меня интересуют.
     
  11. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Я не понимаю, по поводу какого риска ты переживаешь? Если по поводу того, что придут неверный инпут от пользователя - то в таком случае достаточно понять, что ввод неверный и соообщить об этом пользователю, чтобы он поправил данные. Для этого достаточно и if (!$q=myslq_query()).
    Если же ты боишься sql-инъекции - как от неё защититься тут уже неоднократно обсуждалось. Если речь только про числа - достаточно простого приведения типов - php при приведении сам всё "опасное" отбросит.
    зачем? Для того, чтобы самому вывести сообщение об ошибке? Немного странно звучит - не находишь?
     
  12. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    По поводу больших чисел - работал как-то с 21 знаковым числовым идентификатором. PHP как число обработать его не мог, т.к. это был Unsigned bigint, а в PHP оно signed всегда, даже 64 бита спасовали. Так что иногда такие вещи бывают (в данном случае это биллинг) и приходится обрабатывать как строки такие числа.
     
  13. Ruzzz

    Ruzzz Активный пользователь

    С нами с:
    11 фев 2008
    Сообщения:
    148
    Симпатии:
    1
    Psih Да получается только как со строками! Или как советуют на if (!$q=myslq_query()) надеятся и читать бюююллитень безопасности от разработчиков mysql
     
  14. EvelRus

    EvelRus Активный пользователь

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    Всегда истинно ;)))
    И в чем безопаснсть и правильность?:))))

    Или я шутки не просек? :)))
     
  15. Ruzzz

    Ruzzz Активный пользователь

    С нами с:
    11 фев 2008
    Сообщения:
    148
    Симпатии:
    1
    Да нет я согласен всегда истинно!

    RomanBush какой-то больно злой ты парень, не в обиду! )
    Я не перживаю по поводу какого-то конкретного риска, я переживаю о возможном риске, я же сказал я новичек, и о риске спрашиваю у вас. В твоем случае следовало бы сказать: не переживай новичек, тут риска нет, это говорю тебе я! ) И все.
     
  16. Anonymous

    Anonymous Guest

    Тема закрыта.
     
Статус темы:
Закрыта.