X_guest_X
29.05.2009 - 12:53
Хотелось бы узнать, как можно обезопасить "select"- запросы от злоумышленников.
и, например, как можно избежать вывода всей информации таблицы, при вводе в поиск выражения " '# "..
PHP |
<input name="searchterm" size="38" maxlength="250" value=""> <select class="select" size name="searchtype"> ... <?php if(isset($searchtype)) { if (!$searchtype || !$searchterm) { echo "Вы не ввели аргумент поиска"; exit; } $query = "select t.blablabla, g.blabla from db_tab t inner join db_g g on (...) where ".$searchtype." Like '%".$searchterm."%'"; ... |
ну и, возможно, какие-нибудь рекомендации по безопасности?
Спустя 8 минут, 44 секунды (29.05.2009 - 12:01) FatCat написал(а):
У нас в форуме для безопасности входящих переменных, все цельночисленные берутся в intval(), для всех прочих существует функция:
PHP |
function clean_value($val) { global $ibforums; if ($val == "") { return ""; } $val = str_replace( "& #032;", " ", $val ); if ( $ibforums->vars['strip_space_chr'] ) { $val = str_replace( chr(0xCA), "", $val ); //Remove sneaky spaces } $val = str_replace( "& " , "& amp;" , $val ); $val = str_replace( "<!--" , "& #60;& #33;--" , $val ); $val = str_replace( "-->" , "--& #62;" , $val ); $val = preg_replace( "/<script/i" , "& #60;script" , $val ); $val = str_replace( ">" , "& gt;" , $val ); $val = str_replace( "<" , "& lt;" , $val ); $val = str_replace( "\"" , "& quot;" , $val ); $val = preg_replace( "/\n/" , "<br>" , $val ); // Convert literal newlines $val = preg_replace( "/\\\$/" , "& #036;" , $val ); $val = preg_replace( "/\r/" , "" , $val ); // Remove literal carriage returns $val = str_replace( "!" , "& #33;" , $val ); $val = str_replace( "'" , "& #39;" , $val ); // IMPORTANT: It helps to increase sql query safety. // Ensure unicode chars are OK if ( $this->allow_unicode ) { $val = preg_replace("/& amp;#([0-9]+);/s", "& #\\1;", $val ); } // Strip slashes if not already done so. if ( $this->get_magic_quotes ) { $val = stripslashes($val); } // Swop user inputted backslashes $val = preg_replace( "/\\\(?!& amp;#|?#)/", "& #092;", $val ); return $val; } |
Чтобы этот код прошел через эту же функцию, я после всех амперсандов добавил пробелы.
Спустя 1 час, 2 минуты, 32 секунды (29.05.2009 - 13:04) Guest написал(а):
Цитата (FatCat @ 29.05.2009 - 09:01) |
для всех прочих существует функция:PHP | function clean_value($val) { ... $val = preg_replace( "/\\\(?!& amp;#|?#)/", "& #092;", $val ); ... } |
|
спасибо большое! теперь всё работат

только вот вопрос по поводу этой строки. из-за нее функция возвращает пустую переменную.. а как только я удаляю эту строку, то все нормально функционирует.. это с чем может быть связано?
Спустя 1 час, 24 минуты, 11 секунд (29.05.2009 - 14:28) glock18 написал(а):
Самый лучший и надежный вариант защиты от sql-инъекций - использование подготовленных запросов (prepared statements). Сейчас многие либы для работы с sql дают такую возможность: mysqli, pdo, например (это стандартные либы php).
Очень рекомендую использовать именно их, ибо:
1. 100% защита от sql-инъекций.
2. увеличение производительности при выполнении одного запроса несколько раз подряд. При этом, при выполнении запроса один - скорость выполнения как правило не ниже.
Спустя 15 минут, 4 секунды (29.05.2009 - 14:43) FatCat написал(а):
Цитата (Guest @ 29.05.2009 - 13:04) |
вопрос по поводу этой строки. из-за нее функция возвращает пустую переменную. |
Это защита от обратной слеши.
Сорри, тут бакслешь побилась парсером...
Вот как выглядит код:
Спустя 2 часа, 45 минут, 32 секунды (29.05.2009 - 17:29) X_guest_X написал(а):
Цитата (FatCat) |
Сорри, тут бакслешь побилась парсером... Вот как выглядит код: |
вот теперь все идеально :]
Цитата (glock18) |
Самый лучший и надежный вариант защиты от sql-инъекций - использование подготовленных запросов (prepared statements). Сейчас многие либы для работы с sql дают такую возможность: mysqli, pdo, например (это стандартные либы php). |
если стандартные либы включены, то должно работать же сразу, по идее?
попробовал запрос:
PHP |
PREPARE gbstatement FROM "INSERT INTO guestbook (id,author,mail,date,time,text) VALUES ('?','?','?','?','?','?')"; SET @someparam_1 = ''; SET @someparam_2 = 'avt'; SET @someparam_3 = 'mail@blablabla.bla'; SET @someparam_4 = '2009-05-29'; SET @someparam_5 = '21:03:07 '; SET @someparam_6 = 'textmsg'; EXECUTE gbstatement USING @someparam_1,@someparam_2,@someparam_3,@someparam_4,@someparam_5,@someparam_6; DEALLOCATE PREPARE gbstatement; |
Ответ MySQL:
SQL |
#1210 - Incorrect arguments to EXECUTE |
это мне нужно обновить версию MySQL или ошибка в запросе?