Tämä on osa PHP-projektia.
Sain tässä illan ratoksi idean kerätä niin sanottua tarkistuslistaa skripteihin. Alla on lueteltu muutamia vinkkejä.
1. Pidä kehitysvaiheessa kaikki virheilmoitukset päällä ja näkyvillä.
<?php ini_set("display_errors", 1); error_reporting(E_ALL | E_NOTICE);
2. Älä koskaan luota käyttäjältä tulevaan syötteeseen ($_GET, $_POST).
<?php // Seuraava funktio siivoaa tekstimuotoisen syötteen. function siivoa_syote($s) { $s = ((get_magic_quotes_gpc()) ? $s : addslashes($s)); $s = htmlspecialchars($s); return trim($s); } // Jos syöte voi olla ainoastaan kokonaisluku (esim. ID), niin tämä riittänee: $syote = intval($syote);
3. Validoi käyttäjältä tuleva syöte huolella. Pidä huoli, ettei esimerkiksi tietokantaan pääse virheellisessä muodossa olevaa syötettä, joka aiheuttaisi virheen/virhetilanteen.
<?php $pvm = "36.3.2010"; if (preg_match("/\d{1,2}\.\d{1,2}\.\d{4}/", $pvm)) tietokantaan($pvm); // Tässä esimerkissä tietokantaan menisi päivämäärä 36.3.2010, joka ei ainakaan MySQL-tietokannassa aiheuta virhettä, mutta muuntuu muotoon 0000-00-00 (oletettuna, että kenttä on DATE-tyyppinen).
4. Osoitteisiin parametreiksi ei pidä laittaa suoraan mitään tietoa, vaikka selaimet sen hyväksyvätkin.
<?php $tieto = urlencode($tieto); // "http://sivu.com?foo={$tieto}"; // Enkoodauksen saa purettua: $tieto = urldecode($tieto);
5. Ymmärrä lainausmerkkien (") ja heittomerkin (') toiminnallinen ero PHP:ssä.
<?php function cb($s) { echo "korvattu {$s}\n"; } $testi = "moi"; echo preg_replace('/(.+)/e', 'cb("$1")', 'abc $testi'); // Tulostaa: korvattu abc moi echo preg_replace('/(.+)/e', "cb('$1')", 'abc $testi'); // Tulostaa: korvattu abc $testi // Ensimmäisessä $testi -korvaantuu siis PHP-muuttujan $testi sisällöllä!
6. Jos skriptisi tallentaa tiedot CSV-tyyliseen tiedostoformaattiin niin pidä huoli, ettei käyttäjän syöte sekoita tiedostorakennetta. Yksi ratkaisu on korvata erotinmerkki entiteetillä.
<?php function erota($s, $erotin="|") { return str_replace($erotin, "&#".ord($erotin).";", $s); } function palauta($s, $erotin="|") { return str_replace("&#".ord($erotin).";", $erotin, $s); }
7. Liitä ulkopuoliset PHP-skriptikirjastot jokaisessa tiedostossa, joka käyttää joitakin kirjaston tarjoamia ominaisuuksia.
<?php require_once("tiedosto1.lib.php"); require_once("tiedosto2.lib.php"); ...
Tässä muutamia vinkkejä, jotka tulivat mieleeni.
Aihe on jo aika vanha, joten et voi enää vastata siihen.