Безопасность MySQL

Shadow

Guest
Безопасность MySQL

Сидел вот сейчас, читал мануал... Глава 4. Безопасность. Безопасность баз данных

Меня, естественно заинтересовал вопрос безопасности доступа к MySQL.
Вот код из мануала:
PHP:
$offset = argv[0]; // видите, никакой проверки ввода!
$query  = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
// с PostgreSQL 
$result = pg_exec($conn, $query);
// с MySQL
$result = mysql_query($query);
Обычно пользователи щёлкают ссылки 'next', 'prev', где $offset кодируется в URL. Скрипт ожидает, что входящее $offset это 10-ричное число. Однако кто-нибудь может попытаться вломиться, присоединив urlencode()'ированную форму следующей информации к URL:

// в MySQL
0;
UPDATE user SET Password=PASSWORD('crack') WHERE user='root';
FLUSH PRIVILEGES;

Если это произойдёт, то скрипт даст доступ superuser'а к нему…
Попытался я проверить все это на практике, создав условия дыры у себя на сайте. Но меня поджидал облом… Запрос просто не выполнился. Как я понял, mysql_query() не может выполнить сразу более одного запроса. Я это замечал и раньше, но теперь я в некоторой растерянности. С одной стороны мануал утверждает о таком возможном баге, но с другой стороны такая возможность просто напрочь отметается моим опытом…

Что это: глюк моего интерпретатора php или ошибка мануала???
 

Shadow

Guest
Ничего... Я просто спрашиваю нормально это или глюк?
И почему тогда в мануале описан такой баг?
 

Кром

Новичок
mysql_query() может выполнять только одну команду, это написано в мануале по PHP.
А shell доступ это совсем другое.
 

Сергей123

Новичок
Тем, кто (для описанной тобою ситуации, например) использует intval($offset), это не интересно. Улавливаешь?
 

Shadow

Guest
Автор оригинала: Кром
mysql_query() может выполнять только одну команду, это написано в мануале по PHP.
А shell доступ это совсем другое.
В мануале написано
строка запроса не должна заканчиваться точкой с запятой (;).

Это, конечно, можно расценить, как признак того, что в mysql_query() можно подать лишь один запрос. Но не более того... Кроме того, мануал приводит нам описанный выше пример. Противоречие... Может у меня мануал старый...

А что на счет shell доступа?

А в продолжение темы хочу задать такой вопрос: Достаточно ли использования addslashes() для безопасного выполнения INSERT и UPDATE запросов, ну типа:
PHP:
$query="UPDATE `table` SET `field`=\"".addslashes($_POST['field'])."\"";
mysql_query($query);
Не сможет ли злоумышленник "дописать" такой запрос, добавив допустим еще некоторые поля для апдейта в обход addslashes()?
 

Кром

Новичок
>Это, конечно, можно расценить, как признак того, что в mysql_query() можно подать лишь один запрос. Но не более того...

Это только так и можно расценить. Если ты еще но понял, все запросы к базе в mysql разделяются символом ";"

>Кроме того, мануал приводит нам описанный выше пример. Противоречие... Может у меня мануал старый...

Противоречие у тебя в голове. Еще раз обьясняю. Ты смотришь в два разных мануала. Один по mysql, другой по php. Мануалы разные потому, что сами продукты разные. Улавливаешь разницу?

>А что на счет shell доступа?

shell-доступ - это доступ через консоль:
mysql> FLUSH PRIVILEGES;
 

Shadow

Guest
>Это только так и можно расценить. Если ты еще но понял, все запросы к базе в mysql разделяются символом ";"

Я прекрасно понимаю, что все запросы к MySQL разделяются точкой с запятой... Но ничто не мешает написать:
PHP:
mysql_query("SELECT * FROM `table`; UPDATE user SET Password=PASSWORD('crack') WHERE user='root'");
Строка запроса и не заканчивается точкой с запятой, но там 2 запроса... Не нужно говорить, что я туплю, просто это тоже не противоречит мануалу.
Думаю, этот вопрос можно закрыть.

>Противоречие у тебя в голове. Еще раз обьясняю. Ты смотришь в два разных мануала. Один по mysql, другой по php. Мануалы разные потому, что сами продукты разные. Улавливаешь разницу?

Прошу прощения... Но не догоняю... Я понимаю, что, работая с консолью, можно сразу отправить несколько запросов. Но мы смотрим мануал по php. И в этом примере в mysql_query() отправляется сразу 3 запроса. И говорится, что все они выполнятся... и shell доступ здесь не при чем...

-~{}~ 12.08.04 14:04:

Автор оригинала: Demiurg
[f]slashes[/f]
Ok! Спасибо!
 

Кром

Новичок
>Думаю, этот вопрос можно закрыть.

Раное еще вопрос закрывать.

>Строка запроса и не заканчивается точкой с запятой, но там 2 запроса... Не нужно говорить, что я туплю, просто это тоже не противоречит мануалу.

Это противоречит мануалу по той простой причине, что запроса именно два! И один из них заканчивается точкой с запятой.

>Но мы смотрим мануал по php. И в этом примере в mysql_query() отправляется сразу 3 запроса. И говорится, что все они выполнятся...

Покажи, где в мануале по php это написано.
 

Falc

Новичок
Кром
>>Покажи, где в мануале по php это написано.

Он в первом посте написал: "Безопасность. Безопасность баз данных"
 

Кром

Новичок
>Он в первом посте написал: "Безопасность. Безопасность баз данных"

Да, нашел. Фигня какая-то написана.
 

Shadow

Guest
Вот ссылка: http://www.php.net/manual/ru/security.database.php

У меня offline версия. Там глава 4....

-~{}~ 12.08.04 14:42:

Кстати в комментариях там описана эта ошибка... :)
 
Сверху