PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
igosja
Отправлено: 23 Октября, 2013 - 20:29:55
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Март 2013  
Откуда: https://vhol.org


Помог: 3 раз(а)




Здравствуйте, форумчане.
Прошу вашей помощи со следующей проблемой.

У меня на разрабатываемом сайте есть необходимость пересчета больших объемов статистической информации (онлайн менеджер, пересчет игровой ситуации), пересчитывающие скрипты разбиты на файлы, которые запускаются цепочкой (для избежания сверхлимитного использования процессорного времени хостинга).

Все файлы работаю нормально, кроме одного файла - player_phisical.php?limit=0.
Код проблемной части файла:
PHP:
скопировать код в буфер обмена
  1. include '../../database.php';
  2. include '../../function.php';
  3.  
  4. $limit = $_GET['limit'];
  5. $player_sql = mysql_query("     SELECT `player_id`, `player_phisical`
  6.                                 FROM `player`
  7.                                 WHERE `player_age`<'40'
  8.                                 LIMIT $limit, 100");
  9. $count_player = mysql_num_rows($player_sql);
  10. if ($count_player > 0)
  11. {
  12.         $shedule_sql = mysql_query("    SELECT `shedule_id`
  13.                                         FROM `game`, `shedule`
  14.                                         WHERE `game_played`='0'
  15.                                         AND `game_shedule_id`=`shedule_id`
  16.                                         ORDER BY `shedule_date`
  17.                                         LIMIT 1");
  18.         $shedule_id_new = mysql_result($shedule_sql,0,'shedule_id');
  19.         print $shedule_id_new; /*Строка введена для поиска ошибки - ошибка именно в этой выборке. Потом идут расчеты с обновлением таблиц*/
  20.         $limit = $limit + 100;
  21.         $href = 'player_phisical.php?limit='.$limit;
  22.         print   '<script type="text/javascript">
  23.                 function doit()
  24.                 {
  25.                         window.location.href="'.$href.'";
  26.                 }
  27.                 setTimeout(doit, 1);
  28.                 </script>';
  29. }
  30. else
  31. {
  32.         $href = 'player_realpower.php?limit=0';
  33.         print   '<script type="text/javascript">
  34.                 function doit()
  35.                 {
  36.                         window.location.href="'.$href.'";
  37.                 }
  38.                 setTimeout(doit, 1);
  39.                 </script>';
  40. }


Проблема в том, что при запуске этого файла в общей цепочке начиная с index.php значение переменной $shedule_id_new выбирается неправильное - оно постоянно равно 39. Если же файл запустить отдельно через адресную строку .../player_phisical.php?limit=0, переменная выбирается правильно - она варьируется в диапазоне от 1 до 92. Кроме limit файл ничего не получает с предыдущего скрипта, переменная не переприсвается.

Подскажите в чем может быть проблема, так как я додуматься никак не могу.
 
 Top
esterio
Отправлено: 23 Октября, 2013 - 22:09:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 5027
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




да здраствует sql-иньекция

http://phpfaq[dot]ru/debug
 
 Top
igosja
Отправлено: 24 Октября, 2013 - 08:18:48
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Март 2013  
Откуда: https://vhol.org


Помог: 3 раз(а)




esterio пишет:
да здраствует sql-иньекция

Это очень помогает в решении моей проблемы.
 
 Top
Silver Soft
Отправлено: 25 Октября, 2013 - 07:01:56
Post Id


Гость


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


Помог: 0 раз(а)




Действительно, так делать нельзя у вас в первый запрос подставляется не проверенная переменная из GET в запрос, что мешает в адресной строке написать в limit не цифру а SQL-запрос)

esterio пишет:
http://phpfaq[dot]ru/debug

очень правильная ссылка, советую почитать, там как раз про то как отлавливать ошибки.

так не совсем видно, где закралась ошибка... я незнаю, какую цель вы преследуете, но во втором запросе, я бы не подключал сразу две таблицы, а воспользовался бы INNER JOIN)
 
 Top
deblogger
Отправлено: 01 Ноября, 2013 - 10:15:49
Post Id


Новичок


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


Помог: 0 раз(а)

[+]


PHP:
скопировать код в буфер обмена
  1. $shedule_sql = mysql_query("    SELECT `shedule_id`
  2.                                        FROM `game`, `shedule`
  3.                                        WHERE `game_played`='0'
  4.                                        AND `game_shedule_id`=`shedule_id`
  5.                                        ORDER BY `shedule_date`
  6.                                        LIMIT 1");
  7.         $shedule_id_new = mysql_result($shedule_sql,0,'shedule_id');


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

Добавьте явное указание ASC или DESC.

(Добавление)
Про инъекции. Никому они не стучат.

ТС, на всякий случай можете вот так сделать

$limit = (int) $_GET['limit'];
if($limit < 0) die('Короче, склифасофский!');

(Отредактировано автором: 01 Ноября, 2013 - 10:20:07)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0)
« Работа с СУБД »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB