Strict Standards: Resource ID#18 used as offset, casting to integer (18) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#23 used as offset, casting to integer (23) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#25 used as offset, casting to integer (25) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#26 used as offset, casting to integer (26) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: PHP + MySQL [2]
ТвойWeb ТвойWeb
Качественный Европейский хостинг
Форум для чайников
 Чат на форуме      Помощь      Поиск      Пользователи


 Страниц (6): « 1 [2] 3 4 5 6 »   

> Без описания
Furax
Отправлено: 12 Марта, 2008 - 23:43:11
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Systemnik
(int) приводит строку из GET-переменной к целочисленному типу.

Если написать так:
CODE:
$sql = @mysql_query("SELECT * FROM x_name WHERE `$11` = $_GET[page] LIMIT 1")
То я могу передать в переменной page что угодно сразу на выполнение в базу данных. Например, передав в этой переменной текст
CODE:
1; DELETE FROM x_name WHERE 1; SELECT * FROM x_name WHERE `$11` = 1
Я могу фактически удалить все данные из таблицы x_name. Разумеется, можно поправить любые пароли, хранящиеся в базе, добавить или удалить таблицы и т. д. Это была бы грандиозная дыра в безопасности.

(int) сначала приводит строку к целочисленному типу (для строки, в которой содержится что-то, отличное от числа, возвращает 0). Таким образом, я уже не могу выполнить в твоей БД никакого кода, кроме того, который ты формируешь сам.

Точки - это сложение строк в PHP - я мог бы, разумеется, написать так:
CODE:
$page = (int)$_GET['page'];
$sql = @mysql_query("SELECT * FROM x_name WHERE `$11` = $page LIMIT 1");
Результат был бы тот же. Но я поленился писать в две строки, объединив всё в одну. Разумеется, при сложении со строкой целое ((int)$_GET['page']) преобразуется обратно в строковое представление, но эта строка уже не будет содержать ничего, кроме цифр.
 
 Top
Systemnik Администратор
Отправлено: 13 Марта, 2008 - 03:57:38
Post Id



ExBB Developer Team


Покинул форум
Сообщений всего: 778
Дата рег-ции: Дек. 2007  

Карма 0




ок большое спасибо теперь прочитайте мой предыдуший пост пожалуйста и помогите если можете..

и вот вопорс номер 2.. а если я хочу что бы страницу получало не цифрой идом
а текстом page=text.. как мне сделать так что бы не было скул иньекта? Растерялся

(Отредактировано автором: 13 Марта, 2008 - 03:59:48)

 
 Top
Furax
Отправлено: 13 Марта, 2008 - 06:58:25
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Systemnik
CODE:
$sql = @mysql_query("SELECT * FROM site_stranichki WHERE `id` = " . (int)$_GET['page'] . " LIMIT 1");
if (mysql_num_rows($sql))
{
$strings = mysql_fetch_row($sql);
echo($strings[1]);
} else {
echo("Данной страницы не существует.");
}


По второму вопросу - нужно просто проверить значение переменной. Например:
CODE:
if (!preg_match('/^\w+$/', $_GET['page']) die('Hack detected!');

(Отредактировано автором: 13 Марта, 2008 - 08:05:05)

 
 Top
Systemnik Администратор
Отправлено: 13 Марта, 2008 - 07:04:44
Post Id



ExBB Developer Team


Покинул форум
Сообщений всего: 778
Дата рег-ции: Дек. 2007  

Карма 0




Спасибо большое ваш пример аосолютно рабочий но та есть некоторые опечатки я их поправил все работает! Подмигивание

Простите что там мног вопросов.. die() это стандартный ператор php?
Чем он отличается от print() и echo() ?

Цитата:
По второму вопросу - нужно просто проверить значение переменной. Например:

Этот пример можно использовать в действии?

(Отредактировано автором: 13 Марта, 2008 - 07:07:16)

 
 Top
Furax
Отправлено: 13 Марта, 2008 - 08:03:24
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Systemnik
die - это не оператор, а функция. Она завершает работу скрипта, выведя свой аргумент.

Использовать можно. Потестировав, конечно. По идее, пример не должен пропускать ничего, кроме строки, состоящей из цифр, латинских букв, символа "_" и, возможно, "-" (не помню точно).
 
 Top
Systemnik Администратор
Отправлено: 13 Марта, 2008 - 13:02:41
Post Id



ExBB Developer Team


Покинул форум
Сообщений всего: 778
Дата рег-ции: Дек. 2007  

Карма 0




Вот еще вопрос объясните функция mysql_num_rows
поподробнее чо делает?
Цитата:
символа "_" и,

А ка сдеать что бы пропускала @
 
 Top
yura3d
Отправлено: 13 Марта, 2008 - 14:05:42
Post Id


Super Member


Покинул форум
Сообщений всего: 624
Дата рег-ции: Июль 2007  
Откуда: Минск, Беларусь

Карма 17




Systemnik пишет:
Вот еще вопрос объясните функция mysql_num_rows
поподробнее чо делает?

эта функция возвращает число, равное количеству извлечённых записей запросом SELECT. то есть если в результате запроса из таблицы извлечены 3 записи, то функция возвратит значение 3. подробное описание с примерами можно посмотреть здесь: http://php.net/mysql_num_rows
 
 Top
Systemnik Администратор
Отправлено: 14 Марта, 2008 - 01:02:43
Post Id



ExBB Developer Team


Покинул форум
Сообщений всего: 778
Дата рег-ции: Дек. 2007  

Карма 0




Спасибо, у меня возникла вследующая проблема,
вот у меня есть сайт когда человек заходит на index.php сразу пишет что данной страницы нет в бд... как мне прописать в бд главную страницу.. ведь чловек не пишет index.php?page=glavnaya как сделать что бы человек просто набирал index.php
и составлялся правильный запрос для бд скажите?

Вот еще проблема Furax подскажи вот я хочу сделать что бы я вводил page=bukvi
Вот я написал код:

CODE:
<?php
// Информация для досутпа к бд MySQL
$dbserver = "localhost"; // Имя сервера
$dbuser = "$$$"; // Имя пользователя
$dbpasswd = "$$$"; // Пароль
$dbname = "$$$"; // Имя базы данных

// Основые запросы для начала работы с бд
@mysql_connect($dbserver,$dbuser,$dbpasswd);
@mysql_select_db($dbname);

// Работа с генерацией страницы засчет базы данных
$sql = @mysql_query("SELECT * FROM site_stranichki WHERE `id` = "$_GET['page']" LIMIT 1");
if (!preg_match('/^\w+$/', $_GET['page']) {
die('Hack detected!');
}
$strings = @mysql_fetch_row($sql);
if (mysql_num_rows($sql))
{
echo($strings[1]);
} else {
echo("Данной страницы не существует.");
}

@mysql_close($db);
?>

(Отредактировано автором: 14 Марта, 2008 - 01:15:25)

 
 Top
Furax
Отправлено: 14 Марта, 2008 - 07:02:40
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Systemnik
А теперь посмотрим, в какой последовательности ты выполняешь действия.

В 12 строке ты отправляешь в базу данных на выполнение введённый пользователем код, а только в 13 интересуешься, а не введено ли там что-то не то. Поздно пить боржоми - почки отвалились!

В 16 строке ты получаешь данные из базы, а только в 17 начинаешь выяснять, а была ли вообще выбрана хоть одна строка.

Если ты хочешь допускать разные спецсимволы в идентификаторах, то проще всего перевести строку целиком в безопасный вид. То есть, чтобы, например, выбрать строки, метки которых выглядят как It's x\2+y\2, нужно заключить всю строку в одинарные кавычки и отбить обратными слэшами все "плохие" символы, чтобы база данных получила запрос такого вида:
CODE:
SELECT * FROM `table` WHERE `mark` = 'It\'s x\\2+y\\2'
Отбивает слэшами "плохие" символы функция addSlashes(), а кавычки придётся добавить вручную. После этого можно смело совать строку в базу данных - ничего плохого она уже не сделает.

Кроме того, у тебя ошибка в 12 строке: вторая двойная кавычка завершила строковый литерал, поэтому для добавления к первой части строки содержимого GET-переменной нужно поставить точку (конкатенация строк):
CODE:
"SELECT * FROM site_stranichki WHERE `id` = " . $_GET['page'] . " LIMIT 1"
Можно также написать и вот так:
CODE:
"SELECT * FROM site_stranichki WHERE `id` = $_GET[page] LIMIT 1"
Обрати внимание на отсутствие кавычек вокруг слова page - поскольку оно и так упоминается в строковом литерале, необходимость в кавычках отпадает. Если же ты хотел просто поставить кавычки вокруг содержимого GET-переменной, то используй одинарные, чтобы они не перекрывались с теми, что формируют всю строку:
CODE:
"SELECT * FROM site_stranichki WHERE `id` = '$_GET[page]' LIMIT 1"


Посему отредактированный код будет выглядеть вот так:
CODE:
// Информация для досутпа к бд MySQL
$dbserver = "localhost"; // Имя сервера
$dbuser = "$$$"; // Имя пользователя
$dbpasswd = "$$$"; // Пароль
$dbname = "$$$"; // Имя базы данных

// Основые запросы для начала работы с бд
@mysql_connect($dbserver,$dbuser,$dbpasswd);
@mysql_select_db($dbname);

if (!isSet($_GET['page'])) //Если пользователь пришёл просто на index.php
$page = 'default'; //Метка по умолчанию
else
$page = addSlashes($_GET['page']); //Отбили слэшами "плохие" символы

// Работа с генерацией страницы засчет базы данных
//Обрати внимание на кавычки вокруг $page
$sql = @mysql_query("SELECT * FROM site_stranichki WHERE `id` = '$page' LIMIT 1");
if (mysql_num_rows($sql))
{
$strings = @mysql_fetch_row($sql);
echo($strings[1]);
} else {
echo("Данной страницы не существует.");
}

?>
 
 Top
Systemnik Администратор
Отправлено: 14 Марта, 2008 - 08:08:04
Post Id



ExBB Developer Team


Покинул форум
Сообщений всего: 778
Дата рег-ции: Дек. 2007  

Карма 0




литерале - что это такое? Растерялся
почему ставятся кавычки поверх переменной я понял.. немного подумав над стандарттами программирования Подмигивание
Расскажите о функции isSet()

Возникли проблемы с кодировкой таблица win-1251
как решить?

(Отредактировано автором: 14 Марта, 2008 - 10:37:55)

 
 Top
Страниц (6): « 1 [2] 3 4 5 6 »
Сейчас эту тему просматривают: 3 (гостей: 3, зарегистрированных: 0, скрытых: 0)
« PHP/Perl »


Все гости форума могут просматривать этот раздел.
Только администраторы и модераторы могут создавать новые темы в этом разделе.
Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
 



Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0523]     [ Gzipped ]



Notice: ob_end_flush(): failed to send buffer of ob_gzhandler (1) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/page_tail.php on line 33