| Autor | Zpráva | ||
|---|---|---|---|
| JJ Profil * |
#1 · Zasláno: 7. 9. 2010, 21:16:17
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 |
#3 · Zasláno: 9. 9. 2010, 15:27:50
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 * |
#4 · Zasláno: 9. 9. 2010, 16:43:35
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 * |
#5 · Zasláno: 9. 9. 2010, 16:45:32
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 * |
#6 · Zasláno: 10. 9. 2010, 15:21:57
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. |
||
|
Časová prodleva: 2 měsíce
|
|||
| Zane Profil * |
#7 · Zasláno: 7. 11. 2010, 21:39:02
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 |
#8 · Zasláno: 7. 11. 2010, 23:01:46
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 * |
#9 · Zasláno: 7. 11. 2010, 23:41:48
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);
?> |
||
|
Časová prodleva: 16 let
|
|||
0