Kirjautuminen

Haku

Tehtävät

Keskustelu: Projektit: PHP-projekti: Yleisiä vinkkejä

trilog [03.03.2010 21:44:54]

#

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.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta