ip bannen // enkele vraagjes
Wat ik graag zou willen bereiken: Op mijn site kan de admin entries verwijderen uit het gastenboek. Nu zou ik graag hebben dat als zo'n entry verwijderd wordt, het ip ervan wordt opgeslagen in een tabel. Ik heb dus een tabel 'tblGastenboek' en een tabel 'tblBanned'.
Deze query wordt uitgevoerd indien de admin op de delete-link klikt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
ob_start();
require_once("config/rights.php");
if($_SESSION['level'] == 1) {
$sql = "DELETE FROM tblGastenboek WHERE GastenboekID = " . $_GET['id'] . ";";
if(mysql_query($sql, $link)) {
header("location: gastenboek.php");
} else {
echo mysql_error($link);
}
ob_end_flush();
?>
ob_start();
require_once("config/rights.php");
if($_SESSION['level'] == 1) {
$sql = "DELETE FROM tblGastenboek WHERE GastenboekID = " . $_GET['id'] . ";";
if(mysql_query($sql, $link)) {
header("location: gastenboek.php");
} else {
echo mysql_error($link);
}
ob_end_flush();
?>
Ik zou echter in dit bestand ook nog willen toevoegen dat hij het IP (kolom heet ook zo) uit tblGastenboek in tblBanned (kolom IP) toevoegt.
zoiets dus:
Code (php)
1
2
3
2
3
$sql = "SELECT IP FROM tblGastenboek WHERE GastenboekID=" . $_GET['id'] . ";";
$sql = "INSERT INTO tblBanned SET IP='ip ophalen uit vorige sql';";
$sql = "DELETE FROM tblGastenboek WHERE GastenboekID = " . $_GET['id'] . ";";
$sql = "INSERT INTO tblBanned SET IP='ip ophalen uit vorige sql';";
$sql = "DELETE FROM tblGastenboek WHERE GastenboekID = " . $_GET['id'] . ";";
Zou iemand dit kunnen klaarspelen?
Mijn 2e vraag: is het mogelijk om in je .htaccess de ip-adressen uit de database op te roepen die geblokkeerd moeten worden? of kan je geen php implementeren in je htaccess? iemand raad?
tnx
Probleem 2; je kunt een handler toevoegen; een script dat altijd wordt uitgevoerd van te voren. Of je kunt een htaccess laten genereren door je PHP script met fopen() en dergelijke.
PHPerik schreef op 13.08.2007 15:35:
Probleem 1 snap ik niet. Je kunt toch ook $_SERVER['REMOTE_ADDR'] opnieuw gebruiken in plaats van IP uit tblGastenboek te halen? En anders kun je gewoon mysql_fetch_assoc() gebruiken.
Wel, stel nu:
persoon met ip 1.1.1.1 post iets in het gastenboek. Zijn bericht en IP worden opgeslagen in tblGastenboek. De admin wil dit verwijderen en klikt op de delete-link. wat moet er dan gebeuren? -> entry van persoon 1 moet uit tblGastenboek verwijderd worden, en zijn IP 1.1.1.1 moet in tblBanned toegevoegd worden...
met $_SERVER['REMOTE_ADDR'] haal ja dan toch het ip van de admin op voor in tblBanned te zetten? dit is niet de bedoeling.
PHPerik schreef op 13.08.2007 15:35:
Probleem 2; je kunt een handler toevoegen; een script dat altijd wordt uitgevoerd van te voren. Of je kunt een htaccess laten genereren door je PHP script met fopen() en dergelijke.
Heeft er iemand een voorbeeldscript van zo een gegenereerd htaccess-bestand? Ik vind namelijk niet direct iets.
Dit genereert een lijst van alle gebande ip's:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
require_once("config/dbconnect.php");
$result = mysql_query("SELECT * FROM tblBanned");
while($row = mysql_fetch_array($result))
{
echo "deny from " . $row['IP'];
echo "<br />";
}
?>
require_once("config/dbconnect.php");
$result = mysql_query("SELECT * FROM tblBanned");
while($row = mysql_fetch_array($result))
{
echo "deny from " . $row['IP'];
echo "<br />";
}
?>
Zou iemand dit in zo een fopen-gedoe kunnen steken, want ik vind niet direct iets...
bedankt!
Moderator edit::
Gewijzigd op 01/01/1970 01:00:00 door Jan H
PHP.net! De zoekfunctie op die site doet wonderen...
Quote:
Mijn 2e vraag: is het mogelijk om in je .htaccess de ip-adressen uit de database op te roepen die geblokkeerd moeten worden? of kan je geen php implementeren in je htaccess? iemand raad?
Nee, je zult als je dit wilt met php je htaccess moeten schrijven. Gelukkig is dit niet erg gecompliceerd:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
/*
Dit script periodiek (bijvoorbeeld elke 5 minuten) uitvoeren (via cronjob (linux) of taakplanner (win), vereist php-cli)
create table blocked_ip (
ip varchar(15)
);
*/
$user = "user";
$pass = "pass";
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$myFile = "/pad/naar/.htaccess";
$fh = fopen($myFile, 'w') or die("can't open file");
fwrite($fh, "Order Deny,Allow\n");
foreach ($dbh->query('SELECT ip from blocked_ip') as $row) {
fwrite($fh, "Deny from " . $row["ip"] . "\n");
}
fwrite($fh, "Allow from all\n")
fclose($fh);
?>
/*
Dit script periodiek (bijvoorbeeld elke 5 minuten) uitvoeren (via cronjob (linux) of taakplanner (win), vereist php-cli)
create table blocked_ip (
ip varchar(15)
);
*/
$user = "user";
$pass = "pass";
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$myFile = "/pad/naar/.htaccess";
$fh = fopen($myFile, 'w') or die("can't open file");
fwrite($fh, "Order Deny,Allow\n");
foreach ($dbh->query('SELECT ip from blocked_ip') as $row) {
fwrite($fh, "Deny from " . $row["ip"] . "\n");
}
fwrite($fh, "Allow from all\n")
fclose($fh);
?>
?>
Gewijzigd op 01/01/1970 01:00:00 door Arend a
Code (php)
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
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
<?php
$user="**";
$pass="**";
$dbh=newPDO('mysql:host=mysqlhost;dbname=**',$user,$pass);
$myFile=".htaccess";
$fh=fopen($myFile,'w')ordie("can't open file");
fwrite($fh,"\n#ERROR PAGINAS\n\n");
fwrite($fh,"ErrorDocument 505 http://www.aczele.be/error.php?number=505&on=yes\n");
fwrite($fh,"ErrorDocument 408 http://www.aczele.be/error.php?number=408&on=yes\n");
fwrite($fh,"ErrorDocument 400 http://www.aczele.be/error.php?number=400&on=yes\n");
fwrite($fh,"ErrorDocument 401 http://www.aczele.be/error.php?number=401&on=yes\n");
fwrite($fh,"ErrorDocument 500 http://www.aczele.be/error.php?number=500&on=yes\n");
fwrite($fh,"ErrorDocument 403 http://www.aczele.be/error.php?number=403&on=yes\n");
fwrite($fh,"ErrorDocument 501 http://www.aczele.be/error.php?number=501&on=yes\n");
fwrite($fh,"ErrorDocument 404 http://www.aczele.be/error.php?number=404&on=yes\n");
fwrite($fh,"ErrorDocument 502 http://www.aczele.be/error.php?number=502&on=yes\n");
fwrite($fh,"ErrorDocument 405 http://www.aczele.be/error.php?number=405&on=yes\n");
fwrite($fh,"ErrorDocument 503 http://www.aczele.be/error.php?number=503&on=yes\n");
fwrite($fh,"ErrorDocument 504 http://www.aczele.be/error.php?number=504&on=yes\n");
fwrite($fh,"ErrorDocument 415 http://www.aczele.be/error.php?number=415&on=yes\n");
fwrite($fh,"ErrorDocument 302 http://www.aczele.be/error.php?number=302&on=yes\n");
fwrite($fh,"\n#BANNED\n\n");
fwrite($fh,"Order Deny,Allow\n");
foreach($dbh->query('SELECT IP from tblBanned')as$row){
fwrite($fh,"Deny from ".$row["ip"]."\n");
}
fwrite($fh,"Allow from all\n")
fclose($fh);
?>
$user="**";
$pass="**";
$dbh=newPDO('mysql:host=mysqlhost;dbname=**',$user,$pass);
$myFile=".htaccess";
$fh=fopen($myFile,'w')ordie("can't open file");
fwrite($fh,"\n#ERROR PAGINAS\n\n");
fwrite($fh,"ErrorDocument 505 http://www.aczele.be/error.php?number=505&on=yes\n");
fwrite($fh,"ErrorDocument 408 http://www.aczele.be/error.php?number=408&on=yes\n");
fwrite($fh,"ErrorDocument 400 http://www.aczele.be/error.php?number=400&on=yes\n");
fwrite($fh,"ErrorDocument 401 http://www.aczele.be/error.php?number=401&on=yes\n");
fwrite($fh,"ErrorDocument 500 http://www.aczele.be/error.php?number=500&on=yes\n");
fwrite($fh,"ErrorDocument 403 http://www.aczele.be/error.php?number=403&on=yes\n");
fwrite($fh,"ErrorDocument 501 http://www.aczele.be/error.php?number=501&on=yes\n");
fwrite($fh,"ErrorDocument 404 http://www.aczele.be/error.php?number=404&on=yes\n");
fwrite($fh,"ErrorDocument 502 http://www.aczele.be/error.php?number=502&on=yes\n");
fwrite($fh,"ErrorDocument 405 http://www.aczele.be/error.php?number=405&on=yes\n");
fwrite($fh,"ErrorDocument 503 http://www.aczele.be/error.php?number=503&on=yes\n");
fwrite($fh,"ErrorDocument 504 http://www.aczele.be/error.php?number=504&on=yes\n");
fwrite($fh,"ErrorDocument 415 http://www.aczele.be/error.php?number=415&on=yes\n");
fwrite($fh,"ErrorDocument 302 http://www.aczele.be/error.php?number=302&on=yes\n");
fwrite($fh,"\n#BANNED\n\n");
fwrite($fh,"Order Deny,Allow\n");
foreach($dbh->query('SELECT IP from tblBanned')as$row){
fwrite($fh,"Deny from ".$row["ip"]."\n");
}
fwrite($fh,"Allow from all\n")
fclose($fh);
?>
Ik krijg echter deze error; Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in /opt/www/heuninckr/web/www.aczele.be/a_htaccess.php on line 2
wat gaat er hier fout?
Heb je php 5.0 of later geinstalleerd? Ik heb in mijn voorbeeld PDO gebruikt uit educatieve doeleinden maar nog niet alle hosts ondersteunen dit.
Arend schreef op 14.08.2007 12:08:
Heb je php 5.0 of later geinstalleerd? Ik heb in mijn voorbeeld PDO gebruikt uit educatieve doeleinden maar nog niet alle hosts ondersteunen dit.
neen, php 4. maar ik kan der server upgraden naar php5. maar zullen alle scripts dan wel nog werken?
Zie ook de migratie-handleiding.
Edit: Zie ook deze link voor PDO in PHP versie 4.
Heb er zelf nooit mee gewerkt, geef dus geen enkele garantie ;)
Gewijzigd op 01/01/1970 01:00:00 door Frank -
ik heb nu php5, maar nu krijg ik HTTP-FOUT 500: INTERNAL SERVER ERROR
Ik heb in mijn gastenboek nu een extra admin-link 'ban'. met deze link wordt het gastenboekID meegestuurd naar dit script:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
ob_start();
require_once("config/rights.php");
if($_SESSION['level'] == 1) {
$sql = "SELECT IP FROM tblGastenboek WHERE GastenboekID = " . $_GET['id'] . ";";
$result = mysql_query($sql) or die(mysql_error());
$ip = mysql_fetch_array($result);
$sql2 = "INSERT INTO tblBanned SET IP='$ip';";
if(mysql_query($sql2, $link)) {
header("location: gastenboek.php");
} else {
echo mysql_error($link);
}
ob_end_flush();
?>
<?php } ?>
ob_start();
require_once("config/rights.php");
if($_SESSION['level'] == 1) {
$sql = "SELECT IP FROM tblGastenboek WHERE GastenboekID = " . $_GET['id'] . ";";
$result = mysql_query($sql) or die(mysql_error());
$ip = mysql_fetch_array($result);
$sql2 = "INSERT INTO tblBanned SET IP='$ip';";
if(mysql_query($sql2, $link)) {
header("location: gastenboek.php");
} else {
echo mysql_error($link);
}
ob_end_flush();
?>
<?php } ?>
Ik krijg echter in mijn database ipv het IP, gewoon 'array'. Ziet iemand de fout? En hoe kan ik dit beter doen, want de code ziet er helemaal niet uit vind ik :) Maar mijn php-kennis is echter te beperkt om dit beter te scripten. maar ik ben bereid bij te leren van jullie :')
Moderator edit::
Gewijzigd op 01/01/1970 01:00:00 door Jan H
Quote:
Ik krijg echter in mijn database ipv het IP, gewoon 'array'.
De INSERT-query:
En waar komt $ip vandaan?
Tja, wanneer jij de complete array $ip in de query opneemt, dan is het niet zo gek dat je 'array' in de database krijgt...
$ip['IP'] zal een stuk beter werken dan $ip.
Offtopic: Gebruik geen hoofdletters voor tabel- en/of kolomnamen in de database. Dat gaat vroeg of laat fout.
pgFrank schreef op 14.08.2007 13:21:
$ip['IP'] zal een stuk beter werken dan $ip.
?
Zo dan?
dit werkt niet echt
Sorry, maar ik kan niet echt mee :(
Quote:
Dat is jouw probleem, dan mag jij gaan debuggen.dit werkt niet echt
Ik wel best een voorzetje geven, de $ip die niet goed is, maar jij mag gaan uitzoeken hoe het dan wél inelkaar steekt. Ik heb namelijk geen flauw idee wat er bij jou op het beeldscherm staat!
Wat levert dit op? Hiermee echo je de array $ip en krijg je exact te zien wat er nu in deze array staat. Vervolgens pak je het juiste element uit deze array en die stop je in de query. Niks moeilijks aan, maar je moet het wel gestructureerd aanpakken.
Als ik dan met de print_r functie de variabele $ip uitschrijf, krijg ik dit terug "Array ( [0] => 56.0.84.24 )".
Hoe gebruik ik deze waarde dan in mijn volgende query?
$sql2 = "INSERT INTO tblBanned SET IP='$ip[IP]';";
dit werkt niet, want dan schrijft hij geen waarde in de database als IP.
edit: blijkbaar moest ik gewoon $ip[0] gebruiken. Het werkt nu. Al weet ik niet of dit nu de properste oplossing is...
Gewijzigd op 01/01/1970 01:00:00 door Jan H
Quote:
Array ( [0] => 56.0.84.24 )
Dus een array met slechts 1 key, namelijk key 0
De array $ip met de key IP (die verkeerd is genoteerd, quotes ontbreken).
Dat zijn dus verschillende dingen.
Wanneer je een probleem hebt, moet je dat gestructureerd gaan oplossen. Even overstappen op een andere fetch-functie gaat je echt niet helpen, dat zorgt voor nog meer verwarring, niet doen dus. Maak voor al jouw scripts 1 keuze voor de fetch-functie en ga niet voor de ene query een fetch_assoc gebruiken en voor de andere een fetch_row. Dit gaat gegarandeerd verkeerd.
Ps. De INSERT-query lijkt ook nergens op, dit is geen SQL-standaard. Nu is een standaard niet verplicht, maar voorkomt wel een hoop ellende.
pgFrank schreef op 14.08.2007 12:14:
Als jij in versie 4 al veilig programmeert, dan is het vrijwel zeker dat in versie 5 de boel ook werkt. Er zijn namelijk niet al te veel verschillen.
Zie ook de migratie-handleiding.
Edit: Zie ook deze link voor PDO in PHP versie 4.
Heb er zelf nooit mee gewerkt, geef dus geen enkele garantie ;)
Zie ook de migratie-handleiding.
Edit: Zie ook deze link voor PDO in PHP versie 4.
Heb er zelf nooit mee gewerkt, geef dus geen enkele garantie ;)
Is er geen andere manier om dit te doen? server staat nu op php5 (volgens priorweb (=host) toch, en het script werkt nog steeds niet. Ik krijg steeds een internal server error.
Zie PHP_INFO of PDO wel beschikbaar is (moet worden geactiveerd). Vraag anders de provider even, die weet het ook wel.
pgFrank schreef op 14.08.2007 16:05:
Zie PHP_INFO of PDO wel beschikbaar is (moet worden geactiveerd). Vraag anders de provider even, die weet het ook wel.
phpinfo:
PDO support enabled
PDO drivers mysql
Het script zou dus moeten werken, maar doet het dus niet :/
Jan H schreef op 14.08.2007 16:24:
phpinfo:
PDO support enabled
PDO drivers mysql
Het script zou dus moeten werken, maar doet het dus niet :/
pgFrank schreef op 14.08.2007 16:05:
Zie PHP_INFO of PDO wel beschikbaar is (moet worden geactiveerd). Vraag anders de provider even, die weet het ook wel.
phpinfo:
PDO support enabled
PDO drivers mysql
Het script zou dus moeten werken, maar doet het dus niet :/
up :)