Theswitch: #/usr/bin/perl -W
use strict;
deze zorgt ervoor dat al je variables gecheckt moeten worden voordat ze gebruikt worden.
Eigenlijk zou je -w en strict altijd moeten gebruiken.
$wachtwoord ~= s/\W.*$//;
Waarom die $

Deze zorgt dat alles vanaf \W (non-witespace) weggehaald wordt.
Nee, dat is niet waar. \W is niet non-whitespace, dat is \S. Alles wat geen 'word-character' is of hoe je het ook wilt noemen matcht \W, dus alles wat geen 'word-character' is aan het einde van je string wordt weggehaald.
Maar waarom wil je dat alleen aan het einde

Mag er wel een ; of een ' of iets anders aan het begin staan of misschien ergens tussenin?
Dus je passwd zal dan bestaan uit alleen A-Za-z0-9.
\w ('word-characters') matcht ook een _ (underscore) en misschien een - (weet ik niet zeker uit mijn hoofd, ik dacht het niet). Wanneer je local packages hebt geinstalleerd kan \w trouwens nog meer matchen, zoals een Eszet (Duits). Ook vallen gewone letters met bijvoorbeeld een trema of een accentteken meestal onder \w. Maar goed, dat doet voor dit voorbeeld niet heel erg terzake, alleen even voor de duidelijkheid

Wat je ook kan doen is iets als
$wachtwoord ~= s/[;\n]//;
Gebruik dan wel een /g anders haal je er maar 1 teken uit

Je kan er eventueel meer bad tekens inzetten die je niet in een passwd wilt hebben.
Dit geldt voor beveiliging in het algemeen: Definieer niet wat verboden is, maar wat toegestaan is. Op deze manier kun je gemakkelijk beveiligingslekken maken.
CyB3R: lijkt me wel, anders is die hele s/// niet nodig toch?

Inderdaad, waarom een pattern gebruiken dat 'niets' kan matchen

Zeker als je niet geheel zeker bent van wat er dan gebeurd (kan namelijk nog best ingewikkeld zijn en dit
verschilt per regex implementatie. Kijk daar dus mee uit.
Al met al zou ik het meer als zoiets schrijven:
code:
1
2
3
4
5
6
| #!/usr/bin/perl -w
my $pass = $FORM{'pass'};
$pass =~ s/\W+//g;
my $wachtwoord = `/sambar/bin/sacrypt.exe '$pass'`; |