Ну вы и норкоманы.... определенно начитались Фленова =) Я подобное Г только у него в книге видел =) Нормальный код(практически) в этой теме только у p-range. Остальные просто не понимают, что делают.
PHP: $blabla = is_numeric($_REQUEST['blabla']) ? $_REQUEST['blabla'] : mysql_escape_string($_REQUEST['blabla']); Неужели ещё что то нужно?
Определенно да. is_numeric проверяет принадлежность числовому диапазону, включая флоаты. Тоисть попади переменная вторым аргументом в mysql_array, получим раскрытие пути Кстати, mysql_escape_string, как и все ф-ции mysql_* юзают апи mysql сервера, тоисть требуют аккаунт и подключение к субд. Вместо этого нашел офигенную штуку в zf PHP: protected function _quote($value) { if (is_int($value)) { return $value; } elseif (is_float($value)) { return sprintf('%F', $value); } return "'" . addcslashes($value, "\000\n\r\\'\"\032") . "'"; } З. Ы. Гуглите о prepared statement. Все уже придумано до вас
Какой возвращать массив - это уже решает программист. Не думаю что пользователю будет предложено сделать выбор в запросах gpc. Вот это вообще не понял. Это равносильно: "Что бы поехать на велосипеде, нужны ноги. Но мы сделаем по другому."
тьфу. имел ввиду mysql_result Дело в производительности. Представь себе кой нибудь средний нагруженый проект ~50 запросов в секунду. Кроме самого запроса на выборку/апдейт/удалейние и т.д. скрипт ещё 50 раз дергнет mysql чтоб он заэскейпил твою переменню. И это только за 1 запрос
мдээ... Читайте статью от нерезуса. И не нужны какие-нибудь сверх способы устранения всех уязвимостей сразу.
>> Представь себе кой нибудь средний нагруженый проект ~50 запросов в секунду. Кроме самого запроса на выборку/апдейт/удалейние и т.д. скрипт ещё 50 раз дергнет mysql чтоб он заэскейпил твою переменню. И это только за 1 запрос Переменная обработалась один раз в начале скрипта. Хоть запросов будет миллион, какая разница? >> тьфу. имел ввиду mysql_result Да тоже самое по сути. Тут идёт речь о защите от скуль инъекций, и о том в каком виде надо давать данные на запрос. Про аргументы функций тут речь не идёт.
Чего непонятно написано? Правда заметил что речь идет о не mysql_real_* ф-ции, которая действительно не требует подключения к бд, к тому же устарела еще с 4й версии + и будет генерировать нотис при ее исползовании в следующем релизе пхп мдэ попрубуй поддерживать нагруженый проект с такой фигней в коде. Эти способы придумал не я, а контора которая придумала пхп. Ещё есть вопросы? 50 запросов к веб-серверу Здесь согласен, но я просто прокомментировал о небезопасности кода, который ты написал
хотите защиту он от скуль ???? http://il.php.net/manual/ru/function.mysql-real-escape-string.php рименение mysql_real_escape_string() к каждой переменной, вставляемой в запрос, предотвращает SQL Injection. Нижеследующий код является наилучшим вариантом составления запросов и не зависит от установки Magic Quotes. Запрос, составленный таким образом, будет выполнен без ошибок, и взлом с помощью SQL Injection окажется невозможен. PHP: <?php // Функция экранирования переменных function quote_smart($value) { // если magic_quotes_gpc включена - используем stripslashes if (get_magic_quotes_gpc()) { $value = stripslashes($value); } // Если переменная - число, то экранировать её не нужно // если нет - то окружем её кавычками, и экранируем if (!is_numeric($value)) { $value = "'" . mysql_real_escape_string($value) . "'"; } return $value; } // Соединяемся $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password') OR die(mysql_error()); // Составляем безопасный запрос $query = sprintf("SELECT * FROM users WHERE user=%s AND password=%s", quote_smart($_POST['username']), quote_smart($_POST['password'])); mysql_query($query); ?> А также класс от меня PHP: <?php /** * @author @FATAL@ * @copyright 2008 */ class DB { public function __construct($host, $user, $db_pass, $db) { $this->host = $host; $this->user = $user; $this->db_pass = $db_pass; $this->db = $db; } public function conn() { if(!($this->connect = @mysql_connect($this->host, $this->user, $this->db_pass))) { $this->false = 'Connection Error'; return false; } return (!@mysql_select_db($this->db,$this->connect))? false : true; } public function mysql_qw() { $this->args = func_get_args(); $qwery = $this->mysql_make_qw(); return $result = mysql_query($qwery,$this->connect); mysql_free_result($result); } private function mysql_make_qw() { $tml = $this->args; $tml[0] = str_replace('%', '%%', $tml[0]); $tml[0] = str_replace('?', '%s', $tml[0]); foreach ($tml as $i => $v) { if (!$i) continue; if (is_int($v)) continue; if (get_magic_quotes_gpc()) $v = stripslashes($v); $tml[$i] = "'" . mysql_real_escape_string($v,$this->connect) . "'"; } for ($i = $c = count($tml) - 1; $i < $c + 20; $i++) { $tml[$i + 1] = "UNKNOWN_PLACEHOLDER_$i"; return call_user_func_array("sprintf", $tml); } } public function mysql_fetch($result) { return mysql_fetch_assoc($result); } public function error() { return (@mysql_error($this->connect))? mysql_error($this->connect): $this->false; } public function __destruct() { @mysql_close($this->connect); } } ?>
Здесь ребята, явно погорячились, или написали так, чтоб не сильно вдаваться в подробности. Раз они так написали, почуму zend ниразу не использовала ее в своем фреймворке?))) почитал пример на php.net? почитай еще и примечания к этой ф-ции
я же кажется ясно написал о mysql_real_escape_string, что это за дрянь и почему ее желательно не юзать. Повторяю. Метод, что я написал несколькими комментами выше придумал не я, а zend. Ему пофиг числовое это поле(не эскейпится) или строковое(эскейпится). Он не дергает субд каждый раз и не требует подключения к ней
Замечание: mysql_real_escape_string() не экранирует символы % и _. Эти знаки являются масками групп символов в операторах MySQL LIKE, GRANT или REVOKE. Поэтому нада уметь иногда включать мозг ... да и ваще скоко не писал никогда не использовал эти операторы =) да и темболее с подстовлением данных от пользователя ...
а можно привести пример уязвимости, где обходится функция mysql_real_escape_string() именно с применением этих символов? или иначе..
А нельзя ли действовать по принципу KISS [http://ru.wikipedia.org/wiki/Принцип_KISS]? Каждый метод защиты для каждого случая разный. Если напрягает дополнительная нагрузка на базу - юзайте mysql_escape_string() EXSlim, твой метод бредовый, так как он проверяет не сами данные, а их тип, а затем делает ненужную фильтрацию.
бредовый? накатай тикет zend`y. бл#ть, я уже 4й раз пишу что этот метод придумал не я, а zend. и использует его вместо этой гребаной mysql_real_escape_string. а ещё вместе с ней его использует охрененная куча людей которые разработывают с zend framework а я и не писал что она обходится. я написал что это забивание гвоздей яйцами