uitleg gevraagd over email beveiliging

Status
Niet open voor verdere reacties.

lusinkm

Gebruiker
Lid geworden
19 sep 2007
Berichten
79
Hallo allemaal,

Ik heb met behulp van dit forum geleerd hoe ik een simpel mailscript moet maken. Tot nu toe controleerd dit script alleen of alle velden zijn ingevuld, en geeft een melding wanneer dit niet het geval is.....niet echt veilig dus.

Als volgende stap wil ik nu graag dat de invoervelden worden gecontroleerd worden op speciale characters, zodat het script niet als spammer gebruikt kan worden. Ik had ergens gevonden hoe ik dit moest doen, maar ik kan het niet meer terugvinden.

Als iemand hier een korte uitleg over kan geven dan ben ik daar erg blij mee.
( een link naar een nl site met uitleg is ook prima )

Alvast bedankt,
Mark
 
Ik heb "even" gekeken naar de links die je hebt gegevens...die htmlspecialchar() en htmlentities() snap ik nog net wel, maar van die andere 2 moet ik effe een Nederlandese uitleg zoeken, maar dat komt wel goed..

Ik heb ook iets gevonden op

http://www.w3schools.com/php/php_secure_mail.asp

Dit is het artikel wat ik eerder niet terug kon vinden. Is dit wat of raad je toch aan om die links van jouw uit te zoeken. ( in de ogen van een leek ziet dit er best verschillend uit).
 
Beide doen eigenlijk hetzelfde.

Sanitize filtert ook "foute" karakters er uit.
 
Dus dat is eigenlijk een "ingebakken" functie van php....Deze is dan alleen voor het mailen bedoelt? Dan is het mischien beter om uit te zoeken wat die links betekenen die jij hebt geplaatst.
Die kan je waarschijnlijk ook in andere gevallen gebruiken...of zie ik dat verkeerd?
 
filter_var() kan meerdere dingen controleren...

Hier vindt je de gehele lijst.
 
Dat is een hele waslijst zeg...:shocked:
Ik ga maar beginnen met lezen en dan proberen om de controle in te bouwen.

Bedankt voor de links
Groet,
Mark
 
pffffff...begint best lastig te worden, maar goed.

Ik heb in onderstaand script wat commentaar neergezet om aan te geven waar ik het spoor een beetje kwijtraak. In de if/else heb ik commentaar geplaatst met waarom ik het zo gedaan heb daar.

PHP:
<?php 
$to = "mail@lusinkwebdesign.nl"; 
$subject = "Mail van CE2008"; 

$bedrijfsnaam = $_POST['bedrijfsnaam']; 
$contactpersoon = $_POST['contactpersoon'];
$telefoon = $_POST['telefoon'];
$email = $_POST['email']; 
$bericht = $_POST['bericht'];

$message = " 
Bedrijfsnaam: $bedrijfsnaam 
Contactpersoon:  $contactpersoon
Telefoon: $telefoon
Email: $email
Bericht: $bericht
"; 

//Als ik nu zo'n beveiliging in het script wil maken, moet ik dat dan doen in de structuur hieronder.
//Wordt het dan zoiets als.....

//if (empty($_POST['bedrijfsnaam']) && (FILTER_SANITIZE_EMAIL($_POST['bedrijfsnaam'])) {
//echo "U bent vergeten een bedrijfsnaam in te vullen";

//en dat bij alles herhalen?

//zorgt ervoor dat als bedrijfsnaam leeg is, echo uitgevoerd wordt
if (empty($_POST['bedrijfsnaam'])) {
	echo "U bent vergeten een bedrijfsnaam in te vullen";
//else zorgt ervoor dat als er iets is ingevuld, dat het script het volgende invoerveld gaat controleren	
} elseif (empty($_POST['contactpersoon'])) {
	echo "U bent vergeten een contactpersoon op te geven";
	
} elseif (empty($_POST['telefoon'])) {
	echo "U bent vergeten een telefoonnummer op te geven";
		
} elseif (empty($_POST['email'])) {
	echo "U bent vergeten een email adres op te geven";
	
} else {
	mail ($to, $subject, $message);
	echo "Uw bericht is verzonden. Er wordt zo spoedig mogelijk contact met u opgenomen";
}
?>
 
Nee, het "sanitize"n moet binnen de functie filter_var() worden gebruikt :)

PHP:
if(filter_var($_POST['email'], "FILTER_SANITIZE_EMAIL")) {
 
ok, ik heb het aangepast en in het script heb ik aangegeven waar en waarom ik het daar geplaatst heb. In het vb. script van http://www.w3schools.com/php/php_secure_mail.asp
wordt er ook gebruik gemaakt van RETURN FALSE en RETURN TRUE.
Moet ik dat ook doen of hoeft dat niet perse. Volgens mij zijn er met php vele wegen die naar Rome gaan

PHP:
<?php 
$to = "mail@lusinkwebdesign.nl"; 
$subject = "Mail van CE2008"; 

$bedrijfsnaam = $_POST['bedrijfsnaam']; 
$contactpersoon = $_POST['contactpersoon'];
$telefoon = $_POST['telefoon'];
$email = $_POST['email']; 
$bericht = $_POST['bericht'];

$message = " 
Bedrijfsnaam: $bedrijfsnaam 
Contactpersoon:  $contactpersoon
Telefoon: $telefoon
Email: $email
Bericht: $bericht
"; 

//zorgt ervoor dat als bedrijfsnaam leeg is echo uitgevoerd wordt
if (empty($_POST['bedrijfsnaam'])) {
	echo "U bent vergeten een bedrijfsnaam in te vullen";
//else zorgt ervoor dat als er iets is ingevuld, dat het script het volgende invoerveld gaat controleren	
} elseif (empty($_POST['contactpersoon'])) {
	echo "U bent vergeten een contactpersoon op te geven";
	
} elseif (empty($_POST['telefoon'])) {
	echo "U bent vergeten een telefoonnummer op te geven";
		
} elseif (empty($_POST['email'])) {
	echo "U bent vergeten een email adres op te geven";

//Ik heb het dus op deze plaats toegevoegd. Gedachte hier is dat hierboven eerst wordt gechecked of de velden zijn ingevuld.
//en dat hieronder wordt gecontroleerd of er "foute" tekens in zitten. 
	
} if (filter_var($_POST['email'], "FILTER_SANITIZE_EMAIL")) {
      echo "Dit is niet toegestaan";
} else {
	mail ($to, $subject, $message);
	echo "Uw bericht is verzonden. Er wordt zo spoedig mogelijk contact met u opgenomen";
}
?>
 
wordt er ook gebruik gemaakt van RETURN FALSE en RETURN TRUE.
Moet ik dat ook doen of hoeft dat niet perse.
Als je goed kijkt zie je dat ze het in een functie gebruiken. Ze gooien het adres erin.

Dan gaan ze hem "sanitizen", en daarna "validaten". Bij die validatie komt dus een resultutaat, TRUE of FALSE.

En inderdaad, er zijn meerdere manier om zulke problemen op te lossen :)

Geeft dit script problemen trouwens of werkt het naar behoren?
 
Dat helaas nog niet. Als ik het formulier invul dan krijg ik het volgende:

U bent vergeten een email adres op te geven
Warning: filter_var() expects parameter 2 to be long, string given in /www/l/u/s/lusinkwebdesign.nl/public_html/lomberg/mailscriptlomberg.php on line 35
Uw bericht is verzonden. Er wordt zo spoedig mogelijk contact met u opgenomen

Ik had alles behalve email en bericht ingevuld en verstuurd.

Ik had eerlijk gezegd niet verwacht dat ik het op de goede plaats in het script had gezet:)
 
Laatst bewerkt:
Ik zie het probleem al.

Sanitizing zorgt er voor dat het wordt aangepast. Die levert dus altijd TRUE op :)

Probeer dit eens:
PHP:
<?php  
$to = "mail@lusinkwebdesign.nl";  
$subject = "Mail van CE2008";  

$bedrijfsnaam = $_POST['bedrijfsnaam'];  
$contactpersoon = $_POST['contactpersoon']; 
$telefoon = $_POST['telefoon']; 
$email = $_POST['email'];  
$bericht = $_POST['bericht']; 

$message = "  
Bedrijfsnaam: $bedrijfsnaam  
Contactpersoon:  $contactpersoon 
Telefoon: $telefoon 
Email: $email 
Bericht: $bericht 
";  


//zorgt ervoor dat als bedrijfsnaam leeg is echo uitgevoerd wordt 
if (empty($_POST['bedrijfsnaam'])) { 
    echo "U bent vergeten een bedrijfsnaam in te vullen"; 
//else zorgt ervoor dat als er iets is ingevuld, dat het script het volgende invoerveld gaat controleren     
} elseif (empty($_POST['contactpersoon'])) { 
    echo "U bent vergeten een contactpersoon op te geven"; 
     
} elseif (empty($_POST['telefoon'])) { 
    echo "U bent vergeten een telefoonnummer op te geven"; 
         
} elseif (empty($_POST['email'])) { 
    echo "U bent vergeten een email adres op te geven"; 
}

// Veld opschonen
$email = filter_var($_POST['email'], "FILTER_SANITIZE_EMAIL");
if(filter_var($email, "FILTER_VALIDATE_EMAIL")) {
    mail ($to, $subject, $message); 
    echo "Uw bericht is verzonden. Er wordt zo spoedig mogelijk contact met u opgenomen"; 
} else {
  echo ' Het e-mailadres is niet geldig';
}
?>
Tenminste ik denk dat het zo hoort. Heb zelf nog niet met die functie gewerkt.
 
Oke, is aangepast en het script ziet er nu zo uit. Foutmeldingen staan eronder. Mischien dat het fout gaat omdat we het email adres niet invullen, en daar juist op controleren.
Maarja, dan zouden we alleen de melding "U bent vergeten een email adres op te geven",
moeten krijgen.

Volgende reactie komt waarschijnlijk vanavond. Eindelijk einde werkdag, op naar huis.

In ieder geval bedankt dat je wilt helpen, en ook voor je geduld :D).

PHP:
<?php 
$to = "mail@lusinkwebdesign.nl"; 
$subject = "Mail van CE2008"; 

$bedrijfsnaam = $_POST['bedrijfsnaam']; 
$contactpersoon = $_POST['contactpersoon'];
$telefoon = $_POST['telefoon'];
$email = $_POST['email']; 
$bericht = $_POST['bericht'];

$message = " 
Bedrijfsnaam: $bedrijfsnaam 
Contactpersoon:  $contactpersoon
Telefoon: $telefoon
Email: $email
Bericht: $bericht
"; 

//zorgt ervoor dat als bedrijfsnaam leeg is echo uitgevoerd wordt
if (empty($_POST['bedrijfsnaam'])) {
	echo "U bent vergeten een bedrijfsnaam in te vullen";
//else zorgt ervoor dat als er iets is ingevuld, dat het script het volgende invoerveld gaat controleren	
} elseif (empty($_POST['contactpersoon'])) {
	echo "U bent vergeten een contactpersoon op te geven";
	
} elseif (empty($_POST['telefoon'])) {
	echo "U bent vergeten een telefoonnummer op te geven";
		
} elseif (empty($_POST['email'])) {
	echo "U bent vergeten een email adres op te geven";

}

$email = filter_var($_POST['email'], "FILTER_SANITIZE_EMAIL"); //34
if(filter_var($email, "FILTER_VALIDATE_EMAIL")) {     //35
    mail ($to, $subject, $message);  
    echo "Uw bericht is verzonden. Er wordt zo spoedig mogelijk contact met u opgenomen";  
} else { 
  echo ' Het e-mailadres is niet geldig'; 
} 
?>

En dit zijn de melding die kwamen .

U bent vergeten een email adres op te geven
Warning: filter_var() expects parameter 2 to be long, string given in /www/l/u/s/lusinkwebdesign.nl/public_html/lomberg/mailscriptlomberg.php on line 34

Warning: filter_var() expects parameter 2 to be long, string given in /www/l/u/s/lusinkwebdesign.nl/public_html/lomberg/mailscriptlomberg.php on line 35
Het e-mailadres is niet geldig.
 
Laatst bewerkt:
Haal de quotes eens om de FILTER_ dingen... Ik veronderstelde dat die als string moet worden neergezet. Op de PHP-site staan ze echter zonder quotes.
 
:thumb: Yep, dat wat het...Als ik nu het formulier invul, en het @ vergeet, dan krijg ik netjes de melding "Het emailadres is niet geldig". Dit gebeurt ook als ik bv. .NL vergeet.

Op die w3c pagina stond dit :

someone@example.com%0ACc:person2@example.com
%0ABcc:person3@example.com,person3@example.com,
anotherperson4@example.com,person5@example.com
%0ABTo:person6@example.com

Hier had ik echte adressen van gemaakt, in het email veld gegooid, en weer kreeg ik netjes de melding dat het email adres niet geldig is.

Hier is het laatste gedeelte van het script.
PHP:
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); 

if(filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    mail ($to, $subject, $message);  
    echo "Uw bericht is verzonden. Er wordt zo spoedig mogelijk contact met u opgenomen";  
	
} else { 
  echo ' Het e-mailadres is niet geldig'; 
} 
?>

Is dit script nu veilig of moet ik de andere invul velden ook beveiligen? Ik zat er zelf aan te denken om alleen nog een gedeelte in het script toe te voegen voor het telefoon nummer, dat er alleen maar cijfers kunnen worden ingevuld.
 
Die is niet zo moeilijk wanneer je dit soort formaten wilt hebben 0123456789 ipv 0123-456789.

Dan gebruik je gewoon de functie is_int() om te controleren of het om een integer gaat.
PHP:
// Het uitroepteken staat voor NIET
if(!is_int($_POST['telefoon'])) {
  echo 'Het telefoonnummer bestaat niet alleen uit getallen.';
}
 
Het probleem bij mij is dat ik niet precies weet waar ik dit in het script moet plaatsen. Ik begrijp denk ik wel wat je bedoelt. Ik zou bv. ook -is_numeric()- op de een of andere manier kunnen gebruiken(toch?).

Ik heb die code op verschillende plaatsen in het script gehad, maar helaas werkte er geen een. Ik denk dat ik op de een of andere manier de if/else om zeep help.
 
Probeer dit eens:
PHP:
<?php  
$to = "mail@lusinkwebdesign.nl";  
$subject = "Mail van CE2008";  

$bedrijfsnaam = $_POST['bedrijfsnaam'];  
$contactpersoon = $_POST['contactpersoon']; 
$telefoon = $_POST['telefoon']; 
$email = $_POST['email'];  
$bericht = $_POST['bericht']; 

$message = "  
Bedrijfsnaam: $bedrijfsnaam  
Contactpersoon:  $contactpersoon 
Telefoon: $telefoon 
Email: $email 
Bericht: $bericht 
";  

//zorgt ervoor dat als bedrijfsnaam leeg is echo uitgevoerd wordt 
if (empty($_POST['bedrijfsnaam'])) { 
    echo "U bent vergeten een bedrijfsnaam in te vullen"; 
//else zorgt ervoor dat als er iets is ingevuld, dat het script het volgende invoerveld gaat controleren     
} elseif (empty($_POST['contactpersoon'])) { 
    echo "U bent vergeten een contactpersoon op te geven"; 
     
} elseif (empty($_POST['telefoon'])) { 
    echo "U bent vergeten een telefoonnummer op te geven"; 
} elseif(!is_int($_POST['telefoon'])) {
    echo 'Het ingevoerde telefoonnummer is niet geldig';
} elseif (empty($_POST['email'])) { 
    echo "U bent vergeten een email adres op te geven"; 
} 

$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); 
if(filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    mail ($to, $subject, $message);   
    echo "Uw bericht is verzonden. Er wordt zo spoedig mogelijk contact met u opgenomen";   
} else {  
  echo ' Het e-mailadres is niet geldig';  
}  
?>
 
Ik ga het proberen. Hieronder zie je hoe ik het eerst had.


PHP:
<?php 
$to = "mail@lusinkwebdesign.nl"; 
$subject = "Mail van CE2008"; 

$bedrijfsnaam = $_POST['bedrijfsnaam']; 
$contactpersoon = $_POST['contactpersoon'];
$telefoon = $_POST['telefoon'];
$email = $_POST['email']; 
$bericht = $_POST['bericht'];

$message = " 
Bedrijfsnaam: $bedrijfsnaam 
Contactpersoon:  $contactpersoon
Telefoon: $telefoon
Email: $email
Bericht: $bericht
"; 

if (empty($_POST['bedrijfsnaam'])) {
	echo "U bent vergeten een bedrijfsnaam in te vullen";
	
} elseif (empty($_POST['contactpersoon'])) {
	echo "U bent vergeten een contactpersoon op te geven";
	
} elseif (empty($_POST['telefoon'])) {
	echo "U bent vergeten een telefoonnummer op te geven";
		
} elseif (empty($_POST['email'])) {
	echo "U bent vergeten een email adres op te geven";

//Ik heb het dus hier staan nu. Als hierboven gecontroleerd is of alle velden zijn ingevuld
//dan moet hieronder gecontroleerd worden of het getallen zijn of niet.
	
} elseif(!is_int($_POST['telefoon'])) { 
  echo "Het telefoonnummer bestaat niet alleen uit getallen."; 
  
} 

$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);  

if(filter_var($email, FILTER_VALIDATE_EMAIL)) {  
    mail ($to, $subject, $message);   
    echo "Uw bericht is verzonden. Er wordt zo spoedig mogelijk contact met u opgenomen";   
     
} else {  
  echo "Het e-mailadres is niet geldig";  
}  
?>
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan