if(cpr.length== 10){ kontroltal = 1 * cpr.substring(cpr.length-1,cpr.length); // alert(kontroltal); // Hvis det indtastede cprnummer er netop 10 cifre langt, så gennemføres nedenstående løkke, // der checker gyldigheden af cprnummeret, ciffer for ciffer. // alert(cpr); while(taeller< 10){
tegn =cpr.substring(taeller-1,taeller); Mult =faktor.substring(taeller-1,taeller); // alert(tegn+"/"+Mult); if (!isNaN(tegn)){
// Hvis det indtastede tegn på pladsen som variablen taeller peger på er et tal, // så foretages beregningen af tempsum, og tælleren taeller forøges med 1
// Hvis der er indtastet et ugyldigt tegn i cprnummeret, meldes nedenstående fejl.
alert("Du har indtastet et ugyldigt tegn");
} }
// Når tempsum endeligt er udregnet, checkes efter nedenstående model
check = 11-mod(tempsum, 11);
// Hvis check svarer til cprnummeret sidste ciffer (kontroltal), eller check = 11, er // cprnummeret gyldigt, og nedenstående meddelelse vises if(check == kontroltal|| check == 11){
return (idag-fDate)/31536000000; //returner alder i år }
function checkCPR(){ cpr=document.mainform.cpr.value; cpr=cpr.replace(/-/g,""); age_DK=checkCPR_DK(cpr); age_NO=checkCPR_NO(cpr); //alert(age_DK+"/"+age_NO); if(age_DK<minimumalder&&age_NO<minimumalder) alert("De indtastede oplysninger giver ikke adgang til Adult Zone"); else{ alert("Gå til Adult Zone ..."); document.location="10/9/8/adult.html"; }
Her er en simpel version, som laver et svagt tjek af validiteten af selve CPR-nummeret, samt tester alderen. Det er testet, men jeg garanterer umiddelbart ikke at det er fejlfrit :-)
$mycpr = '2709894040'; if (validCPR($mycpr)) { echo 'CPR ok'; } else { echo 'CPR ikke ok'; }
(eksemplet vil godkende CPR nummeret 270989-4040 i dag d. 27/09-2007 og fremefter, men f.eks. ikke 280989-4048, da personen ikke er fyldt 18 endnu)
Jeg vil overveje at nægte brugeren flere forsøg, hvis CPR ikke valideres efter 2 gange. Hvis brugeren er under 18 og bruger et "falsk" cpr som brugeren selv finder på, skal personen nemlig ramme det rigtige kontrolciffer (det sidste, fra 0-9). Jeg tror det er de færreste brugere (under 18) som vil tjekke at det sidste kontrolciffer er rigtigt. En bruger med et korrekt CPR nummer vil næppe taste det forkert igen, efter at have fået at vide at det ikke er korrekt indtastet.
Terrak - præcist! :D Fantastisk! Kast svar. Jeg vælger at dele points med zerocash, da jeg syntes han svar også er nyttigt. Kan nemmelig bruge jeres begge - til både php og javascript - så kast svar i 2 og et kæmpe tak igen
Jeg er sikker på, at Datatilsynet ikke synes det er en fatastisk idé, at du gemmer cpr-numre. De er faktisk at betragte som fortrolige data, som man skal have tilladelse til at opbevare! Og den får du ikke, idet du ikke har et retskrav mod dine brugere.
Nøjes med at gemme fødselsdagene, og et unikt bruger-id istedet.
Y - før du nu udtaler dig vil jeg anbefale dig at tage et kig på javascriptet jeg smed her i tråden.
Det GEMMER ikke data fra CPR. Hverken fødselsdato eller kontrolcifre (de sidste 4 cifre). Den validerer om det indtastede nummer er korrekt og fører et kontrolcheck med det sidste kontrolciffer hvorefter det guider brugeren videre til den angivne side.
Det gemmer som sagt INTET. Og af hvad jeg kan se, gør PHP'en det heller ikke
erikjacobsen > Ja, det så jeg også lige, jeg ser om ikke jeg kan lave et script der gør brug af f.eks. mktime() i stedet for. Derudover er alderen også 16, ikke 18 som jeg er gået ud fra.
y > Er du sikker på at webudvikleren vil gemme denne information, frem for bare at tjekke? Men ellers relevant nok :-)
Mener bare, at cpr-numret bliver misbrugt alt for meget. Personligt ville jeg aldrig logge på en ikke-officiel side, der udbad sig mit cpr. Hvis det ikke gemmes, hvorfor så spørge efter det, så burde fødsesdagen være nok. Jeg ved godt, at der er fordele ved at kunne validere med kontrolciffer mm. Men det er alligevel ved at blive afskaffet! Så man løber en risiko for, at et korrekt cprnummer valideres til ugyldigt, uden at være det! Jvn www.cpr.dk
Y - du har selvfølgelig ret i det. Jeg ville da også klart hellere validere (såfremt dette blev afkrævet!) via SSL end blot via en ukrypteret webside. Uanset om det så er pga. en XXX-side eller hvad det nu er - så er det da stadig personfølsomme data og man skal dog stadig gøre meget for, at undgå misbrug tiltrods for det "kun" er CPR.
Lige en rettelse: if (!isset($controlyearindex) && $controlyear[$cpr7][$controlyearindex] != 0) { skal være if (!isset($controlyearindex) || $controlyear[$cpr7][$controlyearindex] != 0) { Første kontrol er lidt redundant, men det går nok.
Og lidt irrelevant: "Ved min alder på 16" skulle være "Ved min. alder på 16:" :-)
Jeg vil selvfølgelig ikke gemme personernes cpr-nummer..
Terrak - hvad er forskellen på den nye og gamle? Kan ikke det matematiske i det der cpr-system, vil bare gerne have den bedste og mest sikreste tjekker i 2 forskellige eksempler.
Det første script jeg postede kunne ikke se forskel på om et personnummer med årstal 02 var født i 2002 eller 1902, det kan det andet. Derfor er det andet script at foretrække.
Hvis du vil undlade modulus 11 tjekket, skal du bare fjerne arrayet $control og ændre linjen if ($controlsum % 11 == 0 && checkdate($cprmonth,$cprday,$cpryearfull)) { til if (checkdate($cprmonth,$cprday,$cpryearfull)) {
Det matematiske i CPR-nummeret er ikke så avanceret da man bare ganger en talrække på hvert tal i CPR-nummeret og dividerer summen med 11. Er der ingen rest er CPR-nummeret "korrekt". Du kan læse om det på http://da.wikipedia.org/wiki/CPR-nummer
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.