SPAMS im Gästebuch - was tun?

Hi

weil Du rs als Variablen nicht definiert hast.

Sobald das Script mit option explicit beginnt, müssen die Variablen definiert werden.

dim rs

Mehr kann ich dazu nicht sagen, da ich den Stand Deines jetzigen Scirptcode nicht kennen.
 
Hi, danke! Habe nun alle Variablen definiert!
Jetzt steht nur da: "Was ist das Ergebnis?"
Und dann ein leeres Eingabeformular ...
http://www.fckitz.at/fcreith/gaestebuch2.asp

Der Code wurde ganz am Anfang des ASP-Dokuments eingefügt.

Danach kommt der Teil, wo die Einträge eingetragen werden,
anschließend derjenige, de die bestehenden ausliest.

Den Quellcode hab ich in eigene Textdatei gegeben, weil sonst würde dieser dieses Posting sprengen: http://www.fckitz.at/fcreith/gaestebuch2_source.txt

Danke, LG redwing78
 
Hallo

Du hast versucht, mein Formular in Dein Script einzubauen.
Dadurch hast Du nun 2 Formulare im Scirpt und 2x die Abfrage, ob das Formular abgeschickt wird.

Der Übersichtlichkeit halber sollte man sich bei solchen doch komplexeren Sachen angewöhnen, Scirptteile über dem Header in Funktionen auszulagern.

Im html-Teil sollte nur das nötigste eingefügt werden.

Wichtig ist vor allem die Formularvalidierung.

Weiterhin solltest Du Hochkomma replacen und bei der Ausgabe kein html zulassen (server.htmlencode(feld))

Das Formular habe ich jetzt zusammengepackt und die Abfrage direkt dort hineingesetzt.

Weiteres steht in den Kommentarzeilen.

Ich habe es jetzt nicht getestet.

Ich will jetzt nicht sehr viel an dem Scirpt verändern, Du sollst es ja auch selbst erlernen.
Code:
<%@Language="VBScript" CODEPAGE="1252"@%>
<% 
dim strDB, strConn
' --- Verbindung zur Datenbank
strDB = "Data Source=" & Server.MapPath("../datenbank/fcreith.mdb") ' Pfad und Dateiname der Datenbank
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & strDB ' Parameter zum Öffnen der Datenbank
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strConn
 
function umwandeln(s)
s = replace(s,"'","''")
umwandeln = s
end function

' -- Zuordnen der Formularwerte

dim nDatum, nName, nOrt, nEmail, nNachricht  
nDatum 			= umwandeln(Request.Form("nDatum"))
nName 			= umwandeln(Request.Form("nName"))
nOrt 			= umwandeln(Request.Form("nOrt"))
nEMail 			= umwandeln(Request.Form("nEMail"))
nNachricht 		= umwandeln(Request.Form("nNachricht"))

' --- Funktion, womit ein Eintrag ins Gästebuch geschrieben werden kann.

function getInsert
dim strSQL
strSQL = "INSERT INTO Gaestebuch (Datum, Name, Ort, EMail, Nachricht, Aktiv) VALUES ('" & nDatum & "', '" & nName & "', '" & nOrt & "', '" & nEMail & "', '" & nNachricht & "', TRUE)"
objConn.Execute(strSQL) 

' --- hier sollte besser auf eine Bestätigungsseite gelinkt werden
' --- damit nicht nachreloadet werden kann. 
' --- Diese kann dann wieder per Meta Refresh auf das Gästebuch weiterleiten. 
' --- bsp. 
' objConn.close
' set objconn = nothing
'response.redirect "danke.asp"

getInsert = "<font face='Verdana' size='1'><p><b><Resultat:</b> Der Datensatz wurde erfolgreich hinzugefügt!<br><a href='gaestebuch2.asp'>Gästebuch vollständig anzeigen</a></font></p>"
end function

' --- Sessions mit Werten befüllen

function wert (z1,z2)
RANDOMIZE(TIME())
dim u : u = z1
dim o : o = z2
wert = INT( (o-u +1) * RND()+u)
end function

if session("z1") = "" then session("z1") = wert(10,99)
if session("z2") = "" then session("z2") = wert(1,9)

zZahl1 = session("z1") + session("z2")
y = " und "
if session("z2") >= 5 then
zZahl1 = session("z1") - session("z2")
y = " minus "
end if

' --- Aufruf definieren

dim zZahl
  zZahl = "Was ist das Ergebnis von " & _
  session("z1") & y & session ("z2") & "?<br><br>"
  
dim ausgabe
  ausgabe = "Bitte folgende Felder * ausfüllen"
  
dim zahl
  zahl = Request.form("zahl")  

' --- Funktion zum Anzeigen der Daten. 

function anzeigen %>
<hr color="#C0C0C0" width="640" size="1" align="left">
<% 
dim strTabelle
strTabelle = "Mannschaften" ' Name der Tabelle oder Abfrage, die ge&ouml;ffnet werden soll
	Set objRS = Server.CreateObject("ADODB.Recordset") ' Objekt fuer das Recordset-Objekt			
	strSQL = "SELECT TOP 100 * FROM Gaestebuch WHERE Aktiv=TRUE ORDER BY EintragID DESC"
	objRS.Open strSQL, objconn
	' objRS.MoveFirst ' Geht zum ersten Datensatz --- kann raus!
	dim intCounter
	intCounter = 1
	While Not objRS.EOF ' Liest, bis das Ende der Daten erreicht ist %>
 
<table width="640" cellpadding="2" cellspacing="0" border="1" bordercolor="#EBEBEB" background="images/bg_gitter.gif" height="120">
  <tr height="20">
    <td width="20%" class="headline2">Eintrag #<% Response.Write objRS("EintragID") %></td>
    <td width="80%" class="headline2" align="right"><% Response.Write objRS("Name") %> aus <% Response.Write objRS("Ort") %></td>
  </tr>
   <tr height="100">
    <td width="20%" class="texts" valign="top"><% Response.Write objRS("Datum") %><br>
    <% if objRS("EMail")="" then
         Response.Write ("")
    ELSE
        Response.Write ("<a href='mailto:" & objRS("EMail") & "'>E-Mail</a>")     
    END if %>
    </td>
    <td width="80%" class="texts" valign="top"><% Response.Write Server.HTMLEncode(bjRS("Nachricht")) %>&nbsp;</td>
  </tr>
</table>
<br>
 <% intCounter = intCounter + 1
			objRS.MoveNext ' Geht einen Datensatz weiter
			Wend %>
			
          <% objRS.Close ' Recordsetobjekt schliessen
		  	Set objRS = Nothing 
end function
%>

<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>

<head>
<meta http-equiv="Content-Language" content="de-at">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<link href="css_fcreith.css" rel="stylesheet" type="text/css">
<title>FC Reith - Gästebuch</title>
</head>
<body>
<p><img border="1" src="images/banner_gb.jpg" width="640" height="43"></p>
<% 

' --- Formularvalidierung

if Request.Form.count > 0 then

dim allesok
 	allesok = 1
  
'  --- ist Feldwert ungleich des Sessionergebnisses, ist der Eintrag falsch

if cstr(zahl) <> cstr(zZahl1) then
  allesok = 0
  Ausgabe = "<span style=""color:red"">Was ist das Ergebnis?</span>"

' --- Aufruf, wenn Feld Nachricht nicht ausgefüllt worden ist 
  
elseif isnull(nNachricht) or nNachricht = "" then
	allesok = 0  
  Ausgabe = "<span style=""color:red"">Bitte Nachrichtenfeld ausfüllen</span>"
end if
end if

'  -- Ist der Feldwert korrekt angegeben, können die Formularergebnisse weiterverarbeitet werden

if allesok then
' --- Löschen der Sessions
session.contents.remove("z2")
  session.contents.remove("z1")
' --- Falls weiterleitung
' getinsert
' --- ansonsten
  Response.write getinsert
' --- ansonsten
else  
' --- Start des Formulars
' --- Ausgabe von evtl. Fehlern
Response.write ausgabe
call formular
' --- anzeigen der gesamten Daten
response.write anzeigen
end if %>
</body>
</html>

<% objConn.Close ' Verbindungsobjekt schließen
Set objConn = Nothing %> 

<% sub Formular %>
<form method="post" action="<% Request.ServerVariables("SCRIPT_NAME")%>">
  <table border="0" width="640" id="table1" cellspacing="0" cellpadding="2" background="images/bg_gitter.gif">
	<tr>
		<td class="headline2" width="50%" align="center">Ihre Daten</td>
		<td class="headline2" width="50%" align="center">Ihre Nachricht</td>
	</tr>
	<tr>
		<td width="50%" class="texts">
		<table border="0" width="100%" id="table2" cellspacing="0" cellpadding="2">
			<tr>
				<td class="texts"><b>Datum</b></td>
				<td class="texts"><input type="text" name="nDatum" size="30" value="<% = Date() %>"></td>
			</tr>
			<tr>
				<td class="texts"><b>Name</b></td>
				<td class="texts"><input class="editfrei" type="text" name="nName" size="30"></td>
			</tr>
			<tr>
				<td class="texts"><b>Ort</b></td>
				<td class="texts"><input type="text" name="nOrt" size="30"></td>
			</tr>
			<tr>
				<td class="texts"><b>E-Mail</b></td>
				<td class="texts"><input class="edit" type="text" name="nEMail" size="30"></td>
			</tr>
		</table>
		</td>
		<td class="texts" width="50%">
		<div><% = zahl%></div>
<input type="text" name="zahl" value="<% = zahl %>"/><br />
		<textarea class="edit" rows="5" name="nNachricht" cols="30"></textarea></td>
	</tr>
	</table>
  <p><input class="submit" type="submit" name="go" value="Speichern"> </p>
</form>
<% end sub %>
 
Zuletzt bearbeitet:
Hi

Die Kontrollrechung ist in einer Variablen hinterlegt, diese heißt zZahl. Dort steht der Text der Aufgabe drin, das, was der User rechnen muss.

Das Ergebnis steht in der Variablen zZahl1 und muss dann mit dem Ergebnis des Formularfeldes zahl verglichen werden
 
Zuletzt bearbeitet:
Hi! Ich hab mir die Datei jetzt nochmal gründlich durchgesehen, aber es funktioniert nicht.
Es erscheint zwar das Feld "Sicherheitsabfrage", aber kein Hinweis, WAS eingegeben werden soll. Wenn man irgendwas eingibt, erscheint oben: "Was ist das Ergebnis?" und dann das vorher fiktiv eingegebene Ergebnis ...

Gibt es evtl. auch eine einfachere Lösung, zB eine Zahl per Zufall generieren zu lassen und diese dann eingeben zu müssen?

Danke - LG,
Josef
 
Hallo

diese Sachen sind alle nicht einfach, auch in anderen Scirptsprachen nicht.

Wenn es bei Dir nicht funktioniert, dann hast Du noch einen Fehler dadrin.
In ASP kann man aber noch mit Application-Variablen arbeiten. Man speichert beim erfolgreichen Absenden des Formulars den aktuellen Zeitpunkt in diese Variable. Dieser Zustand bleibt 20 Sekunden bestehen. In dieser Zeit ist der Submitbutton blockiert und das Formular kann nicht verschickt werden.

Aber auch das Procedure muss in ein bestehendes Script eingebaut werden. Wichtig ist auch immer, dass nach dem Versand auf eine neue Seite gelinkt wird, oder das Scirpt mit response.end abgebrochen wird. Insofern würde auch ein return über f5 nichts mehr ausrichten.

Hier ein Beispiel zum Testen:

Code:
<%
' --- Variable um Button disabled zu setzen
dim disabled
disabled = "disabled"

dim allesok, abfehler
abfehler = ""

dim testfeld
testfeld = Request.Form("testfeld")

' --- ermitteln der Zeit zwischen aktuellem Zeitpunkt und der Application-Variable
if datediff( "s", Application("time"), now() )>20 then

' --- ist die Differenz > 20 Sekunden, wird disabled auf "" gesetzt.
disabled = ""
end if

' --- Abfrage, wenn Formular abeschickt
if request.Form.Count > 0 then
allesok = 1

' --- Feldvalidierung
if testfeld ="" or isnull(testfeld) or len(testfeld) > 10 then
' --- Fehler
abfehler = "<div style=""color:red"">Es können nur 10 Zeichen verschickt werden.</div>"
allesok = 0
end if
end if

' --- Wenn alles korrekt eingegeben, bekommt die Application den aktuellen Zeitpunkt. 
If allesok then
Application.Lock
Application("time") = now()
Application.UnLock

dim abkText
	abkText = "Folgender Beitrag wurde nicht gefunden. <br/>" & vbcrlf & _
	"Feld: " & testfeld & "<br/>" & vbcrlf & _
	"<a href=""" & Request.ServerVariables("SCRIPT_NAME") & """>Neustart</a>"
	
	
response.write abktext
Response.end
end if
' --- Formularfelder für die Abfrage
%>
<% = abfehler %>
<form name="form2" method="post" action="<% = Request.ServerVariables("SCRIPT_NAME")%>">
    <br/>
    <label>Feld muss ausgefüllt werden (max 10 Zeichen)*</label>
    <input type="text" name="testfeld" value="<% = testfeld %>" class="inputText200R" />
    <br/>
    <input type="submit" name="senden" value="senden" <% = disabled %>>
  </form>

Es gibt da noch die Möglichkeit der IP-Sperre oder das Anlegen eines Cookies. Aber letztendlich läuft alles darauf hinaus, dass das Formular für einen bestimmten Zeitraum blockiert ist. Es ist eine Möglichkeit, nicht jeder kann sich damit anfreunden.

Mir persönlich fällt da auch nicht mehr ein, evtl. aber anderen.
 
Ich würde eine Art Passwortschutz einbauen,
dass heist, du lässt automatisch ein 5-8 ställigen Code generieren und den müssen die User eintippen im nächsten Textfeld.
Währe für mich die beste lösung :)
 
Hallo, ich habe auch schon an so etwas gedacht. Ein Zufallspasswort oder eine Zufallszahl generieren lassen und der User muß es dann eintragen, damit der GB-Eintrag wirksam wird. Wie kann ich das bewerkstelligen?
Danke für Eure Hilfe!
LG Josef
 
hab von ASP leider keine Ahnung aber ich hatte das selbe Problemchen wie Du mit einem PHP Gästebuch ... hab es dann mal mit CHAPTAS probiert. Seitdem ist Ruhe weil sich keiner die Mühe machen will ständig ne Zeichenkette einzugeben.

Evtl. gibt es das auch bei ASP ?
 
Zurück