problem mit paging

mi_tob

Grünschnabel
hallo,

thema paging: ich hab eine suchseite gemacht, bei der pro seite max. 10 DS ausgegeben werden sollen. das script dafür funktioniert an sich gut. jetzt hab ich aber das problem der datenherkunft. der sql string der anzeigeseite ruft eine funktion auf. dem sql string übergebe ich zwei eingabewerte: den eintrag des textfeldes und ein sprachenkürzel (bsp. de). die erste seite wird noch korrekt angezeigt. blättere ich jedoch weiter, dann werden keine DS mehr angezeigt. hat jemand vielleicht eine idee, wie ich dieses problem lösen kann. vielleicht den recordset in ein array oder eine variable speichernweiß nur nicht, wie es geht...

gruß

tob
 
hi,

ich glaube, dass der code in dem erstmal zweitrangig ist. wie schon beschrieben, ist die datenquelle eine funktion auf dem sql server, die von mir zwei eingabeparameter bekommt.

hier der code:

Code:
SqlJunk = "SELECT * FROM fu_art_suche('" & Request.Form("eingabe") & "', 'de')"

zum blättern rufe ich ja immer wieder diese eine seite auf. und ist wohl das problem.

Code:
<%
'Display PREV page link, if appropriate
If Not CurrentPage = 1 Then
	Response.Write "<a href='" & ScriptName & "?page=" & CurrentPage - 1 & "'>Prev</a> | "
Else
	Response.Write "Prev | "
End If

'Display NEXT page link, if appropriate
If Not CurrentPage = TotalPages Then
	Response.Write "<a href='" & ScriptName & "?page=" & CurrentPage + 1 & "'>Next</a>"
Else
	Response.Write "Next"
End If
%>

und jetzt der komplette code:

Code:
<%
'Fetch the name of this script
ScriptName = Request.ServerVariables("art_list.asp")
Dim SqlJunk, strComplete 

strComplete = "PROVIDER=MSDASQL;Driver=SQL Server;Server=test;UID=User;PWD=PWD;Database=Artikel;"

' --- Öffnen der Datenbankverbindung
Set dbGlobalWeb = Server.CreateObject("ADODB.Connection")
	dbGlobalWeb.open strComplete

'Set how many records per page we want
Const NumPerPage = 10

'Retrieve what page we're currently on
If Request.QueryString("page") = "" then
    CurrentPage = 1 'We're on the first page
Else
    CurrentPage = CInt(Request.QueryString("page"))
End If

SqlJunk = "SELECT * FROM fu_art_suche('" & Request.Form("eingabe") & "', 'de')"

Set rsGlobalWeb = Server.CreateObject("ADODB.Recordset")

rsGlobalWeb.Open SqlJunk, dbGlobalWeb, 3

If Not rsGlobalWeb.EOF Then
 	rsGlobalWeb.MoveFirst
	rsGlobalWeb.PageSize = NumPerPage
    TotalPages = rsGlobalWeb.PageCount

    'Set the absolute (current) page
    rsGlobalWeb.AbsolutePage = CurrentPage
End If

Dim Count
%>

<html><head>
<title>Database Paging Sample</title>
</head><body>

<p><font size="2" face="Arial"><b>

<%
'Display PREV page link, if appropriate
If Not CurrentPage = 1 Then
	Response.Write "<a href='" & ScriptName & "?page=" & CurrentPage - 1 & "'>Prev</a> | "
Else
	Response.Write "Prev | "
End If

'Display NEXT page link, if appropriate
If Not CurrentPage = TotalPages Then
	Response.Write "<a href='" & ScriptName & "?page=" & CurrentPage + 1 & "'>Next</a>"
Else
	Response.Write "Next"
End If
%>
<table cellspacing="0" cellpadding="0" class="innertable">

				<tr>
					<td class="black12">
				 		<form name="ArtSuche" action="art_list.asp" method="Post"> 
           					<input type="text" name="eingabe" size="20" value="<%=Request.Form("eingabe")%>" /> 
      						<input type="submit" value="Suchen" name="B1">&nbsp;

						</form> 
					</td>
				</tr>
				</table>
</b></font></p>
<p><b><font size="2" face="Verdana">Displaying page <%=CurrentPage%> of <%=TotalPages%>:</font></b></p><p>

<%
'Loop to display data on current page.
Do While Not rsGlobalWeb.EOF and Count < rsGlobalWeb.PageSize
	Response.Write rsGlobalWeb("art") & "<br>"
	rsGlobalWeb.MoveNext
	Count = Count + 1
Loop
%>

</body></html>

wenn ich als datenherkunft eine normale abfrage defieniere, funktioniert es natürlich...

gruß
tob
 
Hi

dann musst Du die Suche einfangen und über die Seitennavigation oder über eine Session wieder mitschicken. Anders bekommst Du die Auswahl nicht zustande.

Dies ist übrigens eine Sicherheitslücke.
Wo ist die Bedingung?
Ich kenne jetzt Deine Datenbank nicht.

SqlJunk = "SELECT * FROM fu_art_suche('" & Request.Form("eingabe") & "', 'de')"

Einfach mal über sql-Injection informieren. z.b. auf http://www.aspheute.com
 
Zuletzt bearbeitet:
Zum einen solltest Du den Request zumindest escapen

Code:
dim eingabe, suche
eingabe = Request.Form("eingabe") & Request.QueryString("eingabe")
suche = Replace(eingabe,"'","''")

Dann für das Statement

Code:
sql="Select * from Tabelle where suchfeld='" & suche & "'"

dann musst Du die betreffenden Links entsprechend den neuen Anforderungen umbauen

Code:
dim what
what = ""
if eingabe <> "" then what="&amp;eingabe=" & suche

If Not CurrentPage = 1 Then
	Response.Write "<a href=""" & ScriptName & "?page=" & CurrentPage - 1 & what & """>Prev</a> | "
Else
	Response.Write "Prev | "
End If

Kommen noch mehr Einschänkungen dazu, kannst Du die Variable what noch erweiteren

z.B.

if dies = das then what = what & "&amp;dies=" & das

Zu Bedenken ist, das Du einmal einen Parameter über ein Form übergibst und im Link über die URL. Also muss beides angefordert werden können.
 
Zuletzt bearbeitet:
Moinsen,

also das mit dem Ausfiltern von dem einfachen Anführungsstrich ist zwar ein netter Versuch, hält aber einen Hacker nicht wirklich davon ab sein böses Werk zu vollenden. Einerseits wäre diese Filterrung nur bei Textfeldern wirksam und würde bei Zahlenwerten schon scheitern. Auch gibt es noch andere Möglichkeiten einen Anführungsstrich zu erzeugen, die ASP nicht abfangen kann und erst im SQL-Server zu einem Schaden führen ... Stichwort hier z.B. ASCII-Codes ... oder auch andere Möglihckeiten die ich hier nicht aufzählen will. Einen Weg um diese Filterung gibt es immer.

Die einzigen Möglichkeiten die ein SQL-Injection verhindern können sind die parametrisierten Anweisungen. Dabei wird der SQL-String im Prinzip vorkompiliert und der Server weiß jetzt, dass nur noch die Parameter fehlen. Aber der String selber kann nicht mehr verändert werden. Somit ist ein SQL-Injection schon unterbunden. Möchte man jetzt auch noch einen Buffer Overflow unterbinden, dann sollte man die eingegebenen Daten noch auf Plausibilität prüfen. Damit meine ich ob die Zeichen richtig sind (Zahlen, Texte, ...) und ob die Länge nicht zu lang sind für das Daten-Feld.

Eines sollte euch immer klar sein, ein Hacker freut sich immer über Fehlermeldungen ... vor allem die Systemfehlermeldungen. Daraus kann man Informationen beziehen, die ein Hacker besser nicht wissen sollte. Darum das Debugging immer ausschalten und eigene Fehlerabfang-Routinen schreiben.
Weitere wichtige Informationen dazu findet man bei ASPHeute.com

So long,
Chrisu
 
Moinsen,

anstelle von
Code:
eingabe = Request.Form("eingabe") & Request.QueryString("eingabe")
könnte man auch
Code:
eingabe = Request("eingabe")
verwenden. Dadurch muß man keine Unterscheidung zwischen .Form und .QueryString machen. Ist aber kein wirklich sauberer Programmierstil und sollte wenn es geht vermieden werden. Besser ist es, wenn man sich für eine Methode (GET/POST) entscheidet und dann auch nur diese eine Methode verwendet.

So long,
Chrisu
 
Chrisu hat gesagt.:
Moinsen,

anstelle von
Code:
eingabe = Request.Form("eingabe") & Request.QueryString("eingabe")
könnte man auch
Code:
eingabe = Request("eingabe")
verwenden. Dadurch muß man keine Unterscheidung zwischen .Form und .QueryString machen. Ist aber kein wirklich sauberer Programmierstil und sollte wenn es geht vermieden werden. Besser ist es, wenn man sich für eine Methode (GET/POST) entscheidet und dann auch nur diese eine Methode verwendet.

So long,
Chrisu


Huhu

wird aber auch jeder andere Request mit durchgenudelt. (serverlastig)
Wenn man genau weiss, dass dieser Request nicht aus einer SV oder einem Cookie kommt, sollte man sich einfach die Mühe machen, es AUSzuschreiben. bzw. zu differenzieren.
 
Zuletzt bearbeitet:
Hi

was die Sicherheitsfrage anbetrifft, kann ich auch nur auf informative Websites verweisen. Ein verdoppeln der Hochkomma ist eine ganz wichtige Sache

Bin allerdings nicht dem Forum oder dem User verpflichtet, eine sichere Möglichkeit zu programmieren. Hinweise habe ich gegeben, indem ich das Problem erkannt und einen Link geboten habe.
 

Neue Beiträge

Zurück