За последние 24 часа нас посетили 17705 программистов и 1606 роботов. Сейчас ищут 1096 программистов ...

Превентивные методы повышения безопасности.

Тема в разделе "PHP для новичков", создана пользователем Vladson, 29 ноя 2006.

  1. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Заметил я что многие испытывают проблемы с такой проблемой как SQL-injection, а учитывая статью на эту тему на сайте php.com.ua этим страдают не только новички, но и те кто называют себя профессионалами.

    Чаще всего люди посылая запросы забывают фильтровать $_GET параметры в SQL-условиях WHERE и LIMIT
    Например
    PHP:
    1. <?php
    2. $sql = "SELECT * FROM `pages` WHERE `page_id`=".$_GET['page_id'];
    3. $result = mysql_query($sql, $link);
    4. ?>
    Вот хотелось бы обсудить самый простой метод построения запросов который не только очень удобен, но и безопасен.

    Простой sprintf()
    PHP:
    1. <?php
    2. $sql = sprintf("SELECT * FROM `pages` WHERE `page_id`=%d", $_GET['page_id']);
    3. $result = mysql_query($sql, $link);
    4. ?>
    Кто что думает, причём как о самом способе, так и о том почему люди (замечу не только новички) вместо того чтоб заранее писать устойчивый код пишут дырявый, а потом годами заделывают дыры ?
     
  2. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Vladson

    а какие тут преимущества перед проверкой переменной с помощью регулярного выражения?
     
  3. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    DarkElf
    Для фильтрации чисел регулярка не нужна !!!

    Тут речь о том что с помощью sprintf гораздо проще составлять запросы и гараздо удобнее вникать что фильтровать а что нет !!!
    Причём на моём примере даже фильтровать не нужно, sprintf сам фильтрует. Но если составлять запрос где нужна будет фильтрация то будет сложнее запутаться и забыть что нибудь !!! (а как я и сказал многие делают дыры не потому что не умеют по другому, а потому что путаются в собственном коде)
     
  4. avm

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

    С нами с:
    21 сен 2006
    Сообщения:
    597
    Симпатии:
    0
    Адрес:
    Москва
    наглядность и легкочитаемость.
     
  5. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    sprintf - неплохая идея. Сам все время делаю так:
    PHP:
    1. <?php
    2. $result = mysql_query("SELECT * FROM `pages` WHERE `page_id`=".(int)$_GET['page_id'], $link);
    3. ?>
    Просто не люблю, когда одно и то же действие занимает больше строчек кода.
     
  6. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Потому что мало кто представляет себе что, где и как работает... Например, человек прочитал в книжке, что если в форме задать имена полей, нарисовать кнопку submit, задать свойство action="test.php" и т.д., то на странице test.php можно писать $_POST['id'], $_POST['name'] и т.д. (или еще хуже $id, $name). Естественно, в книге не объясняется КАК передается информация (не об этом книга, особенно если она для новичков). А если человек не знает КАК, то он не может представить себе какие могут быть проблемы.
    Т.е. проблема, по-моему, как всегда в одном: в отсутствии знаний и понимания.
     
  7. Петр

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

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    AlexGousev++

    Мои 5 копеек.
    PHP:
    1. <?php
    2.  
    3. function int_protect($what) {
    4.     if (empty($what)) return 0;
    5.     elseif ((string) $what !== (string)(int) $what) die("Ну и чего ломаем?");
    6.     else return $what;
    7. }
    8.  
    9. ?>
     
  8. Anonymous

    Anonymous Guest

    =))
    PHP:
    1. <?php
    2. $db->Query_ex('UPDATE tender_prices SET NAME=?, MEASURE_TYPE_ID=?, ITEM_COUNT=?, DEFINITION=?, TENDER_DATE=?, TENDER_PLACE=?, TENDER_DATE_S=?, TENDER_DATE_F=?, CONTACTS=? WHERE ID = ?' ,
    3. $_POST['name'],$_POST['mtype'],$_POST['icnt'],$_POST['definition'],$_POST['pdate'],$_POST['place'],$_POST['ptime_s'],$_POST['ptime_f'],$_POST['contacts'],$_GET['save']);
    4. ?>
    5.  
     
  9. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Хочешь сказать что люди написавшие Нюку, Мамбу, рнрВВ и многие другие все идиоты ? (согласен что идиотов 99.9% но есть и те кто случайно лажанулись)
    Увы, очень часто люди делают ошибки машинально, между тем их можно избежать без параноидального фильтрования всего подряд !!!
     
  10. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Неа... не все. Но идиотского кода в любой системе можно найти много... Я вот сейчас полезу покопаюсь в своих исходниках энной давности - там такого понаписано: мама не горюй. А тогда я считал такой подход/метод правильным и единственно верным. Учусь...

    А еще есть такая штука как лень ;)
    А еще есть такой подход: я сначала "костяк" напишу, чтобы работало, а потом там где надо сделаю проверку параметров, обработку ошибок и т.п. (многие такой подход любят и применяют). А потом подходят сроки сдачи проекта и...

    Машинально можно делать заученную последовательность действий. Машинально программировать - это как раз и есть идиотизм. Зачем тогда человек?

    Есть такая книжка: "Progrming stone". Если не лень: она интересная.
     
  11. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Или просто забивают :) (работает и хрен с ним)
     
  12. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Горбунов Олег
    А в чем фишка применения wildcard'ов?

    ЗЫ. Нехороший человек: растянул окно - в монитор не влазит :)
     
  13. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Ну или так...
     
  14. ONK

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

    С нами с:
    4 фев 2006
    Сообщения:
    281
    Симпатии:
    0
    Адрес:
    СПб
    Уже 2 года успешно использую подобный подход
    PHP:
    1. <?
    2. $SQL = "SELECT b.name FROM `%1\$s_users` a LEFT JOIN `%1\$s_user_names` b ON(b.name_id = a.name_id) WHERE a.user_id = '%2\$d'";
    3.                     $result = $db->safe_query($SQL,$TAB_PREF,$iUser_id);
    4. ?>
    Думаю. принцип всем понятен.

    DarkElf, Преймущества в том, что нет необходимости в дополнительных проверках к тем, что продиктованы бизнеслогикой приложения, и при этом гарантируется 100% защита от SQL инъекций (внутри safe_query все параметры обрабатываются mysql_real_escape_string()).
     
  15. ONK

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

    С нами с:
    4 фев 2006
    Сообщения:
    281
    Симпатии:
    0
    Адрес:
    СПб
    ПС. Когда я переписывал работу с базой данных на этот метод, я нашёл 3 SQL injections в ~ 1600 SQL запросах. Это при том, что на момент написания этих запросов я имел вполне ясное представление о принципах безопасной работы с базами данных.
     
  16. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Вот и я говорю что ошибки далеко не всегда продукт незнания, бывают и другие причины...
     
  17. Anonymous

    Anonymous Guest

    AlexGousev, в том, что экранируются автоматом. =)
     
  18. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Бум знать ;)
     
  19. Anonymous

    Anonymous Guest

  20. Вльдемар

    Вльдемар Активный пользователь

    С нами с:
    20 май 2006
    Сообщения:
    635
    Симпатии:
    0
    Адрес:
    Белхород
    Уже давненько пользуюсь, тоже под себя заточил.
    :lol:
     
  21. D.Lans

    D.Lans Активный пользователь

    С нами с:
    31 июл 2006
    Сообщения:
    345
    Симпатии:
    0
    Vladson
    Непростой.

    К чему эти малопонятные закорючки:
    ?

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

    Да ладно, просто я не разбираюсь во всяких си-подобных printf, sprintf и т.д. Они выше моего понимания. :(
     
  22. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    Давно обращаю формчан на "нативный" класс PDO

    начиная с Example#6 Repeated inserts using prepared statements
    в каких угодно варицаиях

    [offtop]
    хм.. окзываеца можно на выборке указывать класс приемник. Жесть)
    [/offtop]
     
  23. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    D.Lans Ну это у тебя личное, для большинства sprintf проще всяких регулярок...
     
  24. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    ИМХО, PDO уже стандарт, остальное - пережитки прошлого
     
  25. Anonymous

    Anonymous Guest

    Ti, согласен, но когда я начинал юзать это - PDO на хостингах было фантазией.