/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Inputvalidering til gæstebog
Fra : Erik Ginnerskov


Dato : 18-01-07 17:28

Hej NG

Jeg sidder og bokser med at lave noget inputvalidering til en gæstebog, men
jeg kan ikke få det til at fungere helt som jeg ønsker. Kode (indsat øverst
i dokumentet):

<?php
if (!empty($_POST['message'])) {
header ("Location: ../blokeret.php");
exit;
} else
if (!strpos($_POST['name'], "@") && // tjek, at der ikke er et @ i "navn"
!eregi("\r",$_POST['name']) && // tjek, at der ikke er "vogn-retur" i
"navn"
!eregi("\n",$_POST['name'])) { // tjek, at der ikke er "linjeskift" i
"navn"
header ("Location: ../blokeret.php");
exit;
}
?>

Den første del - tjek, at feltet 'message' er tomt (det skal det være,
ellers er det spam) - fungerer perfekt.

Den anden del - tjek, at der ikke er skrevet forbudt indhold i feltet
'name' - blokerer indlæg, selv om der ikke er skrevet noget forkert.

http://hjemmesideskolen.dk/usenet/gem-php.txt

Jeg har lånt valideringen fra en mail-formular, hvor det ikke giver
problemer:

http://hjemmesideskolen.dk/scripts/phpmail.php

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



 
 
Martin (18-01-2007)
Kommentar
Fra : Martin


Dato : 18-01-07 17:34

Erik Ginnerskov wrote:
> if (!strpos($_POST['name'], "@") && // tjek, at der ikke er et @ i "navn"
> !eregi("\r",$_POST['name']) && // tjek, at der ikke er "vogn-retur" i
> "navn"
> !eregi("\n",$_POST['name'])) { // tjek, at der ikke er "linjeskift" i
> "navn"'

Hvorfor bruge eregi? - Brug da strpos til alle 3, du søger jo bare efter
et "bogstav/ord" i en variabel

if(
strpos($_POST["name"],"@")
||
strpos($_POST["name"],"\n")
||
strpos($_POST["name"],"\r")
)
{
// @ \n \r ER fundet
} else {
// @ \n \r ikke fundet
}

Martin (18-01-2007)
Kommentar
Fra : Martin


Dato : 18-01-07 17:39

Martin wrote:
> Erik Ginnerskov wrote:
>> if (!strpos($_POST['name'], "@") && // tjek, at der ikke er et @ i
>> "navn"
>> !eregi("\r",$_POST['name']) && // tjek, at der ikke er "vogn-retur"
>> i "navn"
>> !eregi("\n",$_POST['name'])) { // tjek, at der ikke er "linjeskift" i
>> "navn"'
>
> Hvorfor bruge eregi? - Brug da strpos til alle 3, du søger jo bare efter
> et "bogstav/ord" i en variabel
>
> if(
> strpos($_POST["name"],"@")
> ||
> strpos($_POST["name"],"\n")
> ||
> strpos($_POST["name"],"\r")
> )
> {
> // @ \n \r ER fundet
> } else {
> // @ \n \r ikke fundet
> }

PS: Hvis du virkelig ønsker at starte reg motoren op, så kunne det se
sådan her ud.
PPS: Jeg bruger nu KUN preg da den er nemmere :)

if(preg_match("_\\n|\\r|@_",$str)) {
/*

skåret ud i pap

Den første og sidste _ er for at fortælle preg at det er her det hele
starter

\\n = da \ er en escaper i reg, så skal vi skrive to \ for at fortælle
at det virkelig ER en \ vi vil have.

| = betyder eller.

Så i godt dansk lyder det noget ala
start \n eller \r eller @ slut
_ \\n | \\r | @ _

*/

// @ \n \r ER fundet
} else {
// @ \n \r ikke fundet
}

Erik Ginnerskov (18-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 18-01-07 18:41

Martin wrote:

> if(preg_match("_\\n|\\r|@_",$str)) {

Så går de lovlige indlæg glat igennem, men er der f.eks. et @ i 'name',
bliver der ikke blokeret:

if (!empty($_POST['message'])) {
header ("Location: ../blokeret.php");
exit;
} else
if (preg_match("_\\n|\\r|@_",$str)) { // tjek, at der ikke er \r, \n eller
@ i "navn"
header ("Location: ../blokeret.php");
exit;
}

Mangler der ikke den definition af, hvilket felt, der ikke må indeholde de
tegn?

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Martin (18-01-2007)
Kommentar
Fra : Martin


Dato : 18-01-07 19:41

Erik Ginnerskov wrote:
> if (preg_match("_\\n|\\r|@_",$str)) { // tjek, at der ikke er \r, \n eller

$str skal nok lige laves om til din $_POST["name"], eller hvilket felt
det nu var

Erik Ginnerskov (18-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 18-01-07 18:50

Martin wrote:

> Hvorfor bruge eregi? - Brug da strpos til alle 3, du søger jo bare
> efter et "bogstav/ord" i en variabel
>
> if(
> strpos($_POST["name"],"@")
> ||
> strpos($_POST["name"],"\n")
> ||
> strpos($_POST["name"],"\r")
> )
> {
> // @ \n \r ER fundet
> }

Det blokerer heller ikke, hvor det skal:

if (!empty($_POST['message'])) {
header ("Location: ../blokeret.php");
exit;
} else
if (strpos($_POST["name"],"@")
||
strpos($_POST["name"],"\n")
||
strpos($_POST["name"],"\r")) { // tjek, at der ikke er \r, \n eller @ i
"navn"
header ("Location: ../blokeret.php");
exit;
}

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Martin (18-01-2007)
Kommentar
Fra : Martin


Dato : 18-01-07 19:46

Erik Ginnerskov wrote:
> Martin wrote:
>
>> Hvorfor bruge eregi? - Brug da strpos til alle 3, du søger jo bare
>> efter et "bogstav/ord" i en variabel
>>
>> if(
>> strpos($_POST["name"],"@")
>> ||
>> strpos($_POST["name"],"\n")
>> ||
>> strpos($_POST["name"],"\r")
>> )
>> {
>> // @ \n \r ER fundet
>> }
>
> Det blokerer heller ikke, hvor det skal:

Hovsa... glemte lige at strpos ikke returnerer false eller true - så vi
bruger lige en anden.

if(
strpos($_POST["name"],"@")===FALSE
&&
strpos($_POST["name"],"\r")===FALSE
&&
strpos($_POST["name"],"\n")===FALSE
)
{
echo $test1." er tomt for lala";
} else {
echo "BUUUUUH!! (".$test1.")";
}

Bemærk de 3 === det er vigtigt det er 3!

Bertel Lund Hansen (18-01-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 18-01-07 19:56

Martin skrev:

> Hovsa... glemte lige at strpos ikke returnerer false eller true - så vi
> bruger lige en anden.

Ja, men du behandler stadig de tre tegn ens, og det er forkert. @
skal med, de to andre er i Føtex ... øh jeg mener, de må ikke
være der.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Bertel Lund Hansen (18-01-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 18-01-07 19:47

Erik Ginnerskov skrev:

> Det blokerer heller ikke, hvor det skal:

> if (!empty($_POST['message'])) {
> header ("Location: ../blokeret.php");
> exit;
> } else
> if (strpos($_POST["name"],"@")
> ||
> strpos($_POST["name"],"\n")
> ||
> strpos($_POST["name"],"\r")) { // tjek, at der ikke er \r, \n eller @ i
> "navn"
> header ("Location: ../blokeret.php");
> exit;
> }

Nej, for det skal være NOT sammen med @. Den må jo ikke blokere
hvis man har husket det.

Men du bruger en farlig test når du skriver sådan:

   if (strpos($_POST["name"],"@"))

Den returnerer nemlig et tal der læses som false hvis brugeren
starter med @ (positionen er 0).

Den sikre test kræver tre tegn:

   if (strpos($_POST["name"],"@")===false)

Den returnerer *kun* true hvis brugeren helt undlader at få @
med.

Jeg bruger ellers ofte de farlige tests hvis jeg ved at det ikke
giver problemer, men netop ved strpos() bruger jeg altid tre tegn
fordi den ellers er smadderdrilagtig.

Alternativt kan man indskyde et kunstigt tegn når der testes, men
det er lidt klamp:

   if (strpos('X'.$_POST["name"],"@"))

Den kan ikke returnere 0 for @'s position og kan derfor ikke
returnere et forkert false.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Erik Ginnerskov (18-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 18-01-07 22:26

Erik Ginnerskov wrote:

> Det blokerer heller ikke, hvor det skal:

Øv, det er dummeslag til mig. Det plejer at hjælpe, når det feltnavn, man
tester på, er det samme som navnet på det felt, der faktisk skal testes:

if (strpos($_POST["navn"],"@")
||
strpos($_POST["navn"],"\n")
||
strpos($_POST["navn"],"\r")) { // tjek, at der ikke er \r, \n eller @ i
"navn"
header ("Location: ../blokeret.php");
exit;
}

.... blokerer, hvis der i feltet 'navn' er et '@', men er ligeglad med, om
der er et '\r' eller '\n'.

if (!strpos($_POST['navn'], "@") && // tjek, at der ikke er et @ i "navn"
!eregi("\r",$_POST['navn']) && // tjek, ikke at der er "vogn-retur" i
"navn"
!eregi("\n",$_POST['navn'])) { // tjek, at der ikke er "linjeskift" i
header ("Location: ../blokeret.php");
exit;
}

.... blokerer både for '@' og '\n', så mon ikke også for '\r'?

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Erik Ginnerskov (20-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 20-01-07 22:24

Erik Ginnerskov wrote:

> if (!empty($_POST['message'])) {
> header ("Location: ../blokeret.php");
> exit;
> } else
> if (!strpos($_POST['navn'], "@") && // tjek, ikke et @ i "navn"
> !eregi("\r",$_POST['navn']) && // tjek, ikke "vogn-retur" i "navn"
> !eregi("\n",$_POST['navn'])) { // tjek, ikke "linjeskift" i "navn"
> header ("Location: ../blokeret.php");
> exit;
> }
>
> ... blokerer både for '@' og '\n', så mon ikke også for '\r'?

Øv igen, der var jeg for hurtig. Den konstruktion blokerer for alt, også
det, der ikke skal blokeres.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Bertel Lund Hansen (20-01-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 20-01-07 22:51

Erik Ginnerskov skrev:

> Øv igen, der var jeg for hurtig. Den konstruktion blokerer for alt, også
> det, der ikke skal blokeres.

if (!empty($_POST['message'])) {
   header ("Location: ../blokeret.php");
   exit;
}
else
   if (strpos($_POST['navn'], "@")===false
   || (strpos($_POST['navn'], "\n")===true
   || (strpos($_POST['navn'], "\r")===true) {
      header ("Location: ../blokeret.php");
      exit;
}

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Erik Ginnerskov (20-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 20-01-07 22:57

Bertel Lund Hansen wrote:

> if (!empty($_POST['message'])) {
> header ("Location: ../blokeret.php");
> exit;
> }
> else
> if (strpos($_POST['navn'], "@")===false
>>> (strpos($_POST['navn'], "\n")===true
>>> (strpos($_POST['navn'], "\r")===true) {
> header ("Location: ../blokeret.php");
> exit;
> }

Ikke forstået. Alle tre strenge i feltet 'navn' skal blokeres. Enten skal
alle tre være false eller alle skal være true - så vidt jeg forstår. Du
mangler da også at lukke nogle parenteser.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Bertel Lund Hansen (20-01-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 20-01-07 23:10

Erik Ginnerskov skrev:

> Ikke forstået. Alle tre strenge i feltet 'navn' skal blokeres.

Åh ja, jeg tænkte på en mailadresse. Det skal være det her i
stedet:


   if (strpos($_POST['navn'], "@")===true
   || (strpos($_POST['navn'], "\n")===true
   || (strpos($_POST['navn'], "\r")===true) {
      header ("Location: ../blokeret.php");
      exit;
   }

>Du mangler da også at lukke nogle parenteser.

Nej. Opstillingen er

   if (A || B || C) ...

så der er kun én if der skal lukkes.

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Erik Ginnerskov (20-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 20-01-07 23:12

Bertel Lund Hansen wrote:

>> Du mangler da også at lukke nogle parenteser.
>
> Nej. Opstillingen er
>
> if (A || B || C) ...
>
> så der er kun én if der skal lukkes.

I alle tre linjer har du to venstreparenteser, men kun i nederste linje har
du to højreparenteser. Jeg kan ikke få regnestykket til at gå op.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Bertel Lund Hansen (21-01-2007)
Kommentar
Fra : Bertel Lund Hansen


Dato : 21-01-07 00:12

Erik Ginnerskov skrev:

> I alle tre linjer har du to venstreparenteser, men kun i nederste linje har
> du to højreparenteser. Jeg kan ikke få regnestykket til at gå op.

Alle gode gange 27:

   if (strpos($_POST['navn'], "@")===true
   || strpos($_POST['navn'], "\n")===true
   || strpos($_POST['navn'], "\r")===true) {
      header ("Location: ../blokeret.php");
      exit;
   }

--
Bertel
http://bertel.lundhansen.dk/      http://fiduso.dk/

Erik Ginnerskov (21-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 21-01-07 00:24

Bertel Lund Hansen wrote:

> Alle gode gange 27:
>
> if (strpos($_POST['navn'], "@")===true
> || strpos($_POST['navn'], "\n")===true
> || strpos($_POST['navn'], "\r")===true) {
> header ("Location: ../blokeret.php");
> exit;
> }

Desværre, den stopper ikke noget heller. Men parentesregnskabet stemmer da.


--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Arne Feldborg (21-01-2007)
Kommentar
Fra : Arne Feldborg


Dato : 21-01-07 00:48

Bertel Lund Hansen <unospamo@lundhansen.dk> skrev Sun, 21 Jan 2007
00:12:00 +0100


>Alle gode gange 27:
>
>   if (strpos($_POST['navn'], "@")===true
>   || strpos($_POST['navn'], "\n")===true
>   || strpos($_POST['navn'], "\r")===true) {
>      header ("Location: ../blokeret.php");
>      exit;
>   }
>
Hvis udsagnet er TRUE bliver der returneret en talværdi. Derfor vil din
konstruktion aldrig stoppe noget som helst.

Prøv at nøjes med 2 lighedtegn.



--
mvh, A:\Feldborg

Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/

Erik Ginnerskov (21-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 21-01-07 00:57

Arne Feldborg wrote:

> Prøv at nøjes med 2 lighedtegn.

Så blev den da i stand til at blokere for forekomsten af '@', mens indlæg
med acceptabelt indhold i 'navn' får lov til at passere.

Så skal jeg bare regne ud, hvordan jeg får testet for \n og \r - det nytter
ikke noget at skrive det direkte, det slipper igennem.

Hvis jeg indsætterdette:

Erik
Ginnerskov

.... altså et linjeskift skrevet et andet sted og kopieret over i 'navn', får
det lov til at passere, men kun første linje bliver registreret.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Arne Feldborg (21-01-2007)
Kommentar
Fra : Arne Feldborg


Dato : 21-01-07 15:26

"Erik Ginnerskov" <erik@donotspammeplease.invalid> skrev Sun, 21 Jan
2007 00:57:16 +0100


>> Prøv at nøjes med 2 lighedtegn.
>
>Så blev den da i stand til at blokere for forekomsten af '@', mens indlæg
>med acceptabelt indhold i 'navn' får lov til at passere.
>
Jo, men det er kun en halv løsning. Hvis den søgte karakter står i
første position vil det alligevel gå galt.

>Så skal jeg bare regne ud, hvordan jeg får testet for \n og \r - det nytter
>ikke noget at skrive det direkte, det slipper igennem.
>
For mig at se er det hele konstruktionen der er forkert.

Man bør slet ikke checke på TRUE i den situation, men derimod på FALSE.
Se også manualens beskrivelse af problemstillingen.


--
mvh, A:\Feldborg

Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/

Arne Feldborg (21-01-2007)
Kommentar
Fra : Arne Feldborg


Dato : 21-01-07 15:51

"Erik Ginnerskov" <erik@donotspammeplease.invalid> skrev Sun, 21 Jan
2007 00:57:16 +0100


>Så skal jeg bare regne ud, hvordan jeg får testet for \n og \r - det nytter
>ikke noget at skrive det direkte, det slipper igennem.
>
Prøv at skifte alle tre forekomster af === TRUE ud med !== FALSE det
burde kunne gøre tricket.

Altså noget i den her stil:

if (strpos($_POST['navn'], "@") !== false
   or strpos($_POST['navn'], "\n") !== false
   or strpos($_POST['navn'], "\r") !== false)
{
   echo 'Fy, fy skamme';
}else{
   echo 'Det er ok';
}


Eller måske lidt mere læsevenligt:

if (strpos($_POST['navn'], "@") === false
   and strpos($_POST['navn'], "\n") === false
   and strpos($_POST['navn'], "\r") === false)
{
   echo 'Det er ok';
}else{
   echo 'Fy, fy skamme';
}

Men pas på ikke at blande de to eksempler sammen.!!



--
mvh, A:\Feldborg

Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/

Erik Ginnerskov (21-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 21-01-07 17:47

Arne Feldborg wrote:

> if (strpos($_POST['navn'], "@") !== false
> or strpos($_POST['navn'], "\n") !== false
> or strpos($_POST['navn'], "\r") !== false)
> {
> echo 'Fy, fy skamme';
> }else{
> echo 'Det er ok';
> }

Stopper indlæg ved forekomst af '@', men lader forekomst af linjeskift
(indkopieret [Enter]) passere. Lovlige indlæg passerer.

> if (strpos($_POST['navn'], "@") === false
> and strpos($_POST['navn'], "\n") === false
> and strpos($_POST['navn'], "\r") === false)
> {
> echo 'Det er ok';
> }else{
> echo 'Fy, fy skamme';
> }

Ikke testet, da det vil blive et nummer for besværlig at møblere om på
konsekvenserne. Det vil kræve, at jeg midlertidigt laver et andet script,
der ikke sigter på at indskrive noget i MySql. Jeg vender tilbage.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Erik Ginnerskov (21-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 21-01-07 17:57

Erik Ginnerskov wrote:

>> if (strpos($_POST['navn'], "@") === false
>> and strpos($_POST['navn'], "\n") === false
>> and strpos($_POST['navn'], "\r") === false)
>> {
>> echo 'Det er ok';
>> }else{
>> echo 'Fy, fy skamme';
>> }

<?php
if (!empty($_POST['message'])) {
header ("Location: fejl.php");
exit;
} else
if (strpos($_POST['navn'], "@") === false
|| strpos($_POST['navn'], "\n") === false
|| strpos($_POST['navn'], "\r") === false) {
echo '<p>indtastningen var lovlig</p>';
} else {
header ("Location: fejl.php");
exit;
}
?>

Alt passerer uhindret. ;-(

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Arne Feldborg (21-01-2007)
Kommentar
Fra : Arne Feldborg


Dato : 21-01-07 18:55

"Erik Ginnerskov" <erik@donotspammeplease.invalid> skrev Sun, 21 Jan
2007 17:57:17 +0100


> <?php
> if (!empty($_POST['message'])) {
> header ("Location: fejl.php");
> exit;
> } else
> if (strpos($_POST['navn'], "@") === false
> || strpos($_POST['navn'], "\n") === false
> || strpos($_POST['navn'], "\r") === false) {
> echo '<p>indtastningen var lovlig</p>';
> } else {
> header ("Location: fejl.php");
> exit;
> }
> ?>
>
>Alt passerer uhindret. ;-(
>
Klart nok. Nu har du gjort lige præcist det jeg advarede imod, nemlig
blandet de to forslag sammen.

Bemærk, at det ene forslag bruger === og AND og det andet forslag bruger
!== og OR.

--
mvh, A:\Feldborg

Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/

Erik Ginnerskov (21-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 21-01-07 19:28

Arne Feldborg wrote:
> Klart nok. Nu har du gjort lige præcist det jeg advarede imod, nemlig
> blandet de to forslag sammen.
>
> Bemærk, at det ene forslag bruger === og AND og det andet forslag
> bruger !== og OR.

Ups, den overså jeg. Jeg prøver igen.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Erik Ginnerskov (21-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 21-01-07 19:38

Erik Ginnerskov wrote:

> Jeg prøver igen.

<?php
if (!empty($_POST['message'])) {
header ("Location: fejl.php");
exit;
} else
if (strpos($_POST['navn'], "@") === false
and strpos($_POST['navn'], "\n") === false
and strpos($_POST['navn'], "\r") === false) {
echo '<p>indtastningen var lovlig</p>';
} else {
header ("Location: fejl.php");
exit;
}
?>

'@' bliver stoppet, men indkopieret linjeskift passerer uhindret. Der
mangler måske noget, som kan 'oversætte' det indkopierede linjeskift til
koder, der kan detekteres?

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Arne Feldborg (21-01-2007)
Kommentar
Fra : Arne Feldborg


Dato : 21-01-07 18:55

"Erik Ginnerskov" <erik@donotspammeplease.invalid> skrev Sun, 21 Jan
2007 17:46:31 +0100

>Arne Feldborg wrote:
>
>> if (strpos($_POST['navn'], "@") !== false
>> or strpos($_POST['navn'], "\n") !== false
>> or strpos($_POST['navn'], "\r") !== false)
>> {
>> echo 'Fy, fy skamme';
>> }else{
>> echo 'Det er ok';
>> }
>
>Stopper indlæg ved forekomst af '@', men lader forekomst af linjeskift
>(indkopieret [Enter]) passere. Lovlige indlæg passerer.
>
Så må du lige forklare nærmere hvordan det linieskift rent faktisk ser
ud. Er det feks. allerede på det tidspunkt kørt gennem en nl2br() eller
lign.

Prøv først rutinen for sig selv, før du kilpper det sammen med det du
har i forvejen. Udkommeneter de fire linier herunder een efter een og se
resutatet.

<?php
//$_POST['navn'] = "erik@donotspammeplease.invalid";
//$_POST['navn'] = "Erik \n Ginnerskov";
//$_POST['navn'] = "Erik \r Ginnerskov";
//$_POST['navn'] = "Arne Feldborg";

echo $_POST['navn'];
if (strpos($_POST['navn'], "@") !== false
   or strpos($_POST['navn'], "\n") !== false
   or strpos($_POST['navn'], "\r") !== false)
{
   echo '<br>Fy, fy skamme';
}else{
   echo '<br>Det er ok';
}
exit;
?>

--
mvh, A:\Feldborg

Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/

Erik Ginnerskov (21-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 21-01-07 19:44

Arne Feldborg wrote:

>> Stopper indlæg ved forekomst af '@', men lader forekomst af
>> linjeskift (indkopieret [Enter]) passere.

> Så må du lige forklare nærmere hvordan det linieskift rent faktisk ser
> ud. Er det feks. allerede på det tidspunkt kørt gennem en nl2br()
> eller lign.

Jeg skriver i en teksteditor:

Erik
Ginnerskov

.... kopierer det hele og indsætter det i feltet 'navn'

> Prøv først rutinen for sig selv, før du kilpper det sammen med det du
> har i forvejen. Udkommeneter de fire linier herunder een efter een og
> se resutatet.
>
> [klip kode]

Det prøver jeg senere i aften. Nu har jeg andet at se til den næste times
tid.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Arne Feldborg (22-01-2007)
Kommentar
Fra : Arne Feldborg


Dato : 22-01-07 08:02

"Erik Ginnerskov" <erik@donotspammeplease.invalid> skrev Sun, 21 Jan
2007 19:43:43 +0100


>> Så må du lige forklare nærmere hvordan det linieskift rent faktisk ser
>> ud. Er det feks. allerede på det tidspunkt kørt gennem en nl2br()
>> eller lign.
>
>Jeg skriver i en teksteditor:
>
> Erik
> Ginnerskov
>
>... kopierer det hele og indsætter det i feltet 'navn'
>
Jammen, hov stop nu lige lidt.!!

Det kan man jo ikke gøre i et textfelt, og en bot kan da slet ikke. Og
hvis det overhovedet var muligt ville det iøvrigt blive kodet under
overførslen.

Det du har brug for er, at kunne frasortere forekomster af "\n" og eller
"\r" som er *indsat* direkte i en konstrueret $post[name].

Det kan du med begge de to forslag jeg har sendt dig. Men du kan, efter
min bedste overbevisning, ikke checke det på den måde du gør.


--
mvh, A:\Feldborg

Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/

Erik Ginnerskov (23-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 23-01-07 00:37

Arne Feldborg wrote:

> Det du har brug for er, at kunne frasortere forekomster af "\n" og
> eller "\r" som er *indsat* direkte i en konstrueret $post[name].
>
> Det kan du med begge de to forslag jeg har sendt dig. Men du kan,
> efter min bedste overbevisning, ikke checke det på den måde du gør.

Jeg er helt blank. Nogen forslag til, hvordan jeg kan teste, om det bliver
fanget i reallife?

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Arne Feldborg (23-01-2007)
Kommentar
Fra : Arne Feldborg


Dato : 23-01-07 17:30

"Erik Ginnerskov" <erik@donotspammeplease.invalid> skrev Tue, 23 Jan
2007 00:37:23 +0100


>Jeg er helt blank. Nogen forslag til, hvordan jeg kan teste, om det bliver
>fanget i reallife?
>
Det gør du sådan set bare samme måde som du testede de eksempler jeg
sendte dig.

Hvis du i toppen af dit script har noget al'la dette:

<?php
if (!empty($_POST['message'])) {
header ("Location: fejl.php");
exit;
} else
if (strpos($_POST['navn'], "@") osv. osv.....

Så laver du det bare om til:

<?php
//$_POST['navn'] = "erik@donotspammeplease.invalid";
//$_POST['navn'] = "Erik \n Ginnerskov";
//$_POST['navn'] = "Erik \r Ginnerskov";
//$_POST['navn'] = "Arne Feldborg";
//$_POST['message'] "";
//$_POST['message'] "Dette er en tekst";

if (!empty($_POST['message'])) {
header ("Location: fejl.php");
exit;
} else
if (strpos($_POST['navn'], "@") osv. osv.....


Så udkommneterer du bare linierne enkeltvis. Og når du så affyrerer et
indlæg fra din formular vil den pågældende linie - uanset hvad du har
skrevet i formularen - blive udskiftet med den linie du vil afprøve.

Jeg går ud fra, at det er med fuldt overlæg (spamsikring) du lader
scriptet gå i fejl hvis $_POST['message'] er udfyldt.?


--
mvh, A:\Feldborg

Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/

Erik Ginnerskov (23-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 23-01-07 23:23

Arne Feldborg wrote:

> <?php
> //$_POST['navn'] = "erik@donotspammeplease.invalid";
> //$_POST['navn'] = "Erik \n Ginnerskov";
> //$_POST['navn'] = "Erik \r Ginnerskov";
> //$_POST['navn'] = "Arne Feldborg";
> //$_POST['message'] "";
> //$_POST['message'] "Dette er en tekst";

Den tur har jeg været igennem en gang og konstaterede, at der blev blokeret
for både 1., 2. og 3. linje. Se mit indlæg 21.1. 22:02.

4. og 5. linje vil passere og 6. vil blive blokeret - som jeg ønsker det.

> Jeg går ud fra, at det er med fuldt overlæg (spamsikring) du lader
> scriptet gå i fejl hvis $_POST['message'] er udfyldt.?

Just präcis. Feltet "message" er et textarea, som med css er gjort usynligt
for almindelige brugere. Da spambotter ikke læser css, finder de et felt med
navnet message og fylder et eller andet i - Slam! siger fælden så.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Erik Ginnerskov (21-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 21-01-07 22:03

Arne Feldborg wrote:

$_POST['navn'] = "erik@donotspammeplease.invalid";
//$_POST['navn'] = "Erik \n Ginnerskov";
//$_POST['navn'] = "Erik \r Ginnerskov";
//$_POST['navn'] = "Arne Feldborg";

Indlægget bliver stoppet
____

//$_POST['navn'] = "erik@donotspammeplease.invalid";
$_POST['navn'] = "Erik \n Ginnerskov";
//$_POST['navn'] = "Erik \r Ginnerskov";
//$_POST['navn'] = "Arne Feldborg";

Indlægget bliver stoppet

____

//$_POST['navn'] = "erik@donotspammeplease.invalid";
//$_POST['navn'] = "Erik \n Ginnerskov";
$_POST['navn'] = "Erik \r Ginnerskov";
//$_POST['navn'] = "Arne Feldborg";

Indlægget bliver stoppet

____

//$_POST['navn'] = "erik@donotspammeplease.invalid";
//$_POST['navn'] = "Erik \n Ginnerskov";
//$_POST['navn'] = "Erik \r Ginnerskov";
$_POST['navn'] = "Arne Feldborg";

Indlægget får lov til at passere, her er der heller ikke fejl i feltets
indhold.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Arne Feldborg (20-01-2007)
Kommentar
Fra : Arne Feldborg


Dato : 20-01-07 23:23

Bertel Lund Hansen <unospamo@lundhansen.dk> skrev Sat, 20 Jan 2007
23:10:01 +0100


>Nej. Opstillingen er
>
>    if (A || B || C) ...
>
Men du skriver: if (A || ( B || ( C)

--
mvh, A:\Feldborg

Slægtsforskning og lokalhistorie i midt- vestjylland
http://hammerum-herred.dk/

Erik Ginnerskov (20-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 20-01-07 23:34

Arne Feldborg wrote:

>> Nej. Opstillingen er
>>
>> if (A || B || C) ...
>>
> Men du skriver: if (A || ( B || ( C)

Nu forstår jeg da slet ingenting. Din kode:

if (strpos($_POST['navn'], "@")===true 2 venstre og 1 højre
|| (strpos($_POST['navn'], "\n")===true 2 venstre og 1 højre
|| (strpos($_POST['navn'], "\r")===true) { 2 venstre og 2 højre

Hvis 'if(a || b || c)' skal passe med ovenstående, så mangler der vel i
stedet en venstreparentes i første linje - eller?

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Erik Ginnerskov (20-01-2007)
Kommentar
Fra : Erik Ginnerskov


Dato : 20-01-07 23:41

Erik Ginnerskov wrote:

> Hvis 'if(a || b || c)' skal passe med ovenstående, så mangler der vel
> i stedet en venstreparentes i første linje - eller?

Jeg prøvede denne ændring:

if ((strpos($_POST['navn'], "@"))===true
|| (strpos($_POST['navn'], "\n"))===true
|| (strpos($_POST['navn'], "\r"))===true) {
header ("Location: ../blokeret.php");
exit;
}

.... men så stopper den slet ikke noget. Alt slipper igennem til gæstebogen.

--
Med venlig hilsen
Erik Ginnerskov
http://hjemmesideskolen.dk/ - http://ginnerskov.dk/
http://html-faq.dk



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste