Mysql Защита от SQL-инъекций в PHP и MySQL

Фанат

oncle terrible
Команда форума
Baton
Сложно - это у тебя.

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

~WR~

Новичок
Кстати, вспомнился один момент.
Многие самописные реализации плейсхолдеров, которые довелось видеть, содержали один прикольный недостаток.

А именно - они делали замену через str_replace или через множественные вызовы preg_replace_callback.
И, если значение одного плейсхолдера содержало ключ другого, происходили крутые артефакты.

Напимер:
PHP:
$params = array(
    'foo' => '#bar#',
    'bar' => 'cat',
);

SELECT #foo#, #bar#; 
SELECT ''cat'', 'cat';
 

baev

‹°°¬•
Команда форума
Как-то хранимые процедуры в статье упущены.
 

Absinthe

жожо
Как-то хранимые процедуры в статье упущены.
Я пришел к выводу, что использовать их нужно только для утилитарных функций типа CONVERT_TO_SMTH(field1) или GET_DISTANCE(x, y, targetX, targetY).
Отлаживать как-то нихрена не удобно хранимые процедуры
 

Фанат

oncle terrible
Команда форума
ну, вызов хранимой процедуры ничем, в сущности, не отличается от любого другого SQL запроса.
И к динамическому составлению запроса "CALL "применимы все те же правила, что и для запроса "SELECT"
 

SiZE

Новичок
Теперь надо статью про уязвимости XSS, сессионных данных, загружаемых файлов. Будет мега учебник.

У меня еще один вопрос родился. Если я все принятые параметры прогнал через mysql_real_escape_string - какие останутся SQL уязвимости? Для примера простой запрос:
PHP:
$id = intval( $_POST['id'] );
$name = mysql_real_escape_string( $_POST['name'] );
$email = mysql_real_escape_string( $_POST['email'] );

mysql_query("UPDATE members SET name='".$name."', email='".$email."' WHERE id=".$id);
P.S. На данный момент я, возможно наивно, полагаю, что такой запрос неуязвим (мы не говорим о том какие данные туда можно записать: html-код или что-то еще, именно что касается возможности получения данных из базы или доступа к ней).
 

Ragazzo

TDD interested
SiZE
<sarcasm>Для верность ты так еще делай</sarcasm>
PHP:
mysql_real_escape_string(htmlspecialchars(addslashes(stripslashes($_POST['name'] ))));
будешь защищен инфа 146 %.
 

Фанат

oncle terrible
Команда форума
Во всем этом нагромождении сарказма и (возможного) троллинга я так и не понял, в чём был вопрос.

В текущем виде вопрос представляет из себя взаимоисключающие параграфы.
 

Baton

Новичок
Используйте плейсхолдеры там где это возможно и pdo, т.к. он бросает исключения в случае ошибки в sql запросе, это сбережет кучу нервных клеток.

Лень проверять, но помоему стандартный экстеншн мускуля, помоему даже не дает NOTICE в случае синтаксической ошибки в sql. Чтобы отловить ошибки надо либо загромождать код $db->query( ... ) or die( $db->error ), либо наследоваться от mysqli, чтобы переопределить метод query с trow new exception внутрях.
 

Фанат

oncle terrible
Команда форума
я уже "опроверг". В тексте, который следовало бы прочесть перед тем, как делиться своими гениальными мыслями.

Но самая жесть, конечно же, это $db->query( ... ), которое внутри себя обработку ошибок по какой-то неведомой причине сделать не может, и её приходится заменять идиотским or die вручную.
Начитанный ламер - это нечто.
Он всегда готов научить, как надо правильно делать. проблема только в том, что он не понимает ни одного слова в своих же собственных поучениях
 

Baton

Новичок
Фанат

Пхп из коробки поддерживает объектный способ работы с mysql в php.ini это extension=mysqli.dll. Там же есть extesnsion=php_pdo_mysql.dll

PHP:
$db = $db = new mysqli( 'localhost', 'root', 'xxxxx', 'database' );
$db->query( ... );
В классе mysqli `из коробки`, внутри query нет никакой обработки ошибок. Я читал ман, но не нашел никаких настроек, чтобы в случае ошибок в запросе стандартный коробочный метод mysqli::query бросал exception или умирал с выводом ошибки в экран или вызовом функции чтобы записать в лог. Поэтому лично я не вижу тут никакого выхода кроме:

1. писать or die, ( но кто сказал что мне это нравится? )
2. наследоваться от mysqli с переопределением метода query с бросанием экспешена

Поэтому я и посоветовал использовать pdo т.к. он более удобен и продвинут, хотя бы из-за такой мелочи как автоматические эксепшены в случае sql-error.

Если кто-то знает как научить стандартный mysqli::query падать в случае ошибки просьба написать. От Фаната я уже понял ничего толкового не дождешься он хамло трамвайное с ЧСВ овер 9000.
 

Ragazzo

TDD interested
хамло трамвайное
ахаха, надо записать :D
Baton
Сколько ты выполнил реальных проектов, чтобы советовать свои гениальные мысли порожденные колоссальным опытом?дай угадаю....эм... ноль?))
 
Сверху