Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не пойму принципа защиты от SQL inj
 
 автор: Kolbo4ka   (24.09.2007 в 18:14)   письмо автору
 
 

Полазил по форуму и узнал что текст нужно проверять
так:

<?
if (!get_magic_quotes_gpc()) 

$text mysql_escape_string($text); 

?>

а цифры так:

<?
$id
=intval($id);
?>



По какому принципу нужно действовать? Перед записью или как?
У меня большой скрипт (множество файлов) и мне нужно все профильтровать, подскажите как ориентироваться по большому количеству файлов, как искать? Глазами эт не реально.
Например для экранирования htmlspecialchars().
Я ищу в файлах слово echo, а что искать в моем случае?

   
 
 автор: kasmanaft   (24.09.2007 в 19:15)   письмо автору
 
   для: Kolbo4ka   (24.09.2007 в 18:14)
 

> а что искать в моем случае?
Можбыть mysql_query()

Вообще нужно при получении данных очистить их от всяких пакостей, оставленных магическими кавычками:
if (get_magic_quotes_gpc())
{
$text = strip_slashes($text);
}

А потом, при добавлении данных в БД, использовать mysql_escape_string()

   
 
 автор: Unkind   (24.09.2007 в 20:42)   письмо автору
 
   для: kasmanaft   (24.09.2007 в 19:15)
 

> strip_slashes
stripslashes()

   
 
 автор: cheops   (25.09.2007 в 11:22)   письмо автору
 
   для: kasmanaft   (24.09.2007 в 19:15)
 

>Вообще нужно
Вернее "можно ещё" - оба подхода рабочие и могут применяться.

   
 
 автор: cheops   (25.09.2007 в 11:21)   письмо автору
 
   для: Kolbo4ka   (24.09.2007 в 18:14)
 

>Перед записью или как?
Да
>Я ищу в файлах слово echo, а что искать в моем случае?
Это зависит от скрипта, но в большинстве случаев можно ориентироваться на mysql_query

   
 
 автор: Kolbo4ka   (25.09.2007 в 23:44)   письмо автору
 
   для: cheops   (25.09.2007 в 11:21)
 

Большое спасибо Вы мне очень помогли.
Делаю так:

<?
$_GET 
str_replace("'"'"'$_GET);
$_POST str_replace("'"'"'$_POST);
$_COOKIE str_replace("'"'"'$_COOKIE);
$_SERVER str_replace("'"'"'$_SERVER);

function 
strips(&$el) {
  if (
is_array($el))
    foreach(
$el as $k=>$v)
      
strips($el[$k]);
  else 
$el stripslashes($el);
}
if (
get_magic_quotes_gpc())
{
strips($_GET);
strips($_POST);
strips($_COOKIE);
strips($_REQUEST);
if (isset(
$_SERVER['PHP_AUTH_USER'])) strips($_SERVER['PHP_AUTH_USER']);
if (isset(
$_SERVER['PHP_AUTH_PW']))   strips($_SERVER['PHP_AUTH_PW']);
}

?>


А после соединения с базой делаю так:

<?
if (!get_magic_quotes_gpc())
{
$_GET mysql_escape_string($_GET);
$_POST mysql_escape_string($_POST);
$_COOKIE mysql_escape_string($_COOKIE);
$_SERVER mysql_escape_string($_SERVER);
}
?>

и includ'ом вставляю во все скрипты, тока вот никак не могу узнать работает это или нет? =(

   
 
 автор: Kolbo4ka   (26.09.2007 в 16:30)   письмо автору
 
   для: Kolbo4ka   (25.09.2007 в 23:44)
 

Подскажите?

   
 
 автор: sim5   (26.09.2007 в 17:14)   письмо автору
 
   для: Kolbo4ka   (26.09.2007 в 16:30)
 


<?
$str 
"as string's";
echo 
mysql_escape_string($str);
?>

   
 
 автор: kasmanaft   (26.09.2007 в 17:24)   письмо автору
 
   для: Kolbo4ka   (25.09.2007 в 23:44)
 

Вот это, наверно, лишнее
$_GET = str_replace("'", '"', $_GET); 
$_POST = str_replace("'", '"', $_POST); 
$_COOKIE = str_replace("'", '"', $_COOKIE); 
$_SERVER = str_replace("'", '"', $_SERVER);



<?
// если магические кавычки включены, вырезали все обратные слеши.
if (get_magic_quotes_gpc()) 

strips($_GET); 
strips($_POST); 
strips($_COOKIE); 
strips($_REQUEST); 
if (isset(
$_SERVER['PHP_AUTH_USER'])) strips($_SERVER['PHP_AUTH_USER']); 
if (isset(
$_SERVER['PHP_AUTH_PW']))   strips($_SERVER['PHP_AUTH_PW']); 
}

* * * *

// если кавычки выключены, добавили слеши... Смысл тогда их отрезать наверху? =)
if (!get_magic_quotes_gpc())

$_GET mysql_escape_string($_GET); 
$_POST mysql_escape_string($_POST); 
$_COOKIE mysql_escape_string($_COOKIE); 
$_SERVER mysql_escape_string($_SERVER); 
}
// к тому же в mysql_escape_string() нужно сувать строку.

   
 
 автор: Kolbo4ka   (26.09.2007 в 19:19)   письмо автору
 
   для: kasmanaft   (26.09.2007 в 17:24)
 

Тоесть? Можно конкретнее что оставить а что убрать и вообще не понимаю работает это или нет =(

   
 
 автор: kasmanaft   (26.09.2007 в 19:59)   письмо автору
 
   для: Kolbo4ka   (26.09.2007 в 19:19)
 

Нет, это правильно работать не может.
Оставить нужно что-то одно из двух.. Как заметил cheops, оба подхода рабочие.
Я бы оставил то, что до " * * * * ", а перед добавлением данных в БД использовал mysql_escape_string(). Прямо в запросе "SELECT * FROM `table` WHERE name='".mysql_escape_string($name)."'"

Суть в том, что перед запросом в БД, нужно экранировать все "опасные" символы. Если бы не было магических кавычек, было бы проще... Экранировал - и нет проблем.
А так может случиться, что магические кавычки экранировали спецсимволы, потом вы еще раз сделали это же. Получится бяка. Приходится учитывать: включены ли эти чудокавычки или нет.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования