Filterfuncties sanitize, validate, etc. betrouwbaar?
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.
Gewijzigd op 23/03/2016 12:08:00 door Hans De Ridder
Je constateert alleen maar dat er van alles mogelijk is, maar zegt niet wat je nu precies wilt.
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.
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.
Gewijzigd op 23/03/2016 15:32:36 door Hans De Ridder
Geef een script van 3 of 4 regels als voorbeeld
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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";
}
}
{
// 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.
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.
Gewijzigd op 23/03/2016 20:54:37 door Thomas van den Heuvel
php.net (user comment):
Is dus niet meer nodig om expliciet op te geven.
Dat is een artikel uit 2011, daarnaast, van Quote:
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.
Is dus niet meer nodig om expliciet op te geven.
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)
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.
ik weet niet wat voor artiesten, maar .tattoo lijkt me ook iets voor een artiest
.pink en .blue voor schilders met voorkeur voor bepaalde kleuren
.pics .pictures .photographer
.ink voor drukwerk
.design
.guitars voor gitaristen
.actor .theater
.band .hiphop
zo maar een paar extensies vanaf: https://www.transip.nl/domeinnaam/
En laat ook checken of er wel een extensie is ingevuld.
Bij afwijkingen verwijs ik naar de webmaster.
Want er zullen ook websites bijzitten van internetproviders.
En die hebben afwijkende namen van wat ik toesta.
.nl, .com, .org, .biz, .info, .eu, .be, .de.
Ik heb ook een status kolom in de database.
Die kan ik in voorkomende gevallen gebruiken om afwijkingen toch toe te staan.
En dat allemaal omdat de functie filter_var() niet werkt zoals jij dat wilt, danwel omdat je hem verkeerd toepast.
Persoonlijk vind ik dat je op de verkeerde weg bent.
Maar het is jouw applicatie natuurlijk.
Meesten hebben helemaal geen website.
Veelal verloopt communicatie via facebook.
Die kan in ander veld ook worden opgegeven.
Net als een youtube filmpje met opname.
En als er een website is dan meestal met .nl of .org.
Gelet op het aantal muziekvrienden op mijn facebook uit Vlaanderen en Duitsland heb ik die extensie er ook bij staan.
Een aantal artiesten hebben wel een eigen bedrijf, dat niets met artiest zijn te maken heeft.
Daar verwijzen ze dan naar of naar een subpagina.
In de weinig voorkomende gevallen dat dit afwijkt maak ik dan een uitzondering.
Zal zo even jouw functie uittesten Ward.
Bedankt voor je tip.
Gewijzigd op 24/03/2016 13:40:37 door Hans De Ridder
Toevoeging op 24/03/2016 20:27:42:
De code van Ward geeft een "false positive" voor de url http://www.nonexistent.com/.
Zoals ik volgens mij al eerder aangaf is de beste manier gewoon kijken of je de pagina kunt opvragen en dan de HTTP statuscode inspecteren (deze zou 200 moeten zijn).
In zijn eenvoudigste vorm zou dit zoiets worden (ook weer cURL, lijkt beter zijn ding te doen dan sockets). Je hoeft hierbij ook enkel de headers (HEAD) op te halen, en niet per se alle inhoud (GET):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function isOnline($url) {
$cp = curl_init();
curl_setopt($cp, CURLOPT_URL, $url);
curl_setopt($cp, CURLOPT_RETURNTRANSFER, true); // return response as string
curl_setopt($cp, CURLOPT_HEADER, true); // include reponse header in response
curl_setopt($cp, CURLOPT_NOBODY, true); // true = HEAD, false = GET
curl_setopt($cp, CURLINFO_HEADER_OUT, true); // track request header so you can see what request you sent
curl_setopt($cp, CURLOPT_SSL_VERIFYPEER, false); // for HTTPS domains; ugly, but effective
$response = curl_exec($cp);
// echo '<pre>'.htmlspecialchars($response, ENT_QUOTES, 'UTF-8').'</pre>';
// echo curl_getinfo($cp, CURLINFO_HEADER_OUT); // inspect request header in case something went wrong
return curl_getinfo($cp, CURLINFO_HTTP_CODE) === 200;
}
?>
function isOnline($url) {
$cp = curl_init();
curl_setopt($cp, CURLOPT_URL, $url);
curl_setopt($cp, CURLOPT_RETURNTRANSFER, true); // return response as string
curl_setopt($cp, CURLOPT_HEADER, true); // include reponse header in response
curl_setopt($cp, CURLOPT_NOBODY, true); // true = HEAD, false = GET
curl_setopt($cp, CURLINFO_HEADER_OUT, true); // track request header so you can see what request you sent
curl_setopt($cp, CURLOPT_SSL_VERIFYPEER, false); // for HTTPS domains; ugly, but effective
$response = curl_exec($cp);
// echo '<pre>'.htmlspecialchars($response, ENT_QUOTES, 'UTF-8').'</pre>';
// echo curl_getinfo($cp, CURLINFO_HEADER_OUT); // inspect request header in case something went wrong
return curl_getinfo($cp, CURLINFO_HTTP_CODE) === 200;
}
?>
Aanroep:
Code (php)
thxcomeagain
Gewijzigd op 24/03/2016 14:51:53 door Thomas van den Heuvel
Heb het verwerkt.
Ik denk dat standaard wordt aangehouden http://www.
Want vul ik in: regenboogjes.nl dan vindt hij het prima.
Als ik er echter https van maak of wat anders dan checkt hij het wel.
Maar heb het wel kunnen toepassen, dus de credits gaan met name naar jou.
Ik moet op een bijzondere manier input checken. O.a. ivm problemen met de Buma/Stemra en Stichting Brein.
Daarom kan men bijv. wel invullen dropbox.com. maar geen achtervoegsel, want dat kan verwijzen naar downloads. Overigens is het nooit helemaal veilig, want gaat men via verwijspagina weer doorschakelen dan blijft alleen een handmatige verwijdering over. Maar het is een promotiesite voor artiesten en organisaties onderling. En wil zoveel mogelijk illegaal handelen afschermen voor de leden, maar ook recht doen aan organisaties.En dat is al een hele klus...ook zonder PHP, haha