webForumDet fria alternativet

Uppdatera stort fält i databasen

ASP

14 svar · 422 visningar · startad av snowcat

Medlem sedan feb. 2007220 inlägg
Frågan#1

Hej
Jag har ett problem som jag undrar någon skulle vilja hjälpa mig att lösa. Jag har en accessdatabas som jag håller på och gör ett webformulär till så att jag kan uppdatera databasen över internet. Jag får upp alla fält som jag vill och de poster som innehåller något finns där. Dock har jag ett fält som kan innehålla tusentals tecken, (biografier) och dessa (fältet "historia") får jag bara upp typ den första raden i ett sådant fält där man kan ändra, sedan kommer resten av texten liksom utanför och man kan inte uppdatera det. Jag har försökt att lägga in "textarea" istället men det funkar inte alls. Kan man inte uppdatera stora fältmängder?
Så här ser koden ut som visar upp mina fält:

<%	Set Connect = Server.CreateObject("ADODB.Connection")
	Connect.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("db/sys/db1.mdb")

	Set RecSet = Server.CreateObject("ADODB.Recordset")
   Visa = "SELECT * FROM tabellen WHERE ID = " & Trim(Request.QueryString("adressID")) & " "
   RecSet.Open Visa, Connect, adOpenStatic, adLockOptimistic %>

	<form method="POST" action="andra3.asp">

	<tr><td><input type="hidden" name="AD" value="<% =Request.QueryString("adressID") %>"></td></tr>
	
	<tr><td>Förnamn:<br><input type="text" size="30" name="fnamn" value="<% =RecSet("fnamn") %>"></td></tr>
	<tr><td>Efternamn:<br><input type="text" size="30" name="enamn" value="<% =RecSet("enamn") %>"></td></tr>

	<tr><td>Historia:<br><input type="text" size="50" name="historia" value="<% =RecSet("historia") %>"></td></tr>
	
	<tr><td><input type="submit" value="Uppdatera"></td></tr>
	</form>
<% RecSet.Close
	Connect.Close %>

Skulle bli jättetacksam för svar om någon har något 

mvh Nina

Medlem sedan dec. 19996 721 inlägg
#2

1. Stora textfält ska visas med textarea. input type=text är till för små korta "one-liners"
2. Man ska alltid köra Server.HTMLEncode(värde) på det som läggs ut i formuläret

<input type="text" size="50" name="historia" value="<% =Server.HTMLEncode(RecSet("historia")) %>">

3. Läs på om SQL Injection (sök på forumet)

Medlem sedan feb. 2007220 inlägg
#3

Precis som jag skrev så har jag även testat med textarea fast det funkar inte heller. Inga andra förslag?

Medlem sedan juni 200032 967 inlägg
#4

Hur har du testat med textarea då, och på vilket sätt fungerar det inte?

Medlem sedan mars 20041 505 inlägg
#5
<tr><td>Historia:<br><textarea rows="25" cols="50" name="historia"><% =RecSet("historia") %></textarea></td></tr>
Medlem sedan feb. 2007220 inlägg
#6

Jag har fått till det med textarea nu, men har fått ett följdproblem.
Jag ändrade alla mina rader till
<tr><td>Historia:<br><textarea rows="20" cols="60" name="historia"><% =Server.HTMLEncode(RecSet("historia")) %></textarea></td></tr>
och det funkar bra.
Problemet är att jag har 21 kolumner och vissa av dessa är tomma i db:n - vilket de skall vara - men då får jag felet:
Microsoft VBScript runtime error '800a000d'
Type mismatch: 'HTMLEncode'
/nina/historia/andra2.asp, line 26

Plockar jag bort alla sånna rader när jag klickar på en person, (jag skriver biografier på historiska personer) så visas det upp rätt. Den verkar inte kunna klara av de tomma fälten i databasen?

Medlem sedan juni 200032 967 inlägg
#7

Du kan inte skicka in NULL till strängfunktioner, så konkatenera med tom sträng:

<%=Server.HTMLEncode("" & RecSet("historia")) %>

eller se till att inte köra funktionen om fältet är NULL

<% 
sHistoria = RecSet("historia") 
If not isnull(sHistoria) then Response.write Server.HTMLEncode(sHistoria) 
%>
Medlem sedan feb. 2007220 inlägg
#8

JÄTTETACK det funkade ju :-)
Gud vad glad jag blir !!!!

tack så hemskt mycket

/mvh Nina

Medlem sedan feb. 2007220 inlägg
#9

Hmm
jag har ju flera filer som kanske skall fixas till då, med det där serverHTMLencode? Skall jag ändra något på den här filen?

<%	
'*******************Databakoppling********************** 
	Set Connect = Server.CreateObject("ADODB.Connection")
	Connect.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("db1.mdb")
	Set RecSet = Server.CreateObject("ADODB.Recordset")
   	Addera = "SELECT * FROM tabellen"
	RecSet.Open Addera, Connect, adOpenStatic, adLockOptimistic
	RecSet.AddNew
'*******************Koppling slut********************** 
	
	RecSet("fnamn") = Request.Form("fnamn")
	RecSet("enamn") = Request.Form("enamn")
	RecSet("yrke") = Request.Form("yrke")
	RecSet("yrke1") = Request.Form("yrke1")
	RecSet("yrke2") = Request.Form("yrke2")
	RecSet("yrke3") = Request.Form("yrke3")
	RecSet("yrke4") = Request.Form("yrke4")
	RecSet("yrke5") = Request.Form("yrke5")
	RecSet("foto") = Request.Form("foto")
	RecSet("fodd") = Request.Form("fodd")
	RecSet("dod") = Request.Form("dod")
	RecSet("alder") = Request.Form("alder")
	RecSet("kort") = Request.Form("kort")
	RecSet("kon") = Request.Form("kon")
	RecSet("andrad") = Request.Form("andrad")
	RecSet("inlagd") = Request.Form("inlagd")
	RecSet("nation") = Request.Form("nation")
	RecSet("gravplats") = Request.Form("gravplats")
	RecSet("kallor") = Request.Form("kallor")
	RecSet("smeknamn") = Request.Form("smeknamn")
	RecSet("historia") = Request.Form("historia")

	RecSet.Update
	RecSet.Close
	Connect.Close %>

	<table align="center" border="1" width="520" class="vtext">
	<tr><td colspan="2">&nbsp;</td></tr>

	<tr><td colspan="2" class="rubrik">Följande har lagts till i databasen:</td></tr>
	<tr><td colspan="2">&nbsp;</td></tr>
	
	<tr><td width="10%">Förnamn:</td> <td><b><%=Request.Form("fnamn")%></b>	</td></tr>
	<tr><td>Efternamn: </td> <td><b><% =Request.Form("enamn") %></b>		</td></tr>
	<tr><td>Yrke:      </td> <td><b><% =Request.Form("yrke") %></b>			</td></tr>
	<tr><td>Yrke1:      </td> <td><b><% =Request.Form("yrke1") %></b>		</td></tr>
	<tr><td>Yrke2 (längre text):</td> <td><b><% =Request.Form("yrke2")%></b></td></tr>
	<tr><td>Yrke3:      </td> <td><b><% =Request.Form("yrke3") %></b>		</td></tr>
	<tr><td>Yrke4:      </td> <td><b><% =Request.Form("yrke4") %></b>		</td></tr>
	<tr><td>Yrke5:      </td> <td><b><% =Request.Form("yrke5") %></b>		</td></tr>
	<tr><td>Foto? (alt-text): </td> <td><b><% =Request.Form("foto") %></b>	</td></tr>
	<tr><td>Född årtal:      </td> <td><b><% =Request.Form("fodd") %></b>	</td></tr>
	<tr><td>Död årtal: </td> <td><b><% =Request.Form("dod") %></b>			</td></tr>
	<tr><td>Ålder:      </td> <td><b><% =Request.Form("alder") %></b>		</td></tr>
	<tr><td>Kort? (1 eller 2): </td> <td><b><% =Request.Form("kort") %></b>	</td></tr>
	<tr><td>Kön? (k=kvinna):</td> <td><b><% =Request.Form("kon") %></b>		</td></tr>
	<tr><td>Ändrad: 	</td> <td><b><% =Request.Form("andrad") %></b>		</td></tr>
	<tr><td>Inlagd:     </td> <td><b><% =Request.Form("inlagd") %></b>		</td></tr>
	<tr><td>Nation (sv):</td> <td><b><% =Request.Form("nation") %></b>		</td></tr>
	<tr><td>Gravplats:  </td> <td><b><% =Request.Form("gravplats") %></b>	</td></tr>
	<tr><td>Källor: 	</td> <td><b><% =Request.Form("kallor") %></b>		</td></tr>
	<tr><td>Smeknamn:   </td> <td><b><% =Request.Form("smeknamn") %></b>	</td></tr>
	<tr><td colspan="2"><% =Request.Form("historia") %> 			</td></tr>
Medlem sedan juni 20008 205 inlägg
#10

Du ska aldrig, aldrig, aldrig skriva ut något från Request.Form/QueryString utan att HTML-koda det. Så istället för <%=Request.Form("fnamn")%> får det bli <%=Server.HTMLEncode(Request.Form("fnamn"))%>

Medlem sedan feb. 2007220 inlägg
#11

Men varför? Kan någon berätta varför man inte får göra så?

Medlem sedan juni 20008 205 inlägg
#12

Därför att annars kan vem som helst lägga in HTML-kod (och därmed script) som kan ställa till med hyss i användarnas webbläsare. Prova att skriva in t.ex. följande kod i någon av textrutorna och tryck på submit så förstår du kanske varför:

<script>document.body.innerHTML = '\u003cmarquee style="text-decoration:blink;"\u003eDet bästa med spango är att han inte bara är så smart, utan också samtidigt så fasligt vacker.\u003c/marquee\u003e';</script>

Är man lite ondare kan man sno cookies, inloggningsinfo, etc.

Läs mer på http://en.wikipedia.org/wiki/Xss

Medlem sedan feb. 2007220 inlägg
#13

ok då förstår jag
men det här formulären är ju inte något som någon annan skall ha än jag. Det är när jag skall ändra något i databasen bara, det är ju inga andra som gör det....?

men jag förstår vad du menar och tackar för hjälpen :e

Medlem sedan juni 20008 205 inlägg
#14

Man kan ställa till oreda genom misstag också, inte bara genom illvilja :) och det är alltid fel att skaffa sig bra vanor. Använder man alltid HTMLEncode på allt är risken mindre att man glömmer det på ett Dåligt Ställe.

Medlem sedan feb. 2007220 inlägg
#15

okidoki :)
då skall jag lyda dig!

294 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
157 ms — ändringar (db)