Autor Zpráva
JJ
Profil *
Zdravím,
začínám a chtěl bych požádat zkušenější o připomínkování skriptu a případně o radu na sjednání nápravy. Zde je skript na vkládání stránek dle ID v databázi. V databázi mám pouze umístění stránek, nikoli celé stránky. Skript dělá to co chci, ale nevím zda neobsahuje bezpečnostní díry. Pokoušel jsem se nastudovat i něco o PHP injection a MySQL injection, ale nevím, zda jsem si to vyložil správně. Předem děkuji za všechny dobře míněné rady.

<?php
$conn_user="root";
$conn_pass="heslo";
$conn_server="localhost";
$conn_db="databaze";
$spojeni=mysql_connect($conn_server,$conn_user,$conn_pass);

mysql_select_db($conn_db,$spojeni);
mysql_query("SET character_set_client=cp1250");
mysql_query("SET character_set_connection=cp1250");
mysql_query("SET character_set_results=cp1250");

$page = empty($_GET['page']) ? '1' : $_GET['page'];
if (!is_string($_GET['page'])):   
echo 'Ne!';  
else:  
$page = mysql_real_escape_string($_GET['page']); 
$db = mysql_query("select * from pages where id = '$page'");  
endif;
$results = mysql_num_rows($db);  
  
if ($results == 1) {  
$fetch = mysql_fetch_array($db);  
require $fetch['url'];  
}  

else {  
require $page="pages/404.php";
} 
mysql_close($spojeni);
?>
kordy
Profil *
Databáze mají vlastní fórum :) napiš tam nejspíš proto ti neodpovídají…. :) (mimochodem navrchu to je napsany….)
Moderátor Alphard: Raději ne, hlavně nezakládejte duplicity.
Alphard
Profil
Místo těch všech character_set_xxx by mělo stačit set names.

$page je předpokládám číslo, takže by stačilo
$db = mysql_query("select * from pages where id = " . (int) $_GET['page']);

JJ:
require $fetch['url'];
Obsah stránky bych dal do databáze celý, v tomhle moc nevidím smysl. Tato technika se používá spíš u obrázků apod.
tom994
Profil *
zvykni si pouuzivat jednotny zapis podminky...
bud:
if(podminka):
  udelej neco
else:
  udelej neco jineho
endif;


nebo
if(podminka){
  udelej neco
}else{
  udelej neco jineho
}


doporucuji 2. zapis, je prehlednejsi ;)
tom994
Profil *
jeste poznamka :) jsem zvykly pouzivat 2. zapis i z toho duvodu, ze mi Notepad++ zvyrazni, kde podminka konci, kdyz dam kurzor za 1. slozenou zavorku ({). zvyrazni se mi to pak tedy nejak takto:
if(podminka){
udelej neco
}else{
udelej neco jineho
}

coz je sikovne :)
JJ
Profil *
Díky všem za připomínky. Teď se jimi musím prokousat. Jen se zeptám: Kromě těch mých začátečnických chyb - je tam nějaká zásadní? Něco kvůli čemu by mohlo dojít k nabourání?
Jinak pro příště se polepším a napíšu tam co mám - toto vlákno samozřejmě dotáhnu. Nezlobte se.
Zane
Profil *
Dotaz ke kódu [#1] JJ:
1. řádek 24: co když na zadané adrese žádný takový soubor není - vypíše to chybovou hlášku místo uvedené stránky pages/404.php z řádku 28 - dá se to nějak ošetřit pomocí file_exists? Upřímně pokušel jsem se o to celé odpoledne a nedaří se mi :-(

2. ošetření proti mysql injection (předpokládám řádky 14-17) vyhazuje chyby - poradíte někdo, jak to napsat správně? Z toho co jsem na webu našel (všechno články starší 2 let) toho moc funkčního není - předpokládám, že je to dané tím, že se PHP i MySQL zase někam vyvinulo.
Keeehi
Profil
Zane:
dá se to nějak ošetřit pomocí file_exists?
Ano, dá.

ošetření proti mysql injection
Když vymažeš řádky 14-17 a řádek 18 nahradíš tím z [#3], tak by to mělo jak fungovat, tak být i zabezpečené.
Zane
Profil *
Co takhle (Šlape to jak chci - vidíte v tom nějaký problém?):

<?php

$conn_user="***";
$conn_pass="***";
$conn_server="***";
$conn_db="***";
$spojeni=mysql_connect($conn_server,$conn_user,$conn_pass);

mysql_select_db($conn_db,$spojeni);
mysql_query("set names 'cp1250'");

if(isset($_GET['page'])){
$db = mysql_query("select * from pages where id = " . (int) $_GET['page']);
if(MySQL_Num_Rows($db) == 1){
$url = MySQL_Result($db, 0, "url");}
else{
$url = "pages/404.php";}
}
else{
$url = "pages/uvod.php"; 
} 
require(file_exists($url) ? $url : 'pages/404.php');
mysql_close($spojeni);
?>

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:

0