controllo parolacce

emanuelevt

Utente Attivo
24 Giu 2009
298
0
0
Visto che oggi non lavoro ...
ho sviluppato questo semplice script che tramite array controlla che non vengano inserite parole indesiderate.

Codice:
<html>
<head>
</head>
<body>

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="text" name="testo" /><br />
<input type="submit" name="invio" /><br />
<input type="reset" name="reset" /><br />
<input type="hidden" value="<?php echo $stringa; ?>" name="php" /><br />
</form>
<?php
if(isset($_POST['invio'])){
$testo=$_POST['testo'];
$controllo=0;

$array_control=array('cavolo','mannaggia');

$array=explode(' ',$testo);
for ($x=0; $x<sizeof($array); $x++){

			for($a=0;$a<sizeof($array_control);$a++){
			if($array[$x]==$array_control[$a]){$controllo++;}
		}
}


if($controllo>0){$stringa=0;}else{$stringa=$testo;}

echo $stringa;
}else{echo 'inserire un carattere';}
?>
</body>
</html>

Ovviamente esistono molte altre parolacce...

0:)
 
ottimo, gli farei solo una modifica in modo che possa andarsi a prendere le parolacce da un db
 
Io invece toglierei del tutto il ciclo for che è inutile e userei la funzione di sostituzione strtr() così la tua parte di script diverrebbe:
PHP:
if(isset($_POST['invio'])){ 
    $testo = filter_input(INPUT_POST, 'testo', FILTER_SANITIZE_SPECIAL_CHARS);

    $array_control=array('cavolo' => 'acciderbolina', 'mannaggia' => 'orcapeppola');
    $testo = strtr($testo, $array_control);
    echo $testo;
} else echo 'Inserisci almeno una parola nel campo di testo!';
 
ciao
sarò pedante (pedante non credo che sia una parolaccia), ma c'è qualcosa che nello script di marco non mi torna
se do il submit entro nell'if e controlla... ma l'else?
ma forse mi sbaglio

inoltre visto che siamo in fase di miglioramenti io sarei meno drastico

//come detto da eliox meglio da db
$array_controllo= array('acciderbolina', 'pinco', 'pallo');//ed altre
//per chi non lo sapese "pinco" e "pallo" sono parolacce, leggere "la semantica dell'eufemismo",
//in quanto sono un eufemismo per dire (indovinate)
$sostituisci_con = " ##### ";
$testo = filter_input(INPUT_POST, 'testo', FILTER_SANITIZE_SPECIAL_CHARS);
echo str_replace($array_controllo, $sostituisci_con, $testo);
 
Ultima modifica:
L'else in effetti non serve proprio a nulla, l'avevo inserito solo perché inserito anche nello script originale, diciamo che è migliorabile anche lì, vuole solo dire che con un invio a vuoto ti arriva il messaggio di invio a vuoto appunto.
Per quanto riguarda pinko (si dovrebbe scrivere col K visto che è greco è sì considerata una parolaccia visto che l'equivalente greco del latino fallo, mentre pallo o pallino è il contrario di ritto insomma hai ragione a dire che si possono considerare parolacce, ma non siamo qui ad un convegno di semiologi credo :eek:
Il tuo script invece sembra essere più esemplicativo perché trasforma ogni parolaccia in una serie di caratteri coprenti, i cancelletti appunto, una cosa molto drastica, io almeno avevo definito la possibilità di avere delle sostituzioni ma insomma sono solo diverse implementazioni dello stesso metodo, quello che volevo fare era di usare meno funzioni possibili, il primo script usava una traformazione della frase in array, poi li passava a due cicli nificati, faceva dei confronti, usava un parametro di controllo per verificare se c'erano state modifiche.
Sembra più completo ma in realtà non lo è perché tutte quelle cose una funzione di ricerca e sostituzione le fa già.
Non volevo dimostrare altro :)
 
ok ok ammetto di non essere molto fantasioso con le parolacce...ma è uno dei motivi per i quali mi ritengo un bravo ragazzo... .

Iil mio intento era quello di impedire l'invio dell'intero $_POST['testo'] nel caso in cui l'utente isnerisca una parolaccia; e non quello di sostituire la parolaccia con una serie di caratteri ##### ... poichè se uno scrive "che ##### vuoi?" è facile comprenderne il significato... mentre se chi inserisce una parolaccia e si ritrova a scrivere l'intero post magari ci pensa due volte prima di offendere... .

per ciò che riguarda il database sono pienamente d'accordo; ma ho tentato di sfruttare l'array proprio per risparmiare risorse....

al posto di input type='text' ovviamente dovrei mettere una textarea - ma giustamente voi avete messo un filtro di controllo, a tal proposito una piccola domanda

cosa cambia usando il filtro oppure htmlspecialchars?
 
ciao
secondo me le funzioni filtro si differenziano, oltre che ad essere più facili da usare in molti casi dove avresti dovuto costruire le espressioni regolari,
anche per il tipo di output, inoltre, oltre che a pulire, si possono occupare anche della validazione.
inoltre (nel caso tuo) si differenzia anche nell'output:

$testo = filter_input(INPUT_POST, 'testo', FILTER_SANITIZE_SPECIAL_CHARS);

ritorna la stinga del $_POST['testo'] ripulita se la pulizia va a buon fine, altrimenti il valore FALSE o NULL se $_POST['testo'] non è settata.
quindi molto utile da utilizzare in accoppiato con gli if

htmlspecialchars($_POST['testo'] ) ritorna solo l'eventuale stringa ripulita, comunque guarda

http://it.php.net/manual/en/ref.filter.php

tieni presente, però, che le funzioni filtro sono implementate dalla versione php >= 5.2.0

SEO (salvo errori od ommissioni)

per marco
anche me, forse avrei dovuto scrivere le frase in questa maniera:
non l'avevo visto, pinKo!!!
 
ok ok ammetto di non essere molto fantasioso con le parolacce...ma è uno dei motivi per i quali mi ritengo un bravo ragazzo... .

Iil mio intento era quello di impedire l'invio dell'intero $_POST['testo'] nel caso in cui l'utente isnerisca una parolaccia; e non quello di sostituire la parolaccia con una serie di caratteri ##### ... poichè se uno scrive "che ##### vuoi?" è facile comprenderne il significato... mentre se chi inserisce una parolaccia e si ritrova a scrivere l'intero post magari ci pensa due volte prima di offendere... .

per ciò che riguarda il database sono pienamente d'accordo; ma ho tentato di sfruttare l'array proprio per risparmiare risorse....

al posto di input type='text' ovviamente dovrei mettere una textarea - ma giustamente voi avete messo un filtro di controllo, a tal proposito una piccola domanda

cosa cambia usando il filtro oppure htmlspecialchars?
Non mi dilungo sulla questione dei filtri di cui ha già parlato borgo, tranne per una cosa ovvero che l'uso dei filtri rende molto più flessibile la possibilità di interagire su quanto riportato in una GET/POST.
Htmlentities è poco flessibile mentre con i filtri si possono filtrare i caratteri in molti modi, certo creando una funzione ad hoc si può andare oltre ma credo che nel 99% dei casi sia sufficiente.
Per quanto riguarda il tuo script, basta controllare se la frase riportata dal POST era in_array() dove all'array veniva riportato un array appunto con le parole vietate.
Tieni presente che in_array() può validare una stringa ma in questo caso è case sensitive, quindi conviene "normalizzarla" magari facendo prima un strtolower().
Altro metodo citato nelle note alla pagina del manuale dice di usare un array associativo e la funzione isset()
PHP:
$fast = array('apple' => 'apple', 'banana' => 'banana', 'orange' => 'orange');

if (isset($fast['banana'])) print('Found it!');
pare sia molto più veloce di in_array().
 
Bah, secondo me per un'esigenza del genere il metodo migliore consiste nell'usare le espressioni regolari e la funzione preg_replace().

Pensate a quanti diminutivi, dispreggiativi, accrescitivi che comporta ogni singola parola. Con un giusto pattern possiamo evitare che venga inserito 'stupido', 'stupidino', 'stupidone', 'stupidissimo'..
 

Discussioni simili