PHP a MySQL Připojení k databázi: mysql_connect(SQL_HOST, SQL_USERNAME, SQL_PASSWORD); mysql_select_db($SQL_DBNAME); př. Kontrola spojení: $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password'); if(!is_resource($link)) { echo "Failed to connect to the server\n"; … Uzavření spojení MySQL_Close(); MySQL_Close($link);
Získání výsledků získání pole, všech řádků $vysledek=mysql_query("select * from psc where psc=".$_POST["psc"]); $vysledek = mysql_query($sql,$connection) or die ("Nemohu provést dotaz: “ . $query_error); zjištění počtu vrácených řádků $radku=mysql_num_rows($vysledek); if ($radku==0) echo "PSČ…
Procházení řádků while ($zaznam=MySQL_Fetch_Array($vysledek)) { echo …; } $zaznam je pole sloupců, hodnot řádku!
Výpis hodnot echo $zaznam[‘id’]; echo $zaznam[‘prijmeni’] . ‘, ’ . $zaznam[‘jmeno’]; echo “<a href=\“edituser.php?ID_user=\“ . $zaznam[‘id’] . “<\a>”; … $ID=$_GET[‘ID_user’] … $sql=“SELECT * FROM admins WHERE ID=$ID”; …
Stránkování zjistit počet záznamů omezit dotazem přes LIMIT předávat přes URL list.php?page=2 SELECT count(ID) FROM … SELECT … LIMIT 11,10
Neukládání hesel Pro případ krádeže dat: hesla neukládat! Použít jednostrannou funkci – hash př.: $heslo=md5($_POST[‘heslo’]); $heslo=md5($_POST[‘heslo’] . ‘sul’); $sql=“SELECT * FROM usernames WHERE user=‘$username’ AND psw=$heslo”
SQL injection Kontrolovat hodnoty, typy! settype($offset, 'integer'); $query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;", $offset); Kontrolovat uvozovky, escape sekvence mysql_escape_string(), sql_escape_string(), addslashes(), str_replace($search, $replace)… př.: $query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'", mysql_real_escape_string($user), mysql_real_escape_string($password)); Nezveřejňovat databázové schéma, SQL dotazy…
SQL injection, ochrana ve funkci <?php function sanitize($input){ if(is_array($input)){ foreach($input as $k=>$i){ $output[$k]=sanitize($i); } } else{ if(get_magic_quotes_gpc()){ $input=stripslashes($input); } $output=mysql_real_escape_string($input); } return $output; } ?> // use: if you are going to use $_POST, $_GET, $_COOKIE or $_REQUEST, include the appropriate line first. $_POST=sanitize($_POST); $_GET=sanitize($_GET); $_COOKIE=sanitize($_COOKIE); $_REQUEST=sanitize($_REQUEST);
Vložení uživatele do databáze if(IsSet($sent)): require("db.php"); $write = true; if($name=="" || $password=="" || $password_2==""): $error = 'Musíte vyplnit všechny povinné údaje - označeny tučným písmem.'; $write = false; elseif($password!=$password_2): $error = 'Heslo nebylo zadáno správně.'; $write = false; else: $user = MySQL_Query("SELECT name FROM users") or die($query_error); while($entry = MySQL_Fetch_Array($user)): if(StrToLower($name)==StrToLower($entry["name"])): $error = 'Toto uživ. jméno již existuje, vyberte si prosím jiné.'; $write = false; break; endif; endwhile; endif; if($write): …
Vložení uživatele do databáze … if($write): $add = MySQL_Query("INSERT INTO users VALUES ('$nick', '$name', '$password', '$email', '$icq', '30', '$avatar', '$xfire', '$skype', '$sex')") or die(mysql_error()); SetCookie("cookie_author", $nick); SetCookie("cookie_email", $email); echo '<html><head><META HTTP-EQUIV="Refresh" CONTENT="5; URL=index.php"> <body> <b>Registrace proběhla úspěšně</b>:<br><br> Jméno:' . $name . '<br> Email:' . $email . '<br> Za 5 vteřin budete přesměrováni. </body></head></html>'; endif; MySQL_Close();
GET, POST opakování <input name="username" value="moje jmeno" /> <input type="submit" name="akce" value="OK" /> V PHP zaslané hodnoty získáme z pole: $user=$_GET["username"] pro <form action="test.php" method="get">… …test.php?username=moje%20jmeno&akce=OK data součástí URL (viditelná, omezeno délkou) $user=$_POST["username"] pro <form action="test.php" method="post">… data součástí HTTP požadavku (neviditelná v URL, uuencoded, "neomezená" délka dle URL)
Upload Souborů //příp. is_uploaded_file($_FILES['soubor']['tmp_name']) <? … načtení proměnných z pole $HTTP_POST_FILES … if($_POST["akce"]=="Upload") { //příp. is_uploaded_file($_FILES['soubor']['tmp_name']) if ($_FILES["soubor"]["mime_type"]=="text/plain" or $_FILES["soubor"]["mime_type"]="text/html") { if (copy($_FILES["soubor"]["tmp_name"],"data/".$_FILES["soubor"]["name"])) { print "Soubor " . $_FILES["soubor"]["name"] . " o velikosti " . $_FILES["soubor"]["size"] . " bajtů byl úspěšně nahrán na server<br>"; } else { print "Při nahrávání souboru došlo k chybě!<br/>"; } } else { print "Soubor není požadového MIME typu!<br/>"; } } … příp. při podmínce else ($_POST["akce"] == "Upload") řešit vypsání formuláře, při špatném mimetype smazat ?>
Pozor na… SQL Injection opětovné vkládání při refresh kontrolovat obsah, hodnoty (viz Databáze, funkce mysql_real_escape_string(), settype()) opětovné vkládání při refresh <?php … // přesměrování na stránku s výsledkem header("Location: vysledek.php", true, 303);?> SELECT Count(ID) WHERE … -> INSERT/UPDATE Podvrhy při uploadu (is_uploaded_file()) Maximální velikost, upload více souborů viz manuál PHP, odkaz na konci prezentace
Identifikace, autentizace, autorizace Jak se liší? Identifikace – kdo jsi? Autentizace – jsi skutečně ten, za koho se vydáváš Autorizace – máš sem skutečně přístup? Autorizace se sessions a MySQL http://www.jaknaweb.com/tipy-triky/php-mysql/34/autorizace-uzivatelu-zaheslovany-pristup
Autorizace I. soubor .htaccess pro Apache platí pro Apache – adresář a podadresáře dále umí blokování přístupu z IP adres, redirect, vlastní chybové stránky aj. viz apache httpd.conf http://emp.wz.cz/htconfig/autorizace-pomoci-htaccess.html
Autorizace II. HTTP protokolem proměnné $PHP_AUTH_USER, $PHP_AUTH_PW a $PHP_AUTH_TYPE Header("HTTP/1.0 401 Unauthorized"); Header("WWW-Authenticate: Basic realm=\"Stranky XYZ\""); die("Neautorizovaný přístup\"); http://blackhole.sk/zabezpeceni-php-skriptu-heslem-ii
Autorizace III. vlastním formulářem použít SSL pro uložení hash použít Sessions/Cookies a MySQL kontrolovat timeout, IP adresu pozor na ukládání username do Cookies aj. spoléhání na Cookies/Sessions
Kontrola přihlášení se sessions Nutno kontrolovat, zda session existuje z dřívějška Možno uložit do session a kontrolovat IP adresu, zda nedošlo ke změně, a čas session_start(); if ($_SESSION['isvalid']!=1) { // pokud testovací proměnná neexistuje nebo nemá správnou hodnotu, vynutit např. nové přihlášení Header('Location: http://server.com/login.php'); Exit; }
PHP a Mail if (!ereg("^.+@.+\\..+$", $email)) { echo "Zadali jste E-mail je neplatný <BR>"; exit; } $hlavicky .= "From: ".$email."\n"; // $hlavicky .= "Content-Type: text/html; charset=utf-8\n"; Mail("komu@komu.cz", $predmet, $zprava, $hlavicky);