[PHP] Session enkel verwijderd bij sluiten FF

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • fanatic_david
  • Registratie: Augustus 2004
  • Laatst online: 15-09 12:01

fanatic_david

It's Britney, b*tch!

Topicstarter
Om het spammen via een form op mijn website (dmv refresh of back & re-submit) tegen te gaan ben ik gebruik gaan maken van sessions die een counter bijhouden. Deze counter beperkt het aantal submissions tot 2. En vermits het mogelijk is dat bezoekers het accepteren van cookies af hebben staan, heb ik er dan ook voor gekozen geen cookies te gebruiken voor mijn sessions. Dit heb ik gedaan dmv volgende code:

In .htaccess:
code:
1
2
php_flag session.use_cookies off
php_flag session.use_trans_sid on

In php:
PHP:
1
ini_set('session.use_trans_sid', true);

In zowel IE, als FF, als Opera kan ik de form effectief 2x submitten, daarna krijg ik een melding. Dit is dus naar wens. Als ik FF nu sluit en opnieuw open kan ik de form opnieuw 2x submitten (zo wil ik het ook) maar in IE en Opera krijg ik meteen die melding. Het lijkt mij dus dat bij het sluiten van IE en Opera de variabele en ook de session blijven bestaan.

Doe ik iets verkeerd? Is dit op te lossen?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Kun je in php.ini niet ook de lifetime van je sessioncookie aanpassen?

Trouwens, waarom hou je niet in je database het IP bij van degene die de post maakt? Op die manier kun je kijken of er de afgelopen X minuten een post is geweest vanaf dat IP, en zo ja, de nieuwe post niet accepteren. Lijkt me hiervoor handiger dan het gebruik van sessies. :)

[ Voor 3% gewijzigd door NMe op 09-12-2005 00:03 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • fanatic_david
  • Registratie: Augustus 2004
  • Laatst online: 15-09 12:01

fanatic_david

It's Britney, b*tch!

Topicstarter
-NMe- schreef op vrijdag 09 december 2005 @ 00:03:
Trouwens, waarom hou je niet in je database het IP bij van degene die de post maakt? Op die manier kun je kijken of er de afgelopen X minuten een post is geweest vanaf dat IP, en zo ja, de nieuwe post niet accepteren. Lijkt me hiervoor handiger dan het gebruik van sessies. :)
Ja, ik wil die oplossing best wel overwegen maar het probleem is dat ik maar in heel beperkte mate heb gezien hoe je via PHP gebruik maakt van een MySQL databank :(. Bovendien ken ik wel wat van SQL maar na ff in phpMyAdmin te hebben rondgekeken lijkt MySQL mij daar toch vrij erg van te verschillen :'(

[ Voor 19% gewijzigd door fanatic_david op 09-12-2005 00:43 ]


Acties:
  • 0 Henk 'm!

  • fanatic_david
  • Registratie: Augustus 2004
  • Laatst online: 15-09 12:01

fanatic_david

It's Britney, b*tch!

Topicstarter
Iemand nog opmerkingen of suggesties? Alles is welkom ;)

Acties:
  • 0 Henk 'm!

Verwijderd

-NMe- schreef op vrijdag 09 december 2005 @ 00:03:
Trouwens, waarom hou je niet in je database het IP bij van degene die de post maakt? Op die manier kun je kijken of er de afgelopen X minuten een post is geweest vanaf dat IP, en zo ja, de nieuwe post niet accepteren. Lijkt me hiervoor handiger dan het gebruik van sessies. :)
Juist niet; Een IP is (client) sessie gebonden. De logische plaats is dus je webserver sessie. Geen reden om je database te misbruiken.

Acties:
  • 0 Henk 'm!

  • Arto
  • Registratie: November 2005
  • Laatst online: 20-09 21:40
database connectie maken
PHP:
4
5
6
7
8
9
10
11
12
<?
$host = "localhost";
$username = "rozenga";
$password = "X2thetrea";
$database = "rozenga";

$db = mysql_connect($cfg['host'], $cfg['username'], $cfg['password']) or die;
mysql_select_db($cfg['database']) or die("Couldn't select database '".$cfg['database']."'.");
?>


dan een insert in de databse doen alsvolgt
PHP:
4
5
6
7
<?
$SQL = "INSERT INTO `extrea_links` (`IP`, `time`) VALUES ('".$_SERVER['REMOTE_ADDR']."'," . date('d-m-Y') . ");";
@mysql_query($SQL);
?>


oja, niet te vergeten de eerste SQL Query om de database te bouwen :-P

PHP:
4
5
6
7
8
CREATE TABLE `log` (
`ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`IP` VARCHAR(15) NOT NULL,
`date` VARCHAR(9) NOT NULL
);


zoiets? :)
om uit te lezen kun je trouwens dit gebruiken
PHP:
4
5
6
7
8
9
10
<?
$SQL = "SELECT * FROM `rs_errorlog` WHERE `IP`='" . $_SERVER['REMOTE_ADDR'] . "';";
$query = myqsl_query($SQL);
while($data =myqsl_fetch_array($query))
{
    $echo $data['IP'];
}


probeer eens iets nieuws uit, kan nooit kwaad :-P

Acties:
  • 0 Henk 'm!

  • fanatic_david
  • Registratie: Augustus 2004
  • Laatst online: 15-09 12:01

fanatic_david

It's Britney, b*tch!

Topicstarter
Verwijderd schreef op vrijdag 09 december 2005 @ 13:04:
[...]
Juist niet; Een IP is (client) sessie gebonden. De logische plaats is dus je webserver sessie. Geen reden om je database te misbruiken.
Ik kan mij vergissen maar heb je het daar niet over het ID dat door de sessie wordt aangemaakt en niet over het IP!?
artorozenga schreef op vrijdag 09 december 2005 @ 15:51:
database connectie maken
[...]

dan een insert in de databse doen alsvolgt
[...]

oja, niet te vergeten de eerste SQL Query om de database te bouwen :-P
[...]

zoiets? :)
om uit te lezen kun je trouwens dit gebruiken
[...]

probeer eens iets nieuws uit, kan nooit kwaad :-P
Thx, deze zal me zeker op weg helpen 8) ! Maar ik heb vandaag zo zitten denken. Op het ogenblik dat een bezoeker de form succesvol submit zou ik zijn IP en de datum met tijdstip aan de databank toevoegen, dit om te voorkomen dat hij opnieuw kan submitten. Deze entry zou ik dan bijvoorbeeld 5 minuten later terug uit de db willen verwijderen om zo de blokkering terug op te heffen. Is dit mogelijk? En zo ja, kan ik dan niet het IP als primary key instellen of is het noodzakelijk/aan te raden een ID te gebruiken?

Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 07:32
Wat ik altijd doe in zo'n geval (het tegengaan van dubbel posten) en ik weet dat het niet 100% tegen spammers werkt, maar goed :

Ik maak in het form om een bericht te posten een HIDDEN input veld aan, waarin ik een unieke code zet (bijvoorbeeld timestamp, of md5 daarvan ofzo), deze sla ik bij het bericht op in de database.

Voordat ik een bericht opsla in de database kijk ik dus of die unieke code al in de database staat, zo ja : dan geef ik een error en zo niet, dan sla ik hem op :D

[ Voor 5% gewijzigd door sorted.bits op 10-12-2005 08:48 ]


Acties:
  • 0 Henk 'm!

  • fanatic_david
  • Registratie: Augustus 2004
  • Laatst online: 15-09 12:01

fanatic_david

It's Britney, b*tch!

Topicstarter
sorted.bits schreef op zaterdag 10 december 2005 @ 08:48:
Wat ik altijd doe in zo'n geval (het tegengaan van dubbel posten) en ik weet dat het niet 100% tegen spammers werkt, maar goed :

Ik maak in het form om een bericht te posten een HIDDEN input veld aan, waarin ik een unieke code zet (bijvoorbeeld timestamp, of md5 daarvan ofzo), deze sla ik bij het bericht op in de database.

Voordat ik een bericht opsla in de database kijk ik dus of die unieke code al in de database staat, zo ja : dan geef ik een error en zo niet, dan sla ik hem op :D
Bedankt voor je suggestie maar het is mij ondertussen al gelukt. Wanneer een bezoeker op mijn site de form invult en submit en dit in de 5 minuten die volgen nog eens probeert krijgt hij de melding dat hij nog zoveel tijd moet wachten vooraleer opnieuw te kunnen submitten. Dit doe ik door het IP van de submitter en het tijdstip van de submit naar de db weg te schrijven. Staat een bezoeker zijn IP nog niet in de db, dan mag hij zowieso submitten, in het andere geval wordt gechecked dat zijn vorige submit minstens 5 minuten geleden was.

Acties:
  • 0 Henk 'm!

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 27-02 23:46
artorozenga schreef op vrijdag 09 december 2005 @ 15:51:
database connectie maken
PHP:
4
5
6
<?
# Database dinges hier ( Slecht voor de layout ;) )
?>
offtopic:
Als ik dit stukje lees begin ik even te twijfelen.
Eerst is het $host, dan $cfg['host'], een duidelijk verschil niet?

Fix dat eens even, anders komt daar ook een topic over :+

[ Voor 35% gewijzigd door SH4D3H op 10-12-2005 22:53 ]


Acties:
  • 0 Henk 'm!

  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 25-07 07:34

wizzkizz

smile...tomorrow will be worse

en wat nou als ik samen met een x-duizend mensen achter 1 proxy zit (bedrijf, universiteit, publieke proxy or whatever)? de aanvragen komen dan allemaal van het IP van de proxy.

Als ik jou was, zou ik eerder het unieke sessie-id gebruiken dat de webserver voor elke sessie aanmaakt en dat opslaan.

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


Acties:
  • 0 Henk 'm!

  • fanatic_david
  • Registratie: Augustus 2004
  • Laatst online: 15-09 12:01

fanatic_david

It's Britney, b*tch!

Topicstarter
wizzkizz schreef op zondag 11 december 2005 @ 16:43:
en wat nou als ik samen met een x-duizend mensen achter 1 proxy zit (bedrijf, universiteit, publieke proxy or whatever)? de aanvragen komen dan allemaal van het IP van de proxy.

Als ik jou was, zou ik eerder het unieke sessie-id gebruiken dat de webserver voor elke sessie aanmaakt en dat opslaan.
Ik heb nu een db in gebruik genomen net om geen sessies meer te hoeven gebruiken, dus dat laatste is niet echt een oplossing. En je reactie daarvoor is wel terecht maar maakt niet zoveel uit om volgende redenen:
- het betreft maar een feedback formulier dus ik verwacht mij niet echt aan talrijke submissions
- mochten nu 2 of meerdere gebruikers achter hetzelfde ip "tegelijkertijd" willen submitten, dan is de wachttijd hooguit 5 minuten.
Ik wil gerust wel een ander criterium nemen, als het maar geen session ID is of de waarde van een hidden form element. Suggesties?

Acties:
  • 0 Henk 'm!

  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 25-07 07:34

wizzkizz

smile...tomorrow will be worse

David_Britney schreef op maandag 12 december 2005 @ 00:01:
[...]
Ik heb nu een db in gebruik genomen net om geen sessies meer te hoeven gebruiken, dus dat laatste is niet echt een oplossing. En je reactie daarvoor is wel terecht maar maakt niet zoveel uit om volgende redenen:
- het betreft maar een feedback formulier dus ik verwacht mij niet echt aan talrijke submissions
- mochten nu 2 of meerdere gebruikers achter hetzelfde ip "tegelijkertijd" willen submitten, dan is de wachttijd hooguit 5 minuten.
Ik wil gerust wel een ander criterium nemen, als het maar geen session ID is of de waarde van een hidden form element. Suggesties?
Je zou evt. het ip-adres kunnen combineren met de user-agent en daar dan een hash van trekken ofzo, maar ik betwijfel of dat veel nut heeft voor 'gestandaardiseerde' omgevingen, zoals bedrijfsnetwerken. Voor een publieke proxy zou je hiermee wel iets winnen, nl. dat de kans op een match van ip+ua kleiner is dan de kans op alleen een ip-match.

[edit]
oh ja, hoewel je je sessie-info niet meer gebruikt, blijven deze natuulijk wel aanwezig op de server. Ik snap eigenlijk ook niet dat het hiermee fout gaat, want bij mij (dev-omgeving, maar maakt niet uit) worden bij alle browsers die ik gebruikt de sessie-gegevens opgeruimd wanneer ik de browser sluit, ook bij IE, opera etc.

[ Voor 17% gewijzigd door wizzkizz op 12-12-2005 08:50 ]

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


Acties:
  • 0 Henk 'm!

Verwijderd

David_Britney schreef op vrijdag 09 december 2005 @ 19:14:
Ik kan mij vergissen maar heb je het daar niet over het ID dat door de sessie wordt aangemaakt en niet over het IP!?
Je vergist je inderdaad ;) Ik heb het over de client IP sessie (ook wel ip lease). Deze lease is in deze case enkel interessant binnen de browser sessie.
Pagina: 1