|
Posted by Peter Fox on 11/11/06 09:44
Following on from J.O. Aho's message. . .
>Matthew Wilson wrote:
>> "J.O. Aho" <user@example.net> wrote in message
>> news:4rjiogFrvinbU1@mid.individual.net...
>>
>>> Just add another input of text type (you can name it what ever you want,
>>> say fun), you random two values and make another input of hidden type (you
>>> can call it what ever you want, but not the same as the previous, say
>>> real), then on the script where you receive the form you compare the two
>>> values
>>
>> That's great but a little complex for our needs. The actual capture form is
>> HTML, only the receive script is PHP. Can you offer a simpler version which
>> just expects the number "5" rather than random numbers?
>>
>> Here is the format we follow, and the relevant field that expects a 5 is
>> "human":
>
>The drawback with using a fixed value is that the spammer can adjust his
>script to enter the value 5, so they would have a bit more work if the value
>is random the best is really to store things in a session, show a disorted
>image and ask what it says on it and compare the values from the session and
>from the form.
>
> //Aho
There is another very good reason for generating forms in PHP:
Mr.Spammer's friend finds a suitable form, and passes /the form/ to Mr.
Spammer. Mr. Spammer doesn't sit at IE typing in spam does he? He
hacks the GET or POST request that a browser would send. This is
something that any script-kiddie could do.
So how do you conquer that? It's no good you having
<pseudo code>
// prepare form in PHP
R := Random number
S := SpecialFunction(R)
form.hidden.fieldR := R
form.instruction := Please type S to validate
// validate submitted form in PHP
R := POST[fieldR]
Sform := POST[fieldS]
Sneeded := SpecialFunction(R)
If(Sform <> SNeeded){ // bad form ...
</pseudo code>
Why is this no good? Because the same form can be reused time and time
again where R and S never change from the first time they were served.
So you need to give your forms a 'unique' request number and store that
in the session ready to match with a submitted form. For example:
<pseudo code>
// prepare form in PHP
R := Random number
SESSION[R] := R
S := SpecialFunction(R)
form.hidden.fieldR := R // 'hidden' is cosmetic only
form.instruction := Please type S to validate
// validate submitted form in PHP
Rform := POST[fieldR]
Rneeded := SESSION[R] // fetch from session
ClearFromSessionArray(R) // this is single shot!
if(Rform<>Rneeded){ ... hacking or double submit ...->}
Sform := POST[fieldS]
Sneeded := SpecialFunction(Rneeded)
If(Sform <> SNeeded){ // bad form ...
</pseudo code>
This doesn't deal with other problems especially those who GET the form
fresh each time but you have made a start in the right direction.
--
PETER FOX Not the same since the bridge building business collapsed
peterfox@eminent.demon.co.uk.not.this.bit.no.html
2 Tees Close, Witham, Essex.
Gravity beer in Essex <http://www.eminent.demon.co.uk>
Navigation:
[Reply to this message]
|