Filterfuncties sanitize, validate, etc. betrouwbaar?
Door
Hans De Ridder
op 23-03-2016 12:06
gewijzigd op 23-03-2016 12:08
4.540 views
Ik gebruik om een check op een url uit te voeren een aantal filters.
Bij testen leek alles goed te gaan. Totdat ik de extensie eens niet erbij zette.
Ik testte bijv. op http://www.regenboogjes.nl.
Laat ik de '.nl' weg dan komt er toch een true.
Er zijn tal van futoristische scripts om toch te checken op de extensie.
Maar moet ik me nu zorgen maken bij de toepassing van filters.
Want zijn veel filters beschikbaar.
Toepassing lijkt ook nog gebruikte browser gevoelig te zijn.
En er is ook verschil tussen ipv4 en ipv6 mogelijkheid.
De vraag is te algemeen. Geef een concreet voorbeeld van wat je wilt bereiken, wat het resultaat is en wat je had verwacht. Het is onmogelijk om hierover een algemeen en allesomvattend advies te geven.
Het klinkt alsof je de functionaliteit die je gebruikt verkeerd toepast, niet begrijpt of beide.
En soms, heel soms, doet de functionaliteit niet wat deze zou moeten doen.
Ik wil voorkomen dat met typefouten of vergeten extensie een url toch door de 'keuring' komt.
Er mag uitsluitend iets uitrollen met de extensie (.nl, .org, .com...etc), zonder extra toevoegingen.
Dus http://www.regenboogjes.nl.... Of http://www.pctraverse.org....
Wanneer er typefouten staan in de 'http:/www.'; dan is dat goed te checken.
Kan ook wel checken of er een laatste '.' staat, en of er nog wat achteraan komt.
Maar was in de veronderstelling dat dit gebeurde met de filtering.
if (!empty ($webs))
{
// Remove all illegal characters from a url
$webs = filter_var($webs, FILTER_SANITIZE_URL);
// Validate url
if (filter_var($webs, FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED) === false) {
return "Verkeerde invoer Website";
}
$findme = "http://www.";
$pos = strpos($webs, $findme);
$posa = strpos($webs, '/', 8);
if (($posa > 7) or ($pos > 0 ) or ($pos === false) or ($posa === true))
{
return "Verkeerde invoer Website";
}
}
Met het scriptje zorg ik dat er vanaf plek 1 (dus ook geen spatie)altijd moet staan 'http://www.';.
En ik kijk of er nog wat extra's bij staat (na de http://www.)dat begint met '/'.
Maar geen, of een verkeerde extensie, wordt een true.
En ik had verwacht dat het 'FILTER_FLAG_HOST_REQUIRED' wel voor de controle zou zorgen
of er een extensie aanwezig is.
FILTER_FLAG_HOST_REQUIRED bestaat volgens mij niet.
Daarnaast kan een URL naast het protocol http ook https of andere protocollen bevatten.
Verder ondersteunt filter_var() alleen standaard ASCII (iig geen domeinen buiten "latin") en laat deze mogelijk onveilige invoer door als ik de comments op php.net mag geloven.
Volgens mij heb ik dit al eerder aangegven, toen je deze vraag al eerder stelde, dat een goede manier om na te gaan of het een geldige website / webpagina betreft, het uitvoeren van een request is (bijvoorbeeld met cURL), en dan kijken of je een HTTP 200 statuscode terugkrijgt.
EDIT: en mogelijk kun je nog altijd terugvallen op handmatige moderatie en goedkeuring.
Dat is een artikel uit 2011, daarnaast, van php.net (user comment):
Please note that FILTER_FLAG_HOST_REQUIRED and FILTER_FLAG_SCHEME_REQUIRED have disappeared. They were previously mentioned in the constants page but it seems that host and scheme are now required by default for the validate_url filter.
naast http:// bestaat er ook https://
Maar ook ftp:// kan, en de vraag is, of niet ook telnet, gopher etc zouden mogen.
Daarnaast veronderstel je dat de domeinnaam altijd met www. begint.
Is wat kort door de bocht, aangezien er ook zat sites zijn die dat achterwege laten, of er iets anders staat.
bijvoorbeeld m.telegraaf.nl, shop.buystuff.com
En om veel andere scripts vast af te keuren:
checken of de extensie uit 2 tot 6 karakters bestaat (.nl .com .info of .travel)
is ook verouderd, aangezien je er tegenwoordig zaken als .amsterdam of .restaurant mag verwachten)
Het gaat om opgave van een eigen artiestenwebsite in een registratieformulier, waar men dit kan opgeven.
In de praktijk zullen dat geen schokkende afwijkingen zijn.
Ik zal het zo maken nu dat er standaard een aantal extensies zijn toegestaan,
zoals .nl, .com, .org, .be. Dat geldt ook bij andere bijzonderheden.
Voor afwijkingen tov mijn toegestane invoer kan men dan contact opnemen met de de webbeheerder.