О безопасности

tarweb

Новичок
Здравствуйте, знатоки

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

Подскажите, может я не прав - что если в конце каждого sql запроса просто вставлять: or die ("mySQL error 1");

И пусть себе читает хакер: mySQL error 1, mySQL error 2 и т.д.
 

hell0w0rd

Продвинутый новичок
Экранируют, или используют подготовленные запросы не потому что злоумышленник может вызвать ошибку в запросе, а потому что может заставить запрос выполняться не как вы задумали
 

Фанат

oncle terrible
Команда форума
Кстати сказать, mysqli_real_escape_string не имеет ни малейшего отношения к безопасности
 

tarweb

Новичок
Ну допустим простой запрос без проверки входных данных:
$r=$db->query ("select * from $db_admin where login='$_SESSION[admin_login]' ") or die ("SQL error 1");
Что здесь можно вставить, что-бы что-то увидеть?
 

hell0w0rd

Продвинутый новичок
Ну допустим простой запрос без проверки входных данных:
$r=$db->query ("select * from $db_admin where login='$_SESSION[admin_login]' ") or die ("SQL error 1");
Что здесь можно вставить, что-бы что-то увидеть?
Сюда - ничего, однако это лапша-код)
неужели вам приятно такую лапшу читать?
С другой стороны если admin_login - д'Артаньян, ваш запрос будет вылетать с ошибкой, но админ-то не виноват)
 

tarweb

Новичок
Экранируют, или используют подготовленные запросы не потому что злоумышленник может вызвать ошибку в запросе, а потому что может заставить запрос выполняться не как вы задумали
Вы сами себе противоречите, а на счет последнего - если нет препаредов то сразу лапша?
 

hell0w0rd

Продвинутый новичок
Вы сами себе противоречите, а на счет последнего - если нет препаредов то сразу лапша?
Ошибка и изменение поведения запроса - разные вещи;)

Да, лапша:
PHP:
$date  = new DateTime($_POST['age']);
$db->query("SELECT * FROM `table` LEFT JOIN `other` ON `other.table_id`=`table.id`
            WHERE `table.age` > ".$date." AND `table.id` IN (".implode(', ', $ids).") AND `table.str`= ".$db->real_escape_string($_POST['str'])."
            ORDER BY `add_date` LIMIT $limit")

$db->query('SELECT * FROM `table` LEFT JOIN `other` ON `other.table_id`=`table.id`
            WHERE `table.age` > $n AND `table.id` IN ($n) AND `table.str`= $s 
            ORDER BY `add_date` LIMIT $n',
            new DateTime($_POST['age']), implode(', ', $ids), $_POST['str'], $limit);
Что проще прочитать?
 

hell0w0rd

Продвинутый новичок
Вы еще забыли уродливых ORM, Doctrine или Zend посоветовать
юзайте plain sql тогда)
Вы бы поуважительней относились к чужой работе;)
У той же doctrine есть удобная обертка над PDO, в виде Doctine DBAL, удобный кешер.
Как минимум там уже все продумали ;)
 

tarweb

Новичок
юзайте plain sql тогда)
Вы бы поуважительней относились к чужой работе;)
У той же doctrine есть удобная обертка над PDO, в виде Doctine DBAL, удобный кешер.
Как минимум там уже все продумали ;)
Как пишут (цитата) с другого форума:
Все эти ORM и фреймворки для PHP тяжелые, уродливые, и сам язык, из-за того что при каждом запросе надо инициализировать приложение заново, не позволяет их сделать нормальными, так что с точки зрения производительности лучше писать все руками.

Загрузка классов в PHP медленная, вызов лишних методов — медленный, в итоге получаются монстры типа Doctrine или Zend, с кучей мертвого кода и адскими тормозами. При этом еще и теряются все преимущества динамического языка и скорость разработки.
 

hell0w0rd

Продвинутый новичок
Как пишут (цитата) с другого форума:
Все эти ORM и фреймворки для PHP тяжелые, уродливые, и сам язык, из-за того что при каждом запросе надо инициализировать приложение заново, не позволяет их сделать нормальными, так что с точки зрения производительности лучше писать все руками.

Загрузка классов в PHP медленная, вызов лишних методов — медленный, в итоге получаются монстры типа Doctrine или Zend, с кучей мертвого кода и адскими тормозами. При этом еще и теряются все преимущества динамического языка и скорость разработки.
А вы верите всему что пишут?
Все классы можно собрать в 1 файл. Так и делают крупные фреймворки.
Ничего заного не надо инициализировать при каждом запросе.
У кого скорость разработки падает, а не возрастает - просто не научился работать с ORM.
И не обязательно использовать ORM, есть удобные обертки над PDO.
Если вы задаете подобные вопросы - вы точно еще не попробовали ничего и явно не понимаете как это устроено. Поэтому не стоит рассуждать о том, чего не знаете:)
 

Василий М.

Новичок
мне кажется, тут некоторые не понимают разницы между оберткой над СУБД и ORM
одного к другому никакого отношения не имеет
 

tarweb

Новичок
Пытался все свое переписать с MYSQLI в PDO
Дошел до эквивалента mysqli_num_rows И МНЕ СТАЛО ОЧЕНЬ ГРУСТНО

Посоветуйте обертку для mysqli_num_rows
 

Фанат

oncle terrible
Команда форума
Пытался все свое переписать с MYSQLI в PDO
Дошел до эквивалента mysqli_num_rows И МНЕ СТАЛО ОЧЕНЬ ГРУСТНО
Посоветуйте обертку для mysqli_num_rows
Не понял.
Во-первых, количество строк, которые вернул разпрос, бывает нужно ОЧЕНЬ редко. Максимум - 1-2 раза в год.
Во-вторых, какая проблема использовать функцию ПДО, для этого предназначенную?
В-третьих, ПДО все равно недостаточно для защиты.
 
Сверху