[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: безопасность MySQL-запросов
X_guest_X
Хотелось бы узнать, как можно обезопасить "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_replacechr(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;
    }


Чтобы этот код прошел через эту же функцию, я после всех амперсандов добавил пробелы. wink.gif

Спустя 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 ); 
           
...
    }


спасибо большое! теперь всё работат smile.gif

только вот вопрос по поводу этой строки. из-за нее функция возвращает пустую переменную.. а как только я удаляю эту строку, то все нормально функционирует.. это с чем может быть связано?

Спустя 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 или ошибка в запросе?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.