SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 31.01.2008 15:45:22

Никита
Завсегдатай
Откуда: Тюмень
Зарегистрирован: 15.11.2007
Сообщений: 73

Изменение данных

Здраствуйте)Подскажите пожалуйста в чем может быть моя ошибка:мне необходимо изменять данные в БД,но вылезает ошибка.

Код:

<form enctype='multipart/form-data' method=post>
Исполнитель:<br>
<INPUT TYPE=text  SIZE=40 NAME=executor_name VALUE=Исполнитель><br>
Фотография исполнителя:<br>
<input type="file" name="image"><br>
<input type=submit value='Загрузить'>
</form>
<?php
$executor_name = $_POST['executor_name'];
  require_once("config.php");
if($_FILES['image']['tmp_name'] != '')
  {
      // Читаем содержимое файла
      $content = file_get_contents($_FILES['image']['tmp_name']);
      // Уничтожаем файл во временной директории
      unlink($_FILES['image']['tmp_name']);
      // Экранируем спец-символы в бинарном содержимом файла
      $content = mysql_escape_string($content);
      // Формируем запрос на добавление файла в таблицу
      $query = "UPDATE executors SET image_content=$content WHERE executor_name = $executor_name ";
      if(mysql_query($query))
      {
        echo "Фотография исполнителя успешно загружена в базу данных<br>";
      } else exit(mysql_error());
      }
?>

Отредактированно Никита (31.01.2008 15:46:18)

Неактивен

 

#2 31.01.2008 15:49:54

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Изменение данных

какая именно ошибка возникает?

Неактивен

 

#3 31.01.2008 15:53:54

Никита
Завсегдатай
Откуда: Тюмень
Зарегистрирован: 15.11.2007
Сообщений: 73

Re: Изменение данных

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\0JFIF\0\0\0\0\0\0яю\0;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality ' at line 1

Неактивен

 

#4 31.01.2008 17:12:39

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Изменение данных

кавычки не стоят в sql-запросе
SET image_content='$content'

И еще - безопасность Вашего кода нулевая по отношению к инъекциям. $_POST['executor_name'] переменная заданная Вам снаружи - Вы передаете ее в sql-запрос без кавычек и без mysql_escape_string (второе делаете, возможно полагаясь на настройку magic_quotes_gpc).

Неактивен

 

#5 31.01.2008 17:31:05

Никита
Завсегдатай
Откуда: Тюмень
Зарегистрирован: 15.11.2007
Сообщений: 73

Re: Изменение данных

Да теперь все работает)А в чем может заключаться опасность от инъекций?

Неактивен

 

#6 31.01.2008 17:40:30

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Изменение данных

У вас запрос UPDATE executors SET image_content=$content WHERE executor_name = $executor_name

Представьте себе, что злонамеренный человек сделал POST, передав executor_name="1 OR 1", тогда запрос у Вас получится
UPDATE executors SET image_content=$content WHERE executor_name = 1 OR 1
Такой запрос (так как 1 - всегда истина) обновить аватар ВСЕМ юзерам.

Есть и другие применения со стороны злоумышленника.

Неактивен

 

#7 31.01.2008 18:49:56

Никита
Завсегдатай
Откуда: Тюмень
Зарегистрирован: 15.11.2007
Сообщений: 73

Re: Изменение данных

А как этого не допустить?

Неактивен

 

#8 31.01.2008 18:55:03

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Изменение данных

В начале всех скриптов сделайте include("common.php"); который взять из кода форума punbb и в вольном изложении приведен далее. Он нивелирует действие magic_quotes_gpc.

Далее, все переменные, перед передачей в SQL-запрос, преобразуйте с помощью mysql_escape_string(), а в самом запросе заключайте в одинарные кавычки.

<?php
/* Based on the original function by Rickard Andersson (rickard@punbb.org) */
function unregister_globals()
{
        // Prevent script.php?GLOBALS[foo]=bar
        if (isset($_REQUEST['GLOBALS']) || isset($_FILES['GLOBALS']))
                exit('I\'ll have a steak sandwich and... a steak sandwich.');

        // Variables that shouldn''t be unset
        $no_unset = array('GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES');

        // Remove elements in $GLOBALS that are present in any of the superglobals
        $input = array_merge($_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES,
isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());
        foreach ($input as $k => $v)
        {
                if (!in_array($k, $no_unset) && isset($GLOBALS[$k]))
                        unset($GLOBALS[$k]);
        }
}



function stripslashes_array($array) {
  return is_array($array) ?
    array_map('stripslashes_array', $array) : stripslashes($array);
}

if (get_magic_quotes_gpc())
{
  $_GET = stripslashes_array($_GET);
  $_POST = stripslashes_array($_POST);
  $_COOKIE = stripslashes_array($_COOKIE);
}

set_magic_quotes_runtime(0);

if (ini_get('register_globals'))
        unregister_globals();

?>

Неактивен

 

#9 31.01.2008 19:02:27

Никита
Завсегдатай
Откуда: Тюмень
Зарегистрирован: 15.11.2007
Сообщений: 73

Re: Изменение данных

То есть должно получиться что то подобное:

Код:

<form enctype='multipart/form-data' method=post>
Исполнитель:<br>
<INPUT TYPE=text  SIZE=40 NAME=executor_name VALUE=Исполнитель><br>
Фотография исполнителя:<br>
<input type="file" name="image"><br>
<input type=submit value='Загрузить'>
</form>
<?php
$executor_name = $_POST['executor_name'];
 include("common.php");
 require_once("config.php");

if($_FILES['image']['tmp_name'] != '')
  {
      // Читаем содержимое файла
      $content = file_get_contents($_FILES['image']['tmp_name']);
      // Уничтожаем файл во временной директории
      unlink($_FILES['image']['tmp_name']);
      // Экранируем спец-символы в бинарном содержимом файла
      $content = mysql_escape_string($content);
mysql_escape_string($content,$executor_name);
      // Формируем запрос на добавление файла в таблицу
      $query = "UPDATE executors SET image_content='$content' WHERE executor_name = '$executor_name' ";
      if(mysql_query($query))
      {
        echo "Фотография исполнителя успешно загружена в базу данных<br>";
      } else exit(mysql_error());
      }
?>

Неактивен

 

#10 31.01.2008 19:21:27

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Изменение данных

Странная строчка: mysql_escape_string($content,$executor_name);

Вы наверное имели в виду: $executor_name = mysql_escape_string($executor_name);

Неактивен

 

#11 31.01.2008 19:23:13

Никита
Завсегдатай
Откуда: Тюмень
Зарегистрирован: 15.11.2007
Сообщений: 73

Re: Изменение данных

Такое нужно проделать со всеми переменными полученными из формы,а все остальное оставить как есть?

Неактивен

 

#12 31.01.2008 20:03:33

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Изменение данных

вообще говоря со всеми переменными, про которые не известно заведомо, что они числовые

Неактивен

 

#13 31.01.2008 20:44:38

Никита
Завсегдатай
Откуда: Тюмень
Зарегистрирован: 15.11.2007
Сообщений: 73

Re: Изменение данных

А с числовыми такое не пройдет?

Неактивен

 

#14 31.01.2008 20:54:08

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Изменение данных

можно и к числовым применять mysql_escape_string(), это ничего не изменить

Вы должны быть уверены, что в переменной число, это можно сделать например так:
$number = intval($_POST['number']);

много уязвимостей возникает из-за неучета данного факта - хитрые взломщики вместо числа передают строку

Неактивен

 

#15 01.02.2008 07:26:58

Никита
Завсегдатай
Откуда: Тюмень
Зарегистрирован: 15.11.2007
Сообщений: 73

Re: Изменение данных

Пасиба что подсказали как улучшить защищенность сайта)Все отлично  заработало)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson