Написание безопасных web-приложений

Статус
В этой теме нельзя размещать новые ответы.
надо будет покатать с утра подобный код. Все же хочу проверить что будет в этом случае с не корретными строками и данными.
Не трать время напрасно - '%d' подставит только число, при подсовывании строк в даном случае всегда получишь 0.
Но, даже исходя из того, что у тебя Мастер, это работает в многих проектах, думаю это гораздо надежнее, чем просто конкатенция данных в строку при формировании запроса
Разумеется.
В приведённом примере мне вообще не нужно озадачиваться фильтрацией (за меня это сделает интерпритатор) можно сразу вызвать mysql_query($sql) и спать спокойно.
Конкатенция в неумелых руках вообще зло.

А по каким топикам каких разделов? БД - в БД, PHP faq - в PHP faq.
Что куда? Подскажите. Уже не соображаю.
Коль уж речь ведётся про PHP, то и вали всё в этот же FAQ. Просто отдельными топиками "SQL-INJECTION и как с ними бороться", "XSS и как с ним бороться" и т.п.
И статьи будут короче (задолбался скролить в этом топике) и обсуждения будут по конкретной теме.
 
Да. Все таки от си подобных операторов есть отличие? Явного приведения типов? Функции sprintf? (int) (float) (string) и т.п.
Я понял. Разобью с утра на три отдельных темы. И добавлю о js и подходах помощи пользователям с точки зрения javascript проверки.
 
PHP_Master, а можешь тогда объяснить мне такую вещь (навеяно разговорами об SQL Injection)

PHP:
$sql = "SELECT * FROM users WHERE id=1; DELETE FROM users";
mysql_query($sql);

Что я делаю не так? Почему у меня delete не выполняется? И как тогда заэксплоитить такой вот скрипт (сознательно оставил все дыры какие можно)

PHP:
$sql = "SELECT * FROM users WHERE id=" . $_GET[id];
mysql_query($sql);

Пробовал и с UNION, и с ; и с вложенными запросами - нехочет, гад.
 
venetu

Насколько я помню, выполнение множества запросов за раз настраиваемо. Только вот не помню где. Если у тебя не выполянется, значит, просто выключено.
 
Да. Все таки от си подобных операторов есть отличие? Явного приведения типов? Функции sprintf? (int) (float) (string) и т.п.
Не совсем понял твой вопрос.
sprintf - функция форматированого вывода, а не приведения типа.
В указаном мной примере, использование
PHP:
echo $sql = 'SELECT * FROM table WHERE id = ' . (int)$id;
даст точно такой же результат как и
PHP:
echo $sql = sprintf('SELECT * FROM table WHERE id = %d', $id);
Использование sprintf - это у меня уже привычка, выработанная С и Python.

PHP_Master, а можешь тогда объяснить мне такую вещь (навеяно разговорами об SQL Injection)

PHP:
$sql = "SELECT * FROM users WHERE id=1; DELETE FROM users";
mysql_query($sql);

Что я делаю не так? Почему у меня delete не выполняется? И как тогда заэксплоитить такой вот скрипт (сознательно оставил все дыры какие можно)

PHP:
$sql = "SELECT * FROM users WHERE id=" . $_GET[id];
mysql_query($sql);

Пробовал и с UNION, и с ; и с вложенными запросами - нехочет, гад.
Откуда я знаю почему у тебя это не работает - причин может быть масса.
Если подключишься к БД, в которой есть таблица users, твой код выполниться в консоли на ура.
 
Не совсем понял твой вопрос.
sprintf - функция форматированого вывода, а не приведения типа.
В указаном мной примере, использование
PHP:
echo $sql = 'SELECT * FROM table WHERE id = ' . (int)$id;
даст точно такой же результат как и
PHP:
echo $sql = sprintf('SELECT * FROM table WHERE id = %d', $id);
Использование sprintf - это у меня уже привычка, выработанная С и Python.
Собственно это и спрашивалось.
Просто у меня подход на уровне операторов приведения типов и конкатенции строк. Поэтому и спрашивал: не одно и то же?
Дополнил пример по плейсхолдерам подходом с явным приведением типов с использованием операторов приведения и конкатенции параметров и маленькой ремарочкой что к чему.
 
<offtop>Подсказочка - правильнее говорить не "слоботипизированный язык", а "язык с динамической типизацией".</offtop>

Сильная (и одновременно слабая в неумелых руках) сторона PHP в том, что он умеет управлять типизацией на лету.
PHP:
$id = 123;
echo 'super ' . $id
выдаст нам
Код:
super 123
В тоже время аналогичный код на Python (тоже язык с динамической типизацией)
Код:
id = 123
print 'super ' + id
выдаст нам
Код:
TypeError: cannot concatenate 'str' and 'int' objects
Чтоб избежать ошибки, следует писать
Код:
id = 123
print 'super ' + str(id)

Мораль - явно приводите типы данных в опасных участках кода.
В PHP все переменные пришедшие от пользователя (GET|POST) являются строками, даже если это число.
У меня например есть клас, через который я проганяю все переменные принятые от пользователя. Класс не только чистит переменные согласно их ожидаемому значение, но и приводит переменные, которые должны быть числами к числовому типу данных.

Добавлено через 16 минут
Что я делаю не так? Почему у меня delete не выполняется?
Блин, давно я не работал с мускулем :ah:
Из мана
mysql_query() sends a unique query (multiple queries are not supported) to the currently active database on the server that's associated with the specified link_identifier .
А вот в постгресе такой запрос проканает.
 
Прочитал. Ничего юзабельного, даже для новичка. Любой ламер знает о add/stripslashes, htmlspecialchars и htmlentities.

До тех пор пока люди не поймут что входящие в скрипт данные должны быть типизированы разработчиком, будут и инъекции, и прочая лабуда.
 
Не совсем согласен: есть до фига людей считающих, что magic_quotes - это панацея и их спасёт.
Да и данные, необходимо не только типизировать, но и фильтровать от ненужных символов.
 
А дело в мелочах...

Итак, о реальных примерах. Буквально 10 минут назад.


Эти примеры более убедительны?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху