Web-мастер: курс молодого бойца

Хранение изображений в базе данных MySQL

 Страницы: 1 | 2 | 3 | 4 | 5
 

 Добавлено 2008-10-14 22:27:37



Сообщений: 8
Зарегистрирован: 08.10.2008

Цитировать
Итак.
Круг замкнулся. Вчера вечером я перечитал нашу переписку и понял, что могу ответить на все свои вопросы.
Ч и в о я не понимал.
1. То, что вывод картинки организован в 2 этапа:
сначала страница
Цитата

<html>
<head>
<title>Вывод изображения из базы данных</title>
</head>
<body>
<img src="image.php?id=17" alt="" />
</body>
</html>
отправляет команду на вывод скрипту image.php, а уже тот выполняет запрос к базе, получает картинку и передает ее на вывод.
2. Метод геть - и то, что
Цитата
?id=17
и есть команда для запуска скрипта по выводу картинки.
3. Спорный момент. Мне кажется, что проверять в скрипте image/php есть или нет $_GET[id], и корректна ли она - это избыточность. Поскольку, запрос идет не из формы, а с моей же страницы и я не собираюсь сам себе вредить, а если вместо id=17 использовать некую переменную получаемую из формы, то проверка корректности должна проходить на странице обработки формы.

И наконец, 4 пункт.

Можно ли "пощупать", т.е. вывести на экран $_GET?
Получается, что - нет.
Мы же вроде, передаем со страницы на страницу ?id=17 , и проверка
Цитата
if ( isset( $_GET['id'] ) )
показывает, что переменная есть, а
Цитата
echo $_GET['id'];
рисует "пусто" даже если закомментировать все что ниже.
В вашей статье о формах, вы пишите
Цитата
echo $_GET['name']; и получаете " Вася"
и я рассчитывал увидеть тот id, который мы передали.
Спасибо, что уделили мне столько времени.
Наверх  Посмотреть профиль   Отредактировано автором 14.10.2008

 Добавлено 2008-10-15 00:09:15
evgenijj
Модератор




Сообщений: 1371
Зарегистрирован: 09.11.2007

Цитировать
ant пишет:
Мне кажется, что проверять в скрипте image/php есть или нет $_GET[id], и корректна ли она - это избыточность. Поскольку, запрос идет не из формы, а с моей же страницы и я не собираюсь сам себе вредить
В самом деле? А если я наберу в адресной строке что-то вроде этого
http://server.com/image.php?id=17;DELETE%20FROM%20images
а у тебя в скрипте image.php
<?php
...
$query "SELECT content FROM images WHERE id=".$_GET['id'];
...
?>
В результате будут выполнены два запроса
SELECT content FROM images WHERE id=17
DELETE FROM images
Последний запрос уделит все записи в таблице images.
Инъекция SQL

ant пишет:
Можно ли "пощупать", т.е. вывести на экран $_GET? Получается, что - нет. Мы же вроде, передаем со страницы на страницу ?id=17 , и проверка
if ( isset( $_GET['id'] ) )
показывает, что переменная есть, а
echo $_GET['id'];
рисует "пусто" даже если закомментировать все что ниже.
Простейший скрипт test.php:
<?php
echo '<p><a href="'.$_SERVER['PHP_SELF'].'?id=17">Передаем скрипту переменную id методом GET</a></p>';
if ( isset( 
$_GET['id'] ) )
  echo 
'<p>Переменная id='.$_GET['id'].'</p>';
else
  echo 
'<p>Переменная id не определена</p>';
?>
Набираем в адресной строке
http://localhost/test.php
и получаем:
<p><a href="/test.php?id=17">Передаем скрипту переменную id методом GET</a></p>
<p>Переменная id не определена</p>
Щелкаем по ссылке, или набираем в адресной строке
http://localhost/test.php?id=17
и получаем:
<p><a href="/test.php?id=17">Передаем скрипту переменную id методом GET</a></p>
<p>Переменная id=17</p>
Что я не так делаю?


Денежные купюры пронумерованы для того, чтобы когда-нибудь я мог сложить их все одну к одной, по порядку.
Наверх  Посмотреть профиль   Сайт автора Отредактировано автором 15.10.2008

 Добавлено 2008-10-16 14:38:17



Сообщений: 8
Зарегистрирован: 08.10.2008

Цитировать
Цитата

В самом деле? А если я наберу в адресной строке что-то вроде этого
http://server.com/image.php?id=17;DELETE%20FROM%20images
а у тебя в скрипте image.php ...
Допустим, что имя скрипта обработчика узнать можно, но его содержимое, в отличии от страниц на html, не раскрывается (поправьте, если я ошибаюсь). Тогда как "злобный хаккер" узнает название таблицы с которой я работаю. А может, я ваще, храню данные в файле?
Цитата

Щелкаем по ссылке, или набираем в адресной строке
http://localhost/test.php?id=17
и получаем:
<p><a href="/test.php?id=17">Передаем скрипту переменную id методом GET</a></p>
<p>Переменная id=17</p>

Что я не так делаю?
Вы все делаете так и можно придумать разные тесты и я видел, что
Цитата

echo $_GET['name']; получается "Вася"
вы мне в скрипте image.php, вставьте
Цитата
echo $_GET['id'];

Цитата

Мы же вроде, передаем со страницы на страницу ?id=17 , и проверка
if ( isset( $_GET['id'] ) )
показывает, что переменная есть, а
echo $_GET['id'];
рисует "пусто" даже если закомментировать все что ниже.
Наверх  Посмотреть профиль    

 Добавлено 2008-10-16 16:35:23
evgenijj
Модератор




Сообщений: 1371
Зарегистрирован: 09.11.2007

Цитировать
ant пишет:
Допустим, что имя скрипта обработчика узнать можно, но его содержимое, в отличии от страниц на html, не раскрывается (поправьте, если я ошибаюсь).
Все правильно.
ant пишет:
Тогда как "злобный хаккер" узнает название таблицы с которой я работаю.
Про SQL-инъекцию мы уже говорили, а по поводу имени таблицы:
SHOW TABLES
Вернет имена всех таблиц базы данных. Впрочем, что я тебя убеждаю - пиши, как нравится.
ant пишет:
вы мне в скрипте image.php, вставьте
echo $_GET['id'];
Ну мы же уже говорили - если мы отправляем заголовок
header('Content-type: image/gif');
браузер считает, что все далее - это изображение. Если с ним (с изображением) все в порядке, оно будет показано. Если вместе с содержимым картинки выводится еще что-то, браузер не сможет его показать. Firefox в этом случае выводит
Изображение "..." Не может быть показано, так как содержит ошибки.
Вот простой пример скипта, который выводит картинку в браузер (см. вложенный файл). Обращаемя к нему так
http://localhost/image.php?id=17
<?php
header
('Content-type: image/gif');
readfile('image.gif');
?>
Если сделать так
<?php
//header('Content-type: image/gif');
readfile('image.gif');
?>
получим кракозябры - это и есть изображение. А если так
<?php
//header('Content-type: image/gif');
echo $_GET['id'];
readfile('image.gif');
?>
то увидим значение $_GET['id'] а дальше кракозябры (собственно, изображение).


Денежные купюры пронумерованы для того, чтобы когда-нибудь я мог сложить их все одну к одной, по порядку.
Наверх  Посмотреть профиль   Сайт автора Отредактировано автором 16.10.2008

 Добавлено 2008-10-17 20:06:16



Сообщений: 8
Зарегистрирован: 08.10.2008

Цитировать
Цитата
Впрочем, что я тебя убеждаю - пиши, как нравится.
Вы меня не просто убеждаете, а еще и учите.
В инете полно умников, считающих себя профи, потому, что написали несколько скриптов, но не в состоянии объяснить зачем применили ту или иную функцию - просто их так научили и все. Я не хотел бы быть таким же, я хочу понимать зачем пишу ту или иную функцию. И на самом деле, очень вам благодарен за то, что вы так терпеливо и подробно все объясняете.
Теперь по скрипту image.php
Я не полностью понимал деталей происходящих действий и , естественно, не мог правильно сформулировать вопрос, а вы соответственно ответить. Но теперь и здесь вопрос снят.
Вот скрипт:
<?php 
if ( isset( $_GET['id'] ) ) { 
  // Здесь $id номер изображения 
  $id = (int)$_GET['id']; 
  if ( $id > 0 ) { 
    $query = "SELECT * FROM `images` WHERE `id`=".$id; 
    // Выполняем запрос и получаем файл 
    $res = mysql_query($query); 
    if ( mysql_num_rows( $res ) == 1 ) { 
      $image = mysql_fetch_array($res); 
      // Отсылаем браузеру заголовок, сообщающий о том, что сейчас будет передаваться файл изображения 
      header("Content-type: image/*"); 
      // И  передаем сам файл 
      echo $image['content']; 
    } 
  } 

?> 
Поскольку, как я уже писал, isset( $_GET['id'] ) - истинно, то я оставлял только следующее:
<?php 
if ( isset( $_GET['id'] ) ) { 
  
        echo $_GET['id'];
    }  
?> 

Комментировать не буду.

Теперь по "инекциям"
Цитата

В самом деле? А если я наберу в адресной строке что-то вроде этого
http://server.com/image.php?id=17;DELETE%20FROM%20images
а у тебя в скрипте image.php
<?php
...
$query = "SELECT content FROM images WHERE id=".$_GET['id'];
...
?> В результате будут выполнены два запроса
SELECT content FROM images WHERE id=17
DELETE FROM imagesПоследний запрос уделит все записи в таблице images.
Инъекция SQL
Я опробовал это в разных вариантах, но таблица так и не очистилась, и "шоу" таблиц я тоже не увидел.
Наверное я опять какие - то детали упускаю?
Наверх  Посмотреть профиль    
 Страницы: 1 | 2 | 3 | 4 | 5
 
Быстрый ответ
 
Цвет шрифта: Закрыть все теги
Сообщение
Защитный код