Avatar billede inctor Nybegynder
15. juni 2006 - 13:51 Der er 40 kommentarer og
1 løsning

Ip Ban Expire.

HeeJ ..
Udfra disse spørgsmål her:
http://www.eksperten.dk/spm/715482
http://www.eksperten.dk/spm/715471

Har jeg fået lavet mig et Ip Bannings system i ASP med slet funktion, nu skal jeg have lavet en Tilføj funktion, det kunne jeg godt selv lave, men jeg skal have lagt en expire kode på, så jeg kan sige, at han skal være bannet i en uge .. eller længere eller kortere tid .. Har prøvet at kigge på nogen andre ASP Banning systemer, og prøvet at gennemskue hvorn man gør, men det er ikke lykkedes for mig .. Så håber på i kan hjælpe mig med et Expire system ..
Avatar billede fennec Nybegynder
15. juni 2006 - 14:21 #1
Det er jo bare at smide en endDate med på tabellen:

insert into banned(IP, endDate) values('aa.bb.cc.dd',date()+7)

Når du så tjekker for banned vælger du kun dem med en nyere dato

set rs = conn.execute("select * from banned where IP='aa.aa.aa.aa' and endDate<=date()")"
if not rs.eof then
  response.write "Banned"
  response.end
end if
Avatar billede fennec Nybegynder
15. juni 2006 - 14:23 #2
Fik lige vendt betingelsen forkert, samt en skrive fejl :o)

set rs = conn.execute("select * from banned where IP='aa.aa.aa.aa' and endDate>=date()")
Avatar billede inctor Nybegynder
15. juni 2006 - 14:27 #3
Ja men hvis jeg så prøver at lave en Response.Write der hedder:

Response.Write " " & date()+7 & " "

Så kommer der til at stå 22 .. Men hvis jeg sætter den til dato den  28 foreksempel og siger han skal expire den den  4 i næste måned, så kommer der jo til at stå i date response 35 og ikk den 4 .. :S Eller hvad ?
Avatar billede fennec Nybegynder
15. juni 2006 - 14:47 #4
Nej, den ved udemærket godt at date() er en dato så den bliver sat til datoen 7 dage senere. Disse to kald giver samme resultat:
dato = dateadd("d",7,date())
dato = date()+7
Avatar billede inctor Nybegynder
15. juni 2006 - 15:08 #5
Hva så hvis det er en time ? eller 10 timer ?
Avatar billede fennec Nybegynder
15. juni 2006 - 15:29 #6
Så skal du over og bruge dateadd og now() (for at få timer/min med). Pluds kaldet er kun en genvej til at lægge dage til/fra:

dato = dateadd("h",10,now())
Avatar billede inctor Nybegynder
15. juni 2006 - 16:07 #7
dvs. Jeg skal lave If Statements for det antal Bannings gange jeg skal ha ? har:
1Time, 10 Timer, 1 dag, 7 dage, 1 måned, 6 måneder, 1 år og for altid .. Hvorn kommer koden så til at se ud ? altså den som skal indsætte dataerne ..
Avatar billede inctor Nybegynder
15. juni 2006 - 16:20 #8
mdb filen hedder ban.mdb .. og tabellen hedder Bannings, i den er der id(autoincrement), ip, expire, dato,besked,hvem ...
Avatar billede fennec Nybegynder
15. juni 2006 - 16:36 #9
expire er det en henvisning til 1 Time, 10 Timer, 1 dag...??

For nemhedens skyld ville jeg gemme en banExpireDate dato. Så bliver det MEGET nemmere at trække ud.
Avatar billede inctor Nybegynder
15. juni 2006 - 19:01 #10
Altså hvis jeg sætter Expire til 10 timer, så skal den sætte i Expire feltet, tiden nu + 10 timer, og han kan ikk komme ind på siden før at der er gået de 10 timer .. På den måde..
Avatar billede fennec Nybegynder
16. juni 2006 - 09:05 #11
Nemlig.
Avatar billede inctor Nybegynder
16. juni 2006 - 09:41 #12
dvs.

if date() > " & rs("expire") & " Then
adgang=ok
End If

if date() < " & rs("expire") & " Then
adgang=ikke ok
End If

er det sån det skal laves ?
Avatar billede fennec Nybegynder
16. juni 2006 - 09:49 #13
Jeps.
Avatar billede fennec Nybegynder
16. juni 2006 - 09:52 #14
Men i stedet for at lave tjekket i ASP, smider du det ind i selecten som et kriterie:
set rs = conn.execute("select * from dinTabel where now()<=expire ...")

Også skal du bruge now() i stedet da date() ikke har klokkeslet med.
Avatar billede inctor Nybegynder
16. juni 2006 - 10:39 #15
Hmm .. Det er jo bare tjekket til om man er bannet .. Hvorn skal det så se ud når jeg tilføjer ? Når jeg har 1 time, 10 timer, 1 døgn, 7 døgn, 1 måned, 6 måneder og 1 år og for altid ..
Avatar billede fennec Nybegynder
16. juni 2006 - 10:57 #16
Det har du vel i en dropbown også beregner du bare datoen/tiden:

if request.form("banTime") = "1" then
  banTime = dateadd("h",1,now())
elseif request.form("banTime") = "2" then
  banTime = dateadd("h",10,now())
elseif request.form("banTime") = "3" then
  banTime = dateadd("d",1,now())
elseif request.form("banTime") = "4" then
  banTime = dateadd("d",7,now())
...
Avatar billede inctor Nybegynder
16. juni 2006 - 12:35 #17
Hmm .. Er kommet frem til det her: ved ikk om det er helt galt i byen ellers må i lige rette mig.. :)
Avatar billede inctor Nybegynder
16. juni 2006 - 12:38 #18
############################################################

HTML siden:

############################################################
<html>

<head>
<meta http-equiv="Content-Language" content="da">
<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Ban En IP</title>
</head>

<body>

<form method="GET" action="banip.asp?from=<% " & request.form("from") & " %>">
  IP:<br>
  <input type="text" name="ip" size="20"></p>
  <p>Årsag:<br>
  <textarea rows="2" name="reason" cols="20"></textarea></p>
  <p>Hvor Længe:<br>
  <select size="1" name="D1">
  <option value="1">1 Time</option>
  <option value="2">10 Timer</option>
  <option value="3">1 Dag</option>
  <option value="4">7 Dage</option>
  <option value="5">1 Måned</option>
  <option value="6">6 Måneder</option>
  <option value="7">For Altid</option>
  </select></p>
  <p><input type="submit" value="Ban IP" name="B1"></p>
</form>

</body>

</html>

####################################################################

banip.asp

####################################################################

<%
MyDay = Day(Now)
MyMonth = Month(Now)
MyHour = Hour(Now)
MyMinute = Minute(Now)
MySecond = Second(Now)
If len(MyDay) < 2 then strD = "0" else strD = "" end if
If len(MyMonth) < 2 then strM = "0" else strM = "" end if
If len(MyHour) < 2 then strH = "0" else strH = "" end if
If len(MyMinute) < 2 then strMi = "0" else strMi = "" end if
If len(MySecond) < 2 then strS = "0" else strS = "" end if
strLigeNu = strD & Day(Now) & "-" & strM & Month(Now) & "-" & Year(Now) & " " & strH & Hour(Now) & ":" & strMi & Minute(Now) & ":" & strS & Second(Now)
strLigeNow = strD & Day(Now) & "-" & strM & Month(Now) & "-" & Year(Now)

if request.form("banTime") = "1" then
  banTime = dateadd("h",1,now())
elseif request.form("banTime") = "2" then
  banTime = dateadd("h",10,now())
elseif request.form("banTime") = "3" then
  banTime = dateadd("d",1,now())
elseif request.form("banTime") = "4" then
  banTime = dateadd("d",7,now())
elseif request.form("banTime") = "5" then
  banTime = dateadd("d",31,now())
elseif request.form("banTime") = "6" then
  banTime = dateadd("d",186,now())
elseif request.form("banTime") = "7" then
  banTime = dateadd("d",999999999999999,now())
End If

Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("database/ban.mdb")
Conn.Open DSN

strSQL = "INSERT INTO banning ip,reason,dato,expire,from VALUES('request.form("ip")','request.form("reason")','strLigeNu','banTime','request.form("from")')"
Conn.Execute(strSQL)
%>

################################

koder slut

################################

Er jeg gået helt forkert i byen ?
Avatar billede fennec Nybegynder
16. juni 2006 - 13:07 #19
Få desværre nok ikke tid til at kikke på dette før efter weekenden. Hvis du ikke selv har fundet ud af noget inden da, så smid lige en kommentar herinde, så jeg får en mail, da jeg ellers nok har glemt alt om ?'et.
Avatar billede inctor Nybegynder
16. juni 2006 - 13:42 #20
heeh, det haster heller ikke så meget igen .. jeg får heller ikk tid i weekenden .. :) SKal nok smide en kommentar søndag eller Mandag .. :)
Avatar billede inctor Nybegynder
18. juni 2006 - 22:46 #21
Så Fennec .. Ved ikk om du har glemt det nu .. Men så smider jeg ihvetfald lige en kommentar ...  :P
Avatar billede inctor Nybegynder
19. juni 2006 - 00:59 #22
Hmm .. har ændret i koden og nu er den således her:
<%
DataPath = Server.MapPath("database/ban.mdb")

  Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & DataPath & ";Password=MIN KODE !"
MyDay = Day(Now)
MyMonth = Month(Now)
MyHour = Hour(Now)
MyMinute = Minute(Now)
MySecond = Second(Now)
If len(MyDay) < 2 then strD = "0" else strD = "" end if
If len(MyMonth) < 2 then strM = "0" else strM = "" end if
If len(MyHour) < 2 then strH = "0" else strH = "" end if
If len(MyMinute) < 2 then strMi = "0" else strMi = "" end if
If len(MySecond) < 2 then strS = "0" else strS = "" end if
strLigeNu = strD & Day(Now) & "-" & strM & Month(Now) & "-" & Year(Now) & " " & strH & Hour(Now) & ":" & strMi & Minute(Now) & ":" & strS & Second(Now)
strLigeNow = strD & Day(Now) & "-" & strM & Month(Now) & "-" & Year(Now)

if request.form("banTime") = "1" then
  banTime = dateadd("h",1,now())
elseif request.form("banTime") = "2" then
  banTime = dateadd("h",10,now())
elseif request.form("banTime") = "3" then
  banTime = dateadd("d",1,now())
elseif request.form("banTime") = "4" then
  banTime = dateadd("d",7,now())
elseif request.form("banTime") = "5" then
  banTime = dateadd("d",31,now())
elseif request.form("banTime") = "6" then
  banTime = dateadd("d",186,now())
elseif request.form("banTime") = "7" then
  banTime = dateadd("d",999999999999999,now())
End If

strSQL = "INSERT INTO banning ("

strSQL = strSQL & "ip, "
strSQL = strSQL & "reason, "
strSQL = strSQL & "dato, "
strSQL = strSQL & "expire, "
strSQL = strSQL & "from) "

strSQL = strSQL & "values( "

strSQL = strSQL & "'" & Request.Form("ip") &  "', "
strSQL = strSQL & "'" & Request.Form("reason") & "', "
strSQL = strSQL & "'" & strLigeNu & "', "
strSQL = strSQL & "'" & banTime & "', "
strSQL = strSQL & "'" & Request.Form("from") &  "')"
Conn.Execute(strSQL)

Response.Write "Så er IP'en Bannet .."
%>

Men den siger fejl ..
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Syntax error in INSERT INTO statement.

/banip.asp, line 50
Avatar billede fennec Nybegynder
19. juni 2006 - 08:48 #23
"from" er et reserveret ord i sql og skal omdøbes eller omkrandses med [].

Datoer i Access skal omkrandses af # og formateres til mm-dd-yyyy. Til det får du disse to funktioner. Den ene laver datoer uden klokkeslet, og den anden med klokkeslet (uden sek):

Function ConvertToSqlDate(fDato)
dim SQLYear,SQLMonth,SQLDay
  SQLYear = Year(fDato)
  SQLMonth = Month(fDato)
  SQLDay = Day(fDato)
  SQLDay = right("0"&SQLDay, 2)
  SQLMonth = right("0"&SQLMonth, 2)
  ConvertToSqlDate = "#"& SQLMonth&"-"&SQLDay&"-"&SQLYear &"#"
End Function

Function ConvertToSqlDatetime(fDato)
dim SQLYear,SQLMonth,SQLDay,SQLHour,SQLMinute
  SQLYear = Year(fDato)
  SQLMonth = Month(fDato)
  SQLDay = Day(fDato)
  SQLHour = Hour(fDato)
  SQLMinute = minute(fDato)
  SQLDay = right("0"&SQLDay, 2)
  SQLMonth = right("0"&SQLMonth, 2)
  SQLHour = right("0"&SQLHour, 2)
  SQLMinute = right("0"&SQLMinute, 2)
  ConvertToSqlDatetime = "#"& SQLMonth&"-"&SQLDay&"-"&SQLYear&" "&SQLHour&":"&SQLMinute &"#"
End Function

Læg mærke til at # er med i funktionen, så skifter du til MS-SQL eller MySQL engang skal du bare ændre funktionerne til den nye angivelse (' som alle andre DB bruger) og format (yyyymmdd eller yyyy-mm-dd)

Brug måned og år angivelse i din elseif på de sidste 3 i stedet for dage.

strLigeNu og strLigeNow kan angives direkte med now() og date() i stedet for de linjer du har nu.

Hele din side bliver derfor til:

Function ConvertToSqlDate(fDato)
dim SQLYear,SQLMonth,SQLDay
  SQLYear = Year(fDato)
  SQLMonth = Month(fDato)
  SQLDay = Day(fDato)
  SQLDay = right("0"&SQLDay, 2)
  SQLMonth = right("0"&SQLMonth, 2)
  ConvertToSqlDate = "#"& SQLMonth&"-"&SQLDay&"-"&SQLYear &"#"
End Function

Function ConvertToSqlDatetime(fDato)
dim SQLYear,SQLMonth,SQLDay,SQLHour,SQLMinute
  SQLYear = Year(fDato)
  SQLMonth = Month(fDato)
  SQLDay = Day(fDato)
  SQLHour = Hour(fDato)
  SQLMinute = minute(fDato)
  SQLDay = right("0"&SQLDay, 2)
  SQLMonth = right("0"&SQLMonth, 2)
  SQLHour = right("0"&SQLHour, 2)
  SQLMinute = right("0"&SQLMinute, 2)
  ConvertToSqlDatetime = "#"& SQLMonth&"-"&SQLDay&"-"&SQLYear&" "&SQLHour&":"&SQLMinute &"#"
End Function

DataPath = Server.MapPath("database/ban.mdb")

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & DataPath & ";Password=MIN KODE !"
strLigeNu = now()
strLigeNow = date()

if request.form("banTime") = "1" then
  banTime = dateadd("h",1,now())
elseif request.form("banTime") = "2" then
  banTime = dateadd("h",10,now())
elseif request.form("banTime") = "3" then
  banTime = dateadd("d",1,now())
elseif request.form("banTime") = "4" then
  banTime = dateadd("d",7,now())
elseif request.form("banTime") = "5" then
  banTime = dateadd("m",1,now())
elseif request.form("banTime") = "6" then
  banTime = dateadd("m",6,now())
elseif request.form("banTime") = "7" then
  banTime = dateadd("y",100,now())
End If

strSQL = "INSERT INTO banning ("
strSQL = strSQL & "ip, "
strSQL = strSQL & "reason, "
strSQL = strSQL & "dato, "
strSQL = strSQL & "expire, "
strSQL = strSQL & "[from]) "
strSQL = strSQL & "values( "
strSQL = strSQL & "'" & Request.Form("ip") &  "', "
strSQL = strSQL & "'" & Request.Form("reason") & "', "
strSQL = strSQL & "" & ConvertToSqlDatetime(strLigeNu) & ", "
strSQL = strSQL & "" & ConvertToSqlDatetime(banTime) & ", "
strSQL = strSQL & "'" & Request.Form("from") &  "')"
Conn.Execute(strSQL)

Response.Write "Så er IP'en Bannet .."
Avatar billede inctor Nybegynder
19. juni 2006 - 11:50 #24
Fint nok .. Men nu gir den den her fejl:

Microsoft OLE DB Provider for ODBC Drivers error '80004005'

[Microsoft][ODBC Microsoft Access Driver] Field 'banning.ip' cannot be a zero-length string.

/banip.asp, line 61

Hvorfor nu det ?
Avatar billede fennec Nybegynder
19. juni 2006 - 12:03 #25
Sikkert fordi Request.Form("ip") returnere en tom streng. Tjek at du har skrev rigtig/der er et formfelt der hedder "ip".
Avatar billede fennec Nybegynder
19. juni 2006 - 12:05 #26
Ellers udskriv strSQL til skærmen inden du bruger den. Det gør det nemmere at finde fejl:

response.write "SQL: "& strSQL
response.end
Conn.Execute(strSQL)
Avatar billede inctor Nybegynder
19. juni 2006 - 12:07 #28
request.form("ip") angives som du kan se på det link ..
Avatar billede inctor Nybegynder
19. juni 2006 - 12:09 #29
Sån her ser den ud:

SQL: INSERT INTO banning (ip, reason, dato, expire, [from]) values( '', '', #06-19-2006 12:11#, #12-30-1899 00:00#, '')

Felterne, IP Reasion og from er ikk angivet  ? kun dato og Expire ..
Avatar billede inctor Nybegynder
19. juni 2006 - 12:15 #30
Du kan selv se hvis du følger linket her:

http://www.highrisetime.dk/banip.asp?ip=212.10.3.12&reason=Test&banTime=1&from=Admin
ip, reason og from er angivet .. Men den henter dem ikke ned ?
Avatar billede inctor Nybegynder
19. juni 2006 - 12:19 #31
Kan heller ikke hente ip værdien Sån her:
Response.Write " " & Request.Form("ip") & " "

???
Avatar billede fennec Nybegynder
19. juni 2006 - 12:24 #32
Fordi du skal bruge request.Querystring() i stedet for .Form().
Avatar billede inctor Nybegynder
19. juni 2006 - 12:26 #33
Hvorfor er Expire: #12-30-1899 00:00# ? Sån ? det jo flere år siden jo .. Selvom jeg sætter den til 1 time .. :S
Avatar billede inctor Nybegynder
19. juni 2006 - 12:32 #34
Fandt ud af det .. :) heeh, Nåår, hvorn ser tjekket så ud ? det som tjekker om man er bannet .. Hvad vil være smartest ? at gøre det i Database udtrækket eller med en IF sætning .. Jeg vil foretrække noget med if sætning, for hvis ens ip er i databasen, så skal man Response.Redirect "banned.asp?ip=212.10.3.12"  ...
Avatar billede fennec Nybegynder
19. juni 2006 - 12:34 #35
Det er også et querystring problem. ALLE request.form skal udskiftes med querystring. Du sender jo ikke informationerne via POST men GET (url'en).
Avatar billede fennec Nybegynder
19. juni 2006 - 12:37 #36
Den har du jo allrede fordi du skal tjekke den i DB'en:

IP = "212.10.3.1"
set rs = conn.execute("select * from banning where expire>now() and IP='"& IP &"'")
if not rs.eof then
  'Banned
  response.redirect("banned.asp?IP="& IP)
end if
Avatar billede inctor Nybegynder
19. juni 2006 - 12:38 #37
Jaa .. Det er rigtigt .. Er ikke så god til ASP endnu .. Men arbejder på at lære alle de regler og afvigelser fra PHP .. :) heeh ..
Avatar billede inctor Nybegynder
19. juni 2006 - 12:39 #38
Hvad betyder det der rs.eof ?
Avatar billede fennec Nybegynder
19. juni 2006 - 12:47 #39
End Of File.

Hvis selecten ikke returnere noget er IP'en ok at bruge, ellers er den banned.
Avatar billede fennec Nybegynder
19. juni 2006 - 12:51 #40
Og dens modstykke er BOF (Beginning of file), men den bruges KUN nær man går bagud i resultaterne (rs.MovePrevious), hvilket man yderst sjældent gør.
Avatar billede inctor Nybegynder
19. juni 2006 - 12:57 #41
Heeh Jaa .. :) where expire>now()

Skulle lige vende > om til < .. Før det virkede .. Selvom det jo burde være modsat .. :S Den siger jeg er bannet hvis den er sån her: < men ikk hvis den er > .. :S
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester