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

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

Strict Standards: Resource ID#37 used as offset, casting to integer (37) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Версия для печати :: PHP + MySQL [2]
ТвойWeb » WebMaster класс » PHP/Perl » PHP + MySQL

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

11. Furax - 12 Марта, 2008 - 23:43:11 - перейти к сообщению
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']) преобразуется обратно в строковое представление, но эта строка уже не будет содержать ничего, кроме цифр.
12. Systemnik - 13 Марта, 2008 - 03:57:38 - перейти к сообщению
ок большое спасибо теперь прочитайте мой предыдуший пост пожалуйста и помогите если можете..

и вот вопорс номер 2.. а если я хочу что бы страницу получало не цифрой идом
а текстом page=text.. как мне сделать так что бы не было скул иньекта? Растерялся
13. Furax - 13 Марта, 2008 - 06:58:25 - перейти к сообщению
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!');
14. Systemnik - 13 Марта, 2008 - 07:04:44 - перейти к сообщению
Спасибо большое ваш пример аосолютно рабочий но та есть некоторые опечатки я их поправил все работает! Подмигивание

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

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

Этот пример можно использовать в действии?
15. Furax - 13 Марта, 2008 - 08:03:24 - перейти к сообщению
Systemnik
die - это не оператор, а функция. Она завершает работу скрипта, выведя свой аргумент.

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

А ка сдеать что бы пропускала @
17. yura3d - 13 Марта, 2008 - 14:05:42 - перейти к сообщению
Systemnik пишет:
Вот еще вопрос объясните функция mysql_num_rows
поподробнее чо делает?

эта функция возвращает число, равное количеству извлечённых записей запросом SELECT. то есть если в результате запроса из таблицы извлечены 3 записи, то функция возвратит значение 3. подробное описание с примерами можно посмотреть здесь: http://php.net/mysql_num_rows
18. Systemnik - 14 Марта, 2008 - 01:02:43 - перейти к сообщению
Спасибо, у меня возникла вследующая проблема,
вот у меня есть сайт когда человек заходит на 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);
?>
19. Furax - 14 Марта, 2008 - 07:02:40 - перейти к сообщению
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("Данной страницы не существует.");
}

?>
20. Systemnik - 14 Марта, 2008 - 08:08:04 - перейти к сообщению
литерале - что это такое? Растерялся
почему ставятся кавычки поверх переменной я понял.. немного подумав над стандарттами программирования Подмигивание
Расскажите о функции isSet()

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

Форум на AlfaSpace.NET


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

[Script Execution time: 0.0374]     [ 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