Avatar billede ebert Nybegynder
11. november 2001 - 01:38 Der er 3 kommentarer og
1 løsning

Formatering af brugerinput i textarea

Hvis brugerinput fra en textarea lagres i en database og senere fiskes frem ingen for at blive vist på en asp-genereret html-side, er det som bekendt en god idé at html-encode indholdet for at undgå svinestreger som <script>...</script> eller <body bgcolor=black>. Men sommetider er det ønskværdigt at brugerne får mulighed for at angive simple formateringskoder (lister, tabeller etc.) i deres input i textarea. Hvordan kan man gøre dette uden at tilsidesætte sikkerheden og uden at brugerne kan ændre sidens tænkte design?
Avatar billede kornfreak Nybegynder
11. november 2001 - 01:41 #1
Du skriver bare Response.Write(Server.HTMLEncode(Rs(\"Tekst\")))

Eller endnu bedre, når du får teksten og skal til at indsætte i din db, Så henter du vel teksten med noget i stil med Request.Form(\"Text\"), det laver du bare om til Server.HTMLEncode(Request.Form(\"Text\"))

:)
Avatar billede ebert Nybegynder
11. november 2001 - 02:35 #2
Tak for svaret, men det løser ikke mit problem. Med server.htmlencode(rs(\"tekst\")) disables brugerens formateringskoder, men jeg ønsker netop at brugeren skal kunne formatere sit indlæg, dog kun med et begrænset udvalg af formateringskoder.
Avatar billede eagleeye Praktikant
11. november 2001 - 02:46 #3
Her er en function som fjerner HTML-koder fra tekst. De koder du ønsker skal bevares i teksten fjerner du bare fra tag-listern: Const TAGLIST


Function RemoveHTML( strText )
  Const TAGLIST = \";!--;!DOCTYPE;A;ACRONYM;ADDRESS;APPLET;AREA;B;BASE;BASEFONT;BGSOUND;BIG;BLOCKQUOTE;BODY;BR;BUTTON;CAPTION;CENTER;CITE;CODE;COL;COLGROUP;COMMENT;DD;DEL;DFN;DIR;DIV;DL;DT;EM;EMBED;FIELDSET;FONT;FORM;FRAME;FRAMESET;HEAD;H1;H2;H3;H4;H5;H6;HR;HTML;I;IFRAME;IMG;INPUT;INS;ISINDEX;KBD;LABEL;LAYER;LAGEND;LI;LINK;LISTING;MAP;MARQUEE;MENU;META;NOBR;NOFRAMES;NOSCRIPT;OBJECT;OL;OPTION;P;PARAM;PLAINTEXT;PRE;Q;S;SAMP;SCRIPT;SELECT;SMALL;SPAN;STRIKE;STRONG;STYLE;SUB;SUP;TABLE;TBODY;TD;TEXTAREA;TFOOT;TH;THEAD;TITLE;TR;TT;U;UL;VAR;WBR;XMP;\"
  Const BLOCKTAGLIST = \";APPLET;EMBED;FRAMESET;HEAD;NOFRAMES;NOSCRIPT;OBJECT;SCRIPT;STYLE;\"
   
  Dim nPos1
  Dim nPos2
  Dim nPos3
  Dim strResult
  Dim strTagName
  Dim bRemove
  Dim bSearchForBlock
   
  nPos1 = InStr(strText, \"<\")
  Do While nPos1 > 0
    nPos2 = InStr(nPos1 + 1, strText, \">\")
    If nPos2 > 0 Then
      strTagName = Mid(strText, nPos1 + 1, nPos2 - nPos1 - 1)
      strTagName = Replace(Replace(strTagName, vbCr, \" \"), vbLf, \" \")
      nPos3 = InStr(strTagName, \" \")
      If nPos3 > 0 Then
        strTagName = Left(strTagName, nPos3 - 1)
      End If
      If Left(strTagName, 1) = \"/\" Then
        strTagName = Mid(strTagName, 2)
        bSearchForBlock = False
      Else
        bSearchForBlock = True
      End If   
      If InStr(1, TAGLIST, \";\" & strTagName & \";\", vbTextCompare) > 0 Then
        bRemove = True
        If bSearchForBlock Then
          If InStr(1, BLOCKTAGLIST, \";\" & strTagName & \";\", vbTextCompare) > 0 Then
            nPos2 = Len(strText)
            nPos3 = InStr(nPos1 + 1, strText, \"</\" & strTagName, vbTextCompare)
            If nPos3 > 0 Then
              nPos3 = InStr(nPos3 + 1, strText, \">\")
            End If
            If nPos3 > 0 Then
              nPos2 = nPos3
            End If
          End If
        End If
      Else
        bRemove = False
      End If
      If bRemove Then
        strResult = strResult & Left(strText, nPos1 - 1)
        strText = Mid(strText, nPos2 + 1)
      Else
        strResult = strResult & Left(strText, nPos1)
        strText = Mid(strText, nPos1 + 1)
      End If
    Else
      strResult = strResult & strText
      strText = \"\"
    End If
    nPos1 = InStr(strText, \"<\")
  Loop
  strResult = strResult & strText
  RemoveHTML = strResult
End Function


response.write RemoveHTML(rs(\"tekst\"))


Jeg har brugt den til en gæstebog. Så rs var request.Form.  RemoveHTML functionen fjerner HTML-koder som man ikke ønsker men det er faktisk muligt at \"snyde\" functionen, så der er nødvendigt at kalde den flere gange for at se om strengen har ændret sig.


textToDB2 = RemoveHTML(request.form(\"guestComment\"))
runNo = 1
AttackLimit = 5
do
  textToDB = textToDB2
  textToDB2 = RemoveHTML(textToDB)
  runNo = runNo + 1
loop until (textToDB = textToDB2) OR (runNo = AttackLimit)
if runNo = AttackLimit then
  \'Gem ikke pga af \"forsøg\" på at ødelægge...
else
  \'Gem i databasen
  \"insert into tabel (tekst) values (\'\"&textToDB&\"\')\"
end if
Avatar billede ebert Nybegynder
14. november 2001 - 16:19 #4
Tak for dit svar som jeg accepterer. Jeg skal nok lige have rettet din RemoveHtml til så den passer bedre til mit formål, men der er absolut gode idéer at hente i scriptet.
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