Заметил я что многие испытывают проблемы с такой проблемой как SQL-injection, а учитывая статью на эту тему на сайте php.com.ua этим страдают не только новички, но и те кто называют себя профессионалами. Чаще всего люди посылая запросы забывают фильтровать $_GET параметры в SQL-условиях WHERE и LIMIT Например PHP: <?php $sql = "SELECT * FROM `pages` WHERE `page_id`=".$_GET['page_id']; $result = mysql_query($sql, $link); ?> Вот хотелось бы обсудить самый простой метод построения запросов который не только очень удобен, но и безопасен. Простой sprintf() PHP: <?php $sql = sprintf("SELECT * FROM `pages` WHERE `page_id`=%d", $_GET['page_id']); $result = mysql_query($sql, $link); ?> Кто что думает, причём как о самом способе, так и о том почему люди (замечу не только новички) вместо того чтоб заранее писать устойчивый код пишут дырявый, а потом годами заделывают дыры ?
DarkElf Для фильтрации чисел регулярка не нужна !!! Тут речь о том что с помощью sprintf гораздо проще составлять запросы и гараздо удобнее вникать что фильтровать а что нет !!! Причём на моём примере даже фильтровать не нужно, sprintf сам фильтрует. Но если составлять запрос где нужна будет фильтрация то будет сложнее запутаться и забыть что нибудь !!! (а как я и сказал многие делают дыры не потому что не умеют по другому, а потому что путаются в собственном коде)
sprintf - неплохая идея. Сам все время делаю так: PHP: <?php $result = mysql_query("SELECT * FROM `pages` WHERE `page_id`=".(int)$_GET['page_id'], $link); ?> Просто не люблю, когда одно и то же действие занимает больше строчек кода.
Потому что мало кто представляет себе что, где и как работает... Например, человек прочитал в книжке, что если в форме задать имена полей, нарисовать кнопку submit, задать свойство action="test.php" и т.д., то на странице test.php можно писать $_POST['id'], $_POST['name'] и т.д. (или еще хуже $id, $name). Естественно, в книге не объясняется КАК передается информация (не об этом книга, особенно если она для новичков). А если человек не знает КАК, то он не может представить себе какие могут быть проблемы. Т.е. проблема, по-моему, как всегда в одном: в отсутствии знаний и понимания.
AlexGousev++ Мои 5 копеек. PHP: <?php function int_protect($what) { if (empty($what)) return 0; elseif ((string) $what !== (string)(int) $what) die("Ну и чего ломаем?"); else return $what; } ?>
=)) PHP: <?php $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 = ?' , $_POST['name'],$_POST['mtype'],$_POST['icnt'],$_POST['definition'],$_POST['pdate'],$_POST['place'],$_POST['ptime_s'],$_POST['ptime_f'],$_POST['contacts'],$_GET['save']); ?>
Хочешь сказать что люди написавшие Нюку, Мамбу, рнрВВ и многие другие все идиоты ? (согласен что идиотов 99.9% но есть и те кто случайно лажанулись) Увы, очень часто люди делают ошибки машинально, между тем их можно избежать без параноидального фильтрования всего подряд !!!
Неа... не все. Но идиотского кода в любой системе можно найти много... Я вот сейчас полезу покопаюсь в своих исходниках энной давности - там такого понаписано: мама не горюй. А тогда я считал такой подход/метод правильным и единственно верным. Учусь... А еще есть такая штука как лень А еще есть такой подход: я сначала "костяк" напишу, чтобы работало, а потом там где надо сделаю проверку параметров, обработку ошибок и т.п. (многие такой подход любят и применяют). А потом подходят сроки сдачи проекта и... Машинально можно делать заученную последовательность действий. Машинально программировать - это как раз и есть идиотизм. Зачем тогда человек? Есть такая книжка: "Progrming stone". Если не лень: она интересная.
Горбунов Олег А в чем фишка применения wildcard'ов? ЗЫ. Нехороший человек: растянул окно - в монитор не влазит
Уже 2 года успешно использую подобный подход PHP: <? $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'"; $result = $db->safe_query($SQL,$TAB_PREF,$iUser_id); ?> Думаю. принцип всем понятен. DarkElf, Преймущества в том, что нет необходимости в дополнительных проверках к тем, что продиктованы бизнеслогикой приложения, и при этом гарантируется 100% защита от SQL инъекций (внутри safe_query все параметры обрабатываются mysql_real_escape_string()).
ПС. Когда я переписывал работу с базой данных на этот метод, я нашёл 3 SQL injections в ~ 1600 SQL запросах. Это при том, что на момент написания этих запросов я имел вполне ясное представление о принципах безопасной работы с базами данных.
AlexGousev,дык, идею честно спер тут — http://www.dklab.ru/lib/Database_Placeholder/ Переделал под себя...
Vladson Непростой. К чему эти малопонятные закорючки: ? Обычные регулярные выражения служат верой и правдой. Они ведь основаны на чистой логике - все понятно и закономерно. А тут... Да ладно, просто я не разбираюсь во всяких си-подобных printf, sprintf и т.д. Они выше моего понимания.
Давно обращаю формчан на "нативный" класс PDO начиная с Example#6 Repeated inserts using prepared statements в каких угодно варицаиях [offtop] хм.. окзываеца можно на выборке указывать класс приемник. Жесть) [/offtop]