Zoekend naar twee functienamen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

20/04/2012 16:31:44
Quote Anchor link
Ik ben zeg maar bezig met een lijst voor woorden die geblokkeerd moeten worden, en het zou handig zijn als die automatisch woorden checkt die, bijvoorbeeld beginnen met: PHP, en ook moet hij doormiddel van code: php, blokkeren.

Dit is wat ik momenteel heb:

if($username == "admin"){
echo "Gebruikersnaam ongeldig".$form;
exit;
}

Ik wil graag dat hij ook dit, bijvoorbeeld, automatisch controleert en blokt:

siteadmin [komt admin in voor, dus blokken]
adminman [admin dus blokken]
ADMIN [hoofdletters, maar wel admin, blokken]
AdMiN [Admin, dus blokken]

Is daar een functie voor?
Gewijzigd op 20/04/2012 20:06:14 door
 
PHP hulp

PHP hulp

29/04/2024 01:47:56
 
- Mark -

- Mark -

20/04/2012 16:45:57
 

20/04/2012 17:02:35
Quote Anchor link
- Mark - op 20/04/2012 16:45:57:


Dit is voor de eerste functie?
 
- Mark -

- Mark -

20/04/2012 17:16:36
Quote Anchor link
Beide, strpos is case-insensitive
 

20/04/2012 17:17:58
Quote Anchor link
Bedankt Mark :). Ik ga er naar kijken!
 
M grootveld

M grootveld

20/04/2012 22:29:28
Quote Anchor link
Precies iets waar ik ook naar op zoek ben. Helaas snap ik van die strpos niet veel?
 
Fons Seesink

Fons Seesink

20/05/2012 18:21:44
Quote Anchor link
if(strpos(strtoupper($username,"ADMIN"))){
echo "Gebruikersnaam ongeldig".$form;
exit;
}
 
Wouter J

Wouter J

20/05/2012 19:29:48
Quote Anchor link
Fons, allereerst vergelijk je appels met peren en zal je script daarom niet goed werken. Want je vergelijk nu of strpos iets terug geeft wat als false aangezien kan worden, dat kan dus 0, "0", null, false, array(), array(0), 0.00, enz. zijn. Als je nu invoert 'admin' dan is admin op positie 0, dit is een falsy waarde en dus zal er niet komen 'Gebruikersnaam ongeldig' terwijl het wel ongeldig is.
Controleer altijd juist. In dit geval wil je controleren of strpos iets anders dan false terug geeft, is dat zo dan komt er admin in voor:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if (strpos(...) !== false) {
  // do something
}
?>

Tevens zie je dat ik hier === (of in dit geval !==) gebruik en geen ==, dat moet omdat je anders alsnog met falsy waardes te maken hebt (== en != zou eigenlijk verboden moeten worden).

Tevens komt je nooit een exit zomaar gebruiken. Handel je fouten mooi af, laat niet opeens het script stoppen.

Ook kun je veel beter gebruik maken van stripos in dit geval, omdat je case-insensitive wilt. Gaan werken met toupper functies (waarom niet tolower?) is dus echt niet handig.

Als laatst is grootveld opzoek naar een uitleg, niet naar een voorbeeld waar hij niks aan heeft.

En oh ja, we hebben hier code tags op het forum...

@M Grootveld, wat begrijp je er niet precies aan dan? Met 'ik snap er niks van' kunnen we niet veel, leg uit wat je wel begrijpt en bij welke stap je het niet meer begrijpt. Dan kunnen we je beter uitleggen.
Kijk anders even bij de PHP documentatie (strpos). Alles staat daar goed uitgelegd, begrijp je de documentatie niet? Lees dan eens: http://www.phphulp.nl/php/tutorial/overig/phpnet/757/

@Mark, strpos is niet case-insensitive, daarvoor hebben we stripos. (de i van case-insensitive)
 
Joey Drieling

Joey Drieling

20/05/2012 20:11:18
Quote Anchor link
@Wouter j

Jij hebt het over die === & !== kan ik dat nou beeter altijd gebruiken in de plaats van == & != !? Want als ik het goed begrijpt controleerd === ook de type bijvoorbeeld of het beiden een string is tog?
 
Eddy E

Eddy E

20/05/2012 20:19:57
Quote Anchor link
Precies.

== waarde is gelijk aan > 1 == '1' == true;
=== waarde én type gelijk > 1 != '1' != true;

Toevoeging op 20/05/2012 20:25:26:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php

function check_forbidden_usernames($string)
    {

    // list of forbidden words
    $forbidden = array('admin', 'user', 'anoniem', 'useradmin'); // of meer
    
    // search all this words in given string

    foreach($forbidden as $forbid)
        {

        // if $string contains a forbidden word
        if(substr_count(strtolower($forbid), strtolower($string)) != 0)
            {

            // return true (because it is forbidden)
            return true;
            }
        }

    
    // no forbidden words found, so false.
    return false;    
    }

    
if(check_forbidden_usernames('administator'))
    {

    // trow error, name is not allowed;
    }
?>


Wel in het engels, maar ach, dat moet te doen zijn toch?
 

20/05/2012 20:32:50
Quote Anchor link
Ik heb het volgende werkende script, aangereikt gekregen, staan wel hele rare woorden bij :P :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
<?php

    /* Deze functie zal kijken of er geen verboden woorden inzitten,
     * return false wanneer dit wel zo is:
     */

    function checkForbiddenWords($string) {

        /* We gaan eerst een lijst met verboden woorden maken, dit kun
         * je ook doen doormiddel van een database:
         */

        $forbiddenWords =
            array(
                'admin',
                'webmaster',
                'beheer',
                'mod',
                'autist',
                'autismens',
                'kut',
                'kk',
                'kanker',
                'klote',
                'strator',
                'stoned',
                'drugs',
                '',
                'banga',
                'pedo',
                'penis',
                'pik',
                'lul',
                'aut',
                'kloot',
                'aftrekken',
                'klaarkomen',
                'aalskakker',
                'aambeienbeffer',
                'aambeienlikker',
                'aambeienschoffelaar',
                'aambeihaarwasser',
                'aangekleed nageboorte',
                'aansteller',
                'aap',
                'aardappelhoer',
                'aardappelluis',
                'aardbanaan',
                'aardgeest',
                'aardpeer',
                'aardpiraat',
                'aardvarken',
                'aardworm',
                'aardworst',
                'aars',
                'aasgier',
                'abortuskind',
                'absjaar',
                'achterbaksestoephoer',
                'achterlader',
                'achterlijke',
                'achterlijke zoetwatermossel',
                'achterlijk gebakkie',
                'achterpoter',
                'achterbuurtfossiel',
                'afbak hoer',
                'afgebakken frikandelhoofd',
                'afgebefte del',
                'afgebefde legoman',
                'afgebeft',
                'afgedankte kuthoer',
                'afgedankte pornofotograaf',
                'afgedankte wcbril',
                'afgebrokkelde teenheks',
                'afgekakte muizenstront',
                'afgekakte bosaap',
                'afgekeurd komkommertijd',
                'afgekeurd-kutje',
                'afgekeurde kuttige flubberkont',
                'afgekeurde straathoer',
                'afgekloofde discohippie',
                'afgekloven afwasborstel',
                'afgekloven',
                'afgelebberd brood',
                'afgelekte-koeiekak',
                'afgelikteboterhammenlikker',
                'neuken',
                'seksen',
                'sexen',
                'sexn',
                'anaal',
                'hoer',
                'slet',
                'bitch',
                'stoomkloot',
                'gebruikersnaam',
                'username',
                'password',
                'wachtwoord',
                'voornaam',
                'naam',
                'firstname',
                'first',
                'name',
                'achternaam',
                'surename',
                'email',
                'webadres',
                'web',
                'youtube',
                'bio',
                'registreren',
                'registreer',
                'register',
                'verplicht',
                'neger'
            );
            
        /* Nu gaan we kijken of er een match is met de lijst
         * hierboven:
         */

        foreach($forbiddenWords as $forbiddenWord) {
        
            /* Als het woord in $word voorkomt return dan het woord:
             */

            if(preg_match('/'.str_replace('/', '\/', $forbiddenWord).'/usi', $string)) {
                return $forbiddenWord;
            }
            
        }
        
    }

    
    /* Je moet dus checkForbiddenWords aanroepen met het woord dat gecontroleerd
     * moet worden (bv. $username):
     */

    if(checkForbiddenWords($username)) {
        echo '<div id="foutmelding">Het woord <strong>\''.checkForbiddenWords($username).'\'</strong> is niet toegestaan.</div>'.$form;
        exit;
    }

    
?>
 
Eddy E

Eddy E

20/05/2012 20:38:41
Quote Anchor link
In essentie precies hetzelfde als wat ik zei. Alleen wat andere variabelen en geeft deze functie het verboden woord terug (maar geen true/false).
Dus als het goed is, krijg je niets terug??? Beetje raar. Ik zou nog onderaan de fucntie even een return false; toevoegen.

Tja, die woordenlijst is nogal lang.... afgekeurde staat er vaker in.
 

20/05/2012 20:45:45
Quote Anchor link
Ik krijg gewoon dit te zien hoor? Of bedoel je iets anders?

if(checkForbiddenWords($username)) {
echo '<div id="foutmelding">Het woord <strong>\''.checkForbiddenWords($username).'\'</strong> is niet toegestaan.</div>'.$form;
exit;
---

En wordt zo aangeroepen:


if($firstname && $lastname && $username && $password && $repassword){
if($username == require("forbidden.php")){
}
Gewijzigd op 20/05/2012 20:47:23 door
 
Eddy E

Eddy E

20/05/2012 21:06:56
Quote Anchor link
En dat werkt zo?
Vooral dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if($username == require("forbidden.php")){


En daarbij: nu echoed je functie al HTML.
Meestal wil je dat niet. Wat als ik mijn fouten gewoon even in een array zet?

Kortom: functie gebruiken, maar wel aanpassen.
Gewijzigd op 20/05/2012 21:07:50 door Eddy E
 

20/05/2012 21:07:34
Quote Anchor link
Ja alles werkt zoals het werken moet :)
 
Wouter J

Wouter J

20/05/2012 23:23:09
Quote Anchor link
@Eddy, === is exact gelijk aan en == is dezelfde waarde. Aangezien PHP lazy-type is en dus totaal niet strict omgaat met types is het vaak verstandiger om === te gebruiken, dan ben je zeker van je zaak. Ook zie je bij sommige functies op PHPnet een warning staan dat je hier verplicht === voor moet gebruiken, zo ook de strpos functie.

En die rare if, ja helaas werkt het. Echt overzichtelijk vind ik het zelf niet, maar hieronder maak ik er zelf ook gebruik van... :S

@Cailin, ik heb je functie even wat verbeterd. Het werkt nu sneller (omdat ik geen preg functie gebruik), als er 1 of meerdere woorden in voorkomen krijg je een array met al die woorden terug en zoniet krijg je false:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php

function checkForbiddenWords($txt)
{

    $words = array(
        'admin',
        'webmaster',
        'beheerder',
        'mod',
        '...'
    );

    $existingWords = array_filter($words, function ($item) use ($txt) {
        if (strpos($txt, $item) !== false) {
            return true;
        }


        return false;
    });


    if (count($existingWords) > 0) {
        return $existingWords;
    }


    return false;
}


// voorbeeld
if ($forbiddenWords = checkForbiddenWords('Hello admin, I am a mod!') !== false) {
    echo 'Er komen verboden woorden in voor: '.implode(', ', $forbiddenWords);
}

?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.