Autor Zpráva
ZaNe
Profil *
Zdravím a prosím o pomoc,
nevím jak vyřešit následující:
Takto generuji stránky (přiznávám bez mučení, že jsem to někde opsal - tuším na intervalu):

<?if(IsSet($kod) && $kod == "nejaky_kod"):?>
<?endif;?> 
<?
 $kod = "nejaky_kod";
 if(IsSet($_GET['page'])):

 switch($page) {
   case "stranka1":
   $url = "pages/stranka1.php";
   break;
   case "stranka2":
   $url = "pages/stranka2.php";
   break;
   case "stranka3":
   $url = "pages/stranka3.php";
   break;
   default:
   $url = "pages/uvod.php";
 }
 else: $url = "pages/uvod.php";
 endif;
 require $url;
?> 


Problém následující: když zadám v prohlížeči adresu ve tvaru: http://www.example.cz/neco.php tak se mi buď načte bílá stránka(to v případě, že požadovaná stránka existuje - což je předpokládám v pořádku), nebo chybové hlášení (404 bla bla bla). Je možné nějak ošetřit, aby, když zadám cokoli mimo správného formátu: http://www.example.cz/?page=neco to uživatele koplo na index.php nebo na mnou určenou stránku? Třeba 404.php? Uměl by někdo z Vás výše uvedené v tomto duchu přepsat? Nechci a ani nemůžu to řešit přes .htaccess a i databáze jsou nad mé síly. :-(
Děkuji za každou dobře míněnou radu.
Majkl578
Profil
pokud zadas neexistujici soubor, apache vrati 404. to muzes zmenit jen v htaccessu
mmj, kod do tagu pre
Radek9
Profil
<?php
    $page=$_GET["page"];
    $dir="url/";
    $uvodni="uvod.php";
   if ($page) {
    if (file_exists($dir.$page.".php"))
        include($dir.$page.".php");
        else { include $dir."404.php"; }
    }
    else {                            
    include  ($dir.$uvodni);
   }
?>

Tady máš možnost pomocí includu.
ZaNe
Profil *
Tuto variantu pomocí includu mám. Chtěl jsem se jí vyhnout. Podle toho co jsem našprtal to není moc dobré řešení. Nicméně děkuji.
Alphard
Profil
ZaNe:
Podle toho co jsem našprtal to není moc dobré řešení.
Nemyslím si, že by to bylo až tak zlé. Neškodilo by doplnit kontrolu, jestli $page neobsahuje /, aby se útočník nemohl pohybovat v adresářové struktuře, a nějaké podmínky pro případ neexistující $_GET['page'], ale jinak v pořádku.

Vaše řešení je dost pracné. Jestli chcete mít za každou cenu vypsané možné stránky, bylo by přehlednější dát je do pole.
ZaNe
Profil *
O umístění stránek do pole jsem cosi našel a právě se tím snažím prokousat, ale zatím mi to moc nejde. Příklad co jsem našel není moc přehledný. Bude to asi chvíli trvat... Varianta kterou jsem uvedl se mi líbí, protože se dá pohodlně použít i pro vkládání různých hlaviček podle toho jaká stránka je volána a navíc je to poměrně blbuvzdorné.
AM_
Profil
- nejschůdnější řešení je skutečně to, co psal Radek9, s tím, že tam přidáš nějakou ochranu:
$page = preg_replace('/[^a-z0-9]/i', '', $page);

Toto zcela spolehlivě z požadované stránky odstraní všechno kromě číslic a písmen - pokud pak includuješ "stranky/$page.php", a přímo ve složce stránky máš s koncovkou .php POUZE soubory vhodné k tomuto vkládání, není na tom nic nezabezpečeného a i se to tak řeší.

- k tvému řešení přes switch: oproti předchozímu je krajně nepohodlné - představ si, jak bude switch vypadat, až budeš mít padesát sekcí. Ale to, o čem mluvíš, už tam je: je to větev default, pokud uživatel zadá špatný parametr, zobrazí se mu uvod.php
PI
Profil *
Dotaz k Vaší debatě pánové:
Když budu mít soubor např text.php který bude obsahovat pouze toto <p>text</p> a nechci ho vkládat do index.php pomocí <? include "text.php"; ?> Chtěl bych, aby to vypadalo takto <div>Vlož soubor z adresy slozka/text.php; ověř zda se takový soubor v této složce nachází - pokud ano, vlož ho - pokud ne vlož soubor slozka2/404.php</div>
Jak by takový skript vypadal. Byl by napadnutelný. Jde mi o to, že potřebuji, aby jistý soubor (text.php) v ráci webu upravovala kolegyně. Tedy vyhradím jí FTP přístup pouze do jedné složky kam ona upravený soubor vždycky nahraje. Ve stránce nebude tedy volána žádná jiná stránka - pouze text.php a pokud jí tam nenahraje vyvolá se soubor 404.php.
Díky za vyjádření. PI.
PI
Profil *
[#8]
Šlo by do toho skriptu vložit ještě nějaké ověření pomocí kódu jako to má ZANE v prvním příspěvku?
AM_
Profil
Stačí tam místo proměnné dát napevno:
if (file_exists("soubory/text.php")){
  include "slozka/text.php";
} else {
  include "slozka2/404.php";
}

Nic nezabezpečeného na tom není.
AM_
Profil
Šlo by do toho skriptu vložit ještě nějaké ověření pomocí kódu jako to má ZANE v prvním příspěvku?
Nemám ponětí, k čemu to tam je a jak to má fungovat (žeby ochrana heslem - ale je to dost špatně)? Jelikož to nic nedělá, je tam jedna prázdná podmínka a pak proměnná, se kterou se dál vůbec nepracuje. Buď je to v tom ZANEho skriptu vytrženo z kontextu, nebo napsáno nějak divně. Zkus napsat, co tam sám chceš.
PI
Profil *
1. Děkuji za info. Takže jestli jsem to dobře pochopil, mohlo by to vypadat nějak takto (zkoušel jsem to a funguje to):

<?php
$filename="slozka/text.php";
if (file_exists("slozka/text.php")){
include "slozka/text.php";
}
else {
include "slozka2/404.php";
}
?>

Je to v pořádku?

2. K tomu kódu ve skriptu ZANA: našel jsem ten článek na intervalu (zkusil jsem to).
http://interval.cz/clanky/dynamicke-generovanie-stranky-v-php/

index.php:

<!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>něco</title>
<link rel="stylesheet" type="text/css" href="css/layout.css">
</head>
<body>
<div id="hlavni">
<div id="stranka_obal">
<div id="hlavicka"> <!-- hlavicka -->
<h1>Nadpis 1</h1>
</div> <!-- hlavicka konec -->
<div class="obsah_text">
<div id="text"> <!-- text -->
<?
$kod = "5e9c";
if(IsSet($_GET['page'])):

switch($page) {
case "stranka1":
$url = "pages/stranka1.php";
break;
case "stranka2":
$url = "pages/stranka2.php";
break;
case "stranka3":
$url = "pages/stranka3.php";
break;
default:
$url = "pages/uvod.php";
}
else: $url = "pages/uvod.php";
endif;
require $url;
?>
</div> <!-- text konec -->
<div id="reset">&nbsp;</div> <!-- "natahovac vysky stranky" -->
</div> <!-- obsah_text konec -->
<div id="paticka"> <!-- paticka -->
<h2>Patička stránky</h2>
</div> <!-- paticka konec -->
</div> <!-- stranka_obal konec -->
</div> <!-- hlavni konec -->
</body>
</html>


stranka1.php:

<?if(IsSet($kod) && $kod == "5e9c"):?>
<p>Toto je stránka 1</p>
<?endif;?>

Z toho co jsem vyrozuměl, měla by to být ochrana proti otevření vkládaných stránek bez stránky index.php. Funguje to také tak, že pokud ve vkládané stránce skript s kódem je a kód vkládané stránky nesouhlasí - stránka se prostě nevloží.
Nicméně pokud ve vkládané stránce skript s kódem není - stránka se prostě vloží.
Myslíte, že by to šlo přepracovat takhle: volám stránku stranka1.php; za prvé ověř zda stránka existuje, zda tam je skript s kódem, pokud ano, ověř zda kód odpovídá kódu vloženému ve stránce index.php; pokud ano, vlož stranka1.php; pokud stránka neexistuje, nebo tam skript s kódem není, nebo kód neodpovídá kódu ve stránce index.php vlož stránku 404.php

Tušíte jak do toho?
AM_
Profil
1: je to v pořádku, je to přesně zkopírované to, co jsem psal já :) (proměnnou $filename tam nepoužíváš, proč ji tedy zavádíš?)
2: na ty kódy se vykašli a do složky pages (nebo slozka1, prostě tam, kde máš ty vkládané soubory) vlož .htacces s řádkem:;
deny from all

navíc to řešení je zbytečně složité, používat tady switch je trochu chození s dělem na komára. Použij raději [#3] dopněno o bezpečnostní [#7]. A ještě, je to závislé na register_globals (fuj), které se už na serverech vypínají, a navíc je motáš se superglobálními, za if (isset($_GET['page'])) vlož $page = $_GET['page'].
PI
Profil *
Musíte mě omluvit. Začínám a dost se s tím peru. Bohužel jsem jeden z těch, kterým studium manuálů nic nedá - učím se velmi bolestivě metodou pokus-omyl - na příkladech. Když tak se s dovolením zeptám. Děkuji.
AM_
Profil
PI
Pokud začínáš, tak co se týče studia manuálů, doporučím ti spíš zakoupit nějakou literaturu, pár set Kč za knížku není velká suma za to, že se naučíš programovat, než se trápit s tutoriály na webu, ne všechny jsou psané lidmi, kteří tomu opravdu rozumí.
Problém PHP je, že metodou pokus-omyl se naučíš hromadu bludů. PHP je hodně tolerantní k chybám a má širokou škálu alternativních zápisů stejné věci, přičemž některé jsou zastaralé, některé lepší a některé horší. Takže kód napsaný metodou pokus-omyl ti většinou přestane fungovat při přechodu na jiný hosting s jiným nastavením, novější verzi PHP a s jeho úpravami se budeš dost trápit.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: