Hallo allemaal. Ik ben voor het eerst begonnen met PHP en MySQL (zoals tachtigduizend anderen) en ik wilde graag weten of ik een beetje goed bezig ben.
Ik heb een gastenboek en wil dus een paar dingen voorkomen:
- SQL injecties
- HTML abuse
- Lege berichten (of juist te grote)
Nu heb ik zo hier er daar het internet afgesprokkeld en heb ik zo een scriptje op kunnen stellen die dit (naar mijn idee dus) goed doet. Dit is het deel van mijn script:
// controleren of naam en bericht niet leeg zijn
if ($name == "" or $message == "")
{
echo "One or more required fields were found blank. Please go back and try again.";
$_SESSION['randomnr2'] = "cleaned";
exit;
}
// grootte van bericht controleren
$charlimit = 500;
if (strlen($_POST['message']) >= $charlimit)
{
echo "We're sorry, but the maximum number of characters allowed is 500. Please shorten your message and try again. Thank you";
$_SESSION['randomnr2'] = "cleaned";
exit;
}
// html tags verwijderen
$name = strip_tags($name);
$message = strip_tags($message);
// sql injection voorkomen
$name = mysql_real_escape_string($name);
$message = mysql_real_escape_string($message);
Is dit goed? Is dit veilig? Ik hoop dat er iemand is die mij kan helpen.
Ik zou het met een foreach loop oplossen en daarmee alle variabelen controleren.
<?php
$aErrors = array();
foreach($_POST as $sKey => $sValue)
{
$sValue = trim($sValue)
if(empty($sValue))
{
$aErrors[] = 'Je bent vergeten om '.$sKey.' in te vullen.';
}
elseif($sKey == 'message')
{
if(strlen($sValue) < 5)
{
$aErrors[] = 'Bericht is te kort';
}
elseif(strlen($sValue) > 500)
{
$aErrors[] = 'Bericht is te lang';
}
}
Phew, sorry maar ik weet even niet zo goed raad met jullie scripts! Ik heb die van PHP Newbie geprobeerd te implementeren, maar ik kreeg alleen het woord "Array" te zien... sorry ik nog niet zo'n kei met PHP.
Ik hou het graag bij
// html variabelen ophalen
$name = trim($_POST['name']);
$message = trim($_POST['message']);
// controleren of naamveld niet leeg is
if (empty($name))
{
echo "We're sorry, but you haven't filled in a name. Please enter your name and try again.";
$_SESSION['randomnr2'] = "cleaned";
exit;
}
// controleren of berichtveld niet leeg is
if (empty($message))
{
echo "We're sorry, but the message field was found empty. Please enter a message and try again.";
$_SESSION['randomnr2'] = "cleaned";
exit;
}
Bedankt voor de empty en trim tips, het werkt perfect!
Hartstikke bedankt.
EDIT: Toch nog een vraag! Is er een mogelijkheid de error's te echoen naar de pagina waar het formulier zelf op staat? Nu krijg ik namelijk de echo in mijn "guestbookcheck.php" script..
Als je hier dan nog even van maakt:
<?php
// html variabelen ophalen
if(isset($_POST['name'], $_POST['message']))
{
$name = trim($_POST['name']);
$message = trim($_POST['message']);
// controleren of naamveld niet leeg is
if (empty($name))
{
echo "We're sorry, but you haven't filled in a name. Please enter your name and try again.";
$_SESSION['randomnr2'] = "cleaned";
exit;
}
// controleren of berichtveld niet leeg is
if (empty($message))
{
echo "We're sorry, but the message field was found empty. Please enter a message and try again.";
$_SESSION['randomnr2'] = "cleaned";
exit;
}
}
?>
Voorkom je nog een paar foutmeldingen als die variabelen niet bestaan...
Ow! Is het mogelijk dat die variabelen niet bestaan dan..?
En nogmaals mijn vraag: Is er een mogelijkheid de error's te echoen naar de pagina waar het gastenboek zelf op staat? Nu krijg ik namelijk de echo in mijn "guestbookcheck.php" script.. (wat dus een lelijke tekst op een lege pagina is =P )
Ok, ik begrijp er nu werkelijk niets meer van. Wanneer ik nl2br in het eerste rijtje gooi waar mysql_escape, strip_tags en trim ook in staan werkt het niet. Zoals ik het hieronder heb werkt het wel, net zoals de smileys, maar dan werken mysql_escape, strip_tags en trim weer niet!
code weggehaald
PHP is lastiger als ik had verwacht... ik hoop dat iemand me kan uitleggen wat ik niet begrijp.
Alvast bedankt.
EDIT: na heel veel aankloten is het me gelukt :P kheb alles maar in een functie gegooid
Wanneer ik nl2br in het eerste rijtje gooi waar mysql_escape, strip_tags en trim ook in staan werkt het niet.
De functie nl2br() gebruik je nooit en te nimmer bij input, daar waar je mysql_real_escape_string(), strip_tags() en trim() wél voor kunt gebruiken. Jouw probleem kan dus helemaal niet bestaan, tenzij je iets helemaal fout doet.
nl2br() gebruik je wanneer je de data uit de database hebt opgehaald en weer op het scherm wilt zetten.
@Joren: Schrijf dan wel je query goed...
<?
$query = "SELECT * FROM gastenboek ORDER BY date DESC";
?>
Daarnaast slaat de naam $sql nergens op, er staat géén SQL in deze variabele, maar een resultset. $result ligt dan ook voor de hand.