[PHP/Forms] Ingevulde domeinnaam valideren voor versturen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Via de TransIP API kun je de beschikbaarheid van domeinnamen controleren. De API is redelijk strikt en verwacht als input "domein.extensie".

Op mijn website heb ik nu het volgende form (ASCII art Afbeeldingslocatie: http://images.fok.nl/s/static.gif):
code:
1
2
3
4
5
6
7
    +----------------------+ +-----+--+
www.|tweakers              | |.com |\/|
    +----------------------+ +-----+--+

N.B, de HTML:
<input type="text" name="domein">
<select name="extensie"> ... etc.
Met andere woorden: de gebruiker typt een domein en selecteert in de dropdown een extensie. In dit geval wordt tweakers.com naar transIP gestuurd en ik ontvang keurig een response.

Nu wil dit form alleen wat meer fool-proof maken. Als iemand in de input bijvoorbeeld tweakers.net invult, wil ik tweakers.net naar TransIP sturen, en niet tweakers.net.com oid:
code:
1
2
3
    +----------------------+ +-----+--+
www.|tweakers.net          | |.com |\/|
    +----------------------+ +-----+--+
In principe wil ik een stukje code schrijven dat zich als volgt gedraagt (aangenomen dat .com in de dropdownbox geselecteerd is):

waarde van de textinputoutput die naar TransIP gaat
tweakerstweakers.com
tweakers.nettweakers.net
tweakers.co.uktweakers.co.uk
tweakers.foo.bartweakers.com (.foo.bar wordt genegeerd)
www.tweakerstweakers.com (dus niet www.com)
www.tweakers.tvtweakers.tv
foo.tv.tweakersfoo.com
mijn domeinxxxxx (geen output maar foutmelding illegaal karakter)
di |< |< e onzinxxxxx (geen output maar foutmelding illegale karakters)

Deze lijst is vast niet volledig, maar voor een groot deel is duidelijk hoe ik de input / output wil regelen. Ik heb alleen grote moeite om hiervoor een goede flow in mijn code te maken: wat moet ik eerst controleren, wat daarna? Hoe controleer ik of ik de extensie in de dropdown moet negeren (immers: de gebruiker heeft zelf domein.extensie ingevuld in de textinput)? Idee tot nu toe: de ingevulde string proberen te splitten op "." en daarna het laatste argument van de array vergelijken met een array met domein-extensies?

Ik heb al verschillende flarden code, zoals onderstaande regexp die controleert of een domeinnaam die naar TransIP gaat van de vorm domein.extensie is (al werkt hij niet met domein.co.uk of .com.au, etc.):
PHP:
1
2
3
4
5
$domein = 'tweakers.com'; // output ok!

if (ereg("^[[:alnum:]]{1}[[:alnum:]\-]{1,63}\.[[:alpha:]]{2,4}$", $domein)) {
  echo 'ok!';
}

Kortweg: kan iemand mij op weg helpen met een pseudo code-flow hoe je dit gesubmitte form afhandelt? Dus: wat controleer je als eerste, wat daarna, daarna, daarna, etc.

[ Voor 7% gewijzigd door Reveller op 17-01-2006 16:59 ]

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-06 16:30

Bosmonster

*zucht*

Is het niet makkelijker EN beter om bijvoorbeeld punten te strippen of een foutmelding te geven als er een punt (of ander fout teken) in voorkomt, ipv allerlei 'aannames' te doen voor de gebruiker?

Acties:
  • 0 Henk 'm!

  • Gertjan
  • Registratie: Oktober 2001
  • Laatst online: 09-06 20:05

Gertjan

mmmm, beer...

Ik heb ditzelfde probleem eens gehad met een domeinzoeker. Ik kan helaas niet bij de code omdat dat bij een bedrijf draait waar ik nu even geen toegang meer heb.
Ik heb het toen opgelost zoals je zelf ook al bedacht had.
1. Split de string op '.'
2. Is het laatste element (n) een bekende extensie, dan is (n-1).(n) je fqdn
3. Is het laatste element geen bekende extensie, controleer dan of (n-1).(n) een bekende extensie is (om rekening te houden met co.uk. Er bestaan ook enkele extensies van drie elementen, maar daar hoefde ik geen rekening mee te houden.) Zoja -> (n-2).(n-1).(n) is je fqdn.
4. Is (n-1).(n) geen bekende extensie, dan is (n).default je fqdn.

Ik heb dit zo ff uit mijn hoofd gedaan, ik hoop dat ik de flow van mijn eigen code goed onthouden heb. Je kunt het verder zo fool-proof maken als je zelf wilt: in stap 4 kun je bijvoorbeeld ook nog kijken of (n-1) een bekende extensie is en zo bepalen dat (n-2) de naam is die de gebruiker wil controleren. Maar goed, dat moet je zelf weten.
Hopelijk heb je hier wat aan.

PS. Dit vraagt er natuurlijk wel om om met AJAX opgelost te worden.

Acties:
  • 0 Henk 'm!

  • Pete
  • Registratie: November 2005
  • Laatst online: 15-12-2024
Nog even mijn oplossing
  • Zoeken op illegale karakters (punt niet illegaal) indien fout dan dit melden
  • Zoeken op punten (indien geen punten domein goedkeuren)
  • Indien het gedeelte voor de eerste punt 'www' is dan de substring vanaf de eerste punt nemen
  • als het gedeelte na de laatste punt niet in je domeinarray (waar je de echte tlds in zet als .com maar ook .uk) voorkomt dan gewoon het gedeelte voor de eerste punt nemen als domein (met extensie uit extensiebox)
  • het aantal nog aanwezige punten tellen. Als meer dan 2 dan alleen voor de eerste punt als domein nemen, als 2 dan kijken in de array met dubbele extensies. Als 1 dan in de array kijken met echte tld van 1 stuk (.uk mag dus niet hierin)
  • de rest spreekt voor zich (toch?)

petersmit.eu


Acties:
  • 0 Henk 'm!

Anoniem: 26421

Bosmonster schreef op dinsdag 17 januari 2006 @ 17:07:
Is het niet makkelijker EN beter om bijvoorbeeld punten te strippen of een foutmelding te geven als er een punt (of ander fout teken) in voorkomt, ipv allerlei 'aannames' te doen voor de gebruiker?
Het lijkt mij dat hier het enige juiste antwoord gegeven wordt; in sommige gevallen is het handig om met de gebruiker mee te denken en te voorkomen dat er een foutmelding wordt gegeven, echter in dit geval zou ik zoals de suggestie van Bosmonster aangeeft toch echt een foutmelding geven als er een punt in de domeinnaam voorkomt. De gebruiker mag nog wel íets zelf goed doen :Y)

Edit: Om een voorbeeld te geven wat de gedachte is achter mijn reply;
Stel ik ben een van de onzettend onnozele bezoekers en ik ben er heilig van overtuigd dat ik de domeinnaam `tweakers.foo` wil controleren. Niet wetend dat dit eigenlijk hartstikke fout is, maar nogmaals, ik ben er als onnozele toetsenbordgebruiker van overtuigd dat dit het juiste is.
Wat gebeurd er? Ik voer dit in in jouw applicatie, en ik krijg vervolgens op het volgende scherm te zien:

Helaas, de door u ingevoerde domeinnaam tweakers.com is niet actief.

Wat gebeurd er? Ik snap er - als domme bezoeker - de ballen meer van! Ik voer toch tweakers.foo in, en niet tweakers.com?! Help, mijn pc is behekst! Ik wil .foo controleren en niet .com!
Kortom, laat de gebruiker in dit geval in zijn waarde, dat mag duidelijk worden met dit voorbeeldje.
Ik moet er wel bijmelden dat het vaak wél goed is om met de gebruiker mee te denken, maar dat ik er van overtuigd ben dat dat in dit geval niet zo moet zijn.

Een goed voorbeeld van het wijzigen van input van een gebruiker is die bij diverse internetbankierapplicaties. Als gebruiker voer je met je numerieke pad een punt gescheiden getal in, en met JS wordt hier eenvoudig een kommaatje van gemaakt. Dat is op een juiste manier met de input van de gebruiker omgaan, maar hele stukken tekst wijzigen mag niet de bedoeling zijn. Dit wordt maar weer duidelijk met het voorbeeld: als ik een Postbanknummer invoer zónder dat die met een noodzakelijke P begint, dan krijg ik een alertje te zien met de boodschap dat het ingevoerde gironummer niet juist is.

[ Voor 56% gewijzigd door Anoniem: 26421 op 17-01-2006 17:42 ]


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Bosmonster schreef op dinsdag 17 januari 2006 @ 17:07:
Is het niet makkelijker EN beter om bijvoorbeeld punten te strippen of een foutmelding te geven als er een punt (of ander fout teken) in voorkomt, ipv allerlei 'aannames' te doen voor de gebruiker?
Anoniem: 26421 schreef op dinsdag 17 januari 2006 @ 17:34:
Het lijkt mij dat hier het enige juiste antwoord gegeven wordt;
[...]
Stel ik ben een van de onzettend onnozele bezoekers en ik ben er heilig van overtuigd dat ik de domeinnaam `tweakers.foo` wil controleren. [...] Ik voer dit in in jouw applicatie, en ik krijg vervolgens op het volgende scherm te zien:

Helaas, de door u ingevoerde domeinnaam tweakers.com is niet actief.
Ik vind dat wel interessante opmerkingen. Als ik dit wil gaan uitwerken, heb ik veel aan de reply's van Gerrjan en phsmit - hun oplossingen liggen in de richting van wat ik in de TS al brabbelde. Aan de andere kant moet je je ook afvragen in hoeverre je user-input wilt aanpassen: waar het aanpassen van de ene ingevoerde domeinnaam nog wel handig is, in het in een ander geval waarschijnlijk irritant of ronduit overbodig omdat de user er niet mee geholpen is. Als die grens zo moeilijk te vinden is, is het idd misschien maar beter om in dit geval 'cold-turkey' alle checks eruit te gooien en alleen te controleren op illegale karakters. Nog meer meningen / ideeen, iemand?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."

Pagina: 1