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: 13 let
|
0