gnuheter-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnuheter-dev] diary: isRealUser, XSS, citat


From: Ulf Harnhammar
Subject: [Gnuheter-dev] diary: isRealUser, XSS, citat
Date: Wed, 10 Jul 2002 18:30:55 +0200 (CEST)

Hej,

här är en patch till diary.php med tre poänger:

1) Den använder isRealUser() för att undvika spoofade dagboksinlägg. Mer
detaljer senare.

2) Den filtrerar inkommande HTML-kod hårt (enda attributet som släpps
igenom är A-elementets HREF-attribut) för att undvika vissa XSS (Cross
Site Scripting)-säkerhetshål. Mer detaljer senare.

3) Nu går det att använda länkar av typen <a href=""> igen. Tidigare
krånglade citationstecknen.

Alla kommentarer kring den nya koden tas tacksamt emot.

// Ulf Härnhammar



--- diary.php.old       Wed Jul  3 15:38:34 2002
+++ diary.php   Wed Jul 10 17:50:19 2002
@@ -26,7 +26,8 @@
 
 include('mainfile.php');
 
-# what do display? (setup $user and $did)
+# what to display? (setup $user and $did)
+isRealUser($HTTP_COOKIE_VARS['user']);
 $did = (int) $HTTP_GET_VARS['did'];
 $cookie = cookiedecode($HTTP_COOKIE_VARS['user']);
 if (!$did) $did = 0;
@@ -51,9 +52,65 @@
 }
 
 function diary_strip_tags ($string) {
-    return 
strip_tags($string,"<p><b><i><a><em><br><strong><blockquote><tt><li><ol><ul><div><hr><a>");
+    $string = 
strip_tags($string,"<p><b><i><a><em><br><strong><blockquote><tt><li><ol><ul><div><hr>");
+    $string = only_href($string);
+    return $string;
 }
 
+function only_href($string) {
+
+# Den här funktionen letar upp HTML-taggar, delar upp dem i element och alla 
attribut,
+# och anropar only_href_attr.
+
+    $string = preg_replace('%<'.
+                           '(/?[a-z]+)'.                       # element
+                           '(\s+'.                             # mellanrum
+                           '(\'[^\']*\'|"[^"]*"|[^<>])*)'.     # alla attribut
+                           '>%ei',
+                           'only_href_attr(\'\\1\', \'\\2\')', $string);
+    return $string;
+}
+
+function only_href_attr($element, $attr) {
+
+# Den här funktionen tar bort alla attribut, om elementet inte är <a>.
+# Om det är <a> delar den upp attributlistan i olika attribut, och anropar
+# only_href_attr_check.
+
+    $attr = stripslashes(stripslashes($attr));
+
+    if (strtolower($element) != 'a')
+      return "<$element>";
+
+    $attr = preg_replace('%(\s+([^=\s]+)'.                    # attributnamn
+                         '(\s*=\s*'.                          # lika med
+                         '(\'[^\']*\'|"[^"]*"|\S+))?)%ei',    # attributvärde
+                         'only_href_attr_check(\'\\2\', \'\\1\')', $attr);
+
+    $attr = trim($attr);
+    if ($attr != '')
+      $attr = " $attr";
+
+    return "<$element$attr>";
+}
+
+function only_href_attr_check($attributename, $wholeattribute) {
+
+# Den här funktionen tar bort alla attribut som inte är href=, samt de
+# href-attribut som inte är välformade.
+
+    $wholeattribute = stripslashes($wholeattribute);
+
+    if (strtolower($attributename) != 'href')
+      return '';
+
+    if ((!preg_match('%^\s+[^=\s]+\s*=\s*\'[^\']*\'$%', $wholeattribute)) and
+        (!preg_match('%^\s+[^=\s]+\s*=\s*"[^"]*"$%', $wholeattribute)) and
+        (preg_match('%["\']%', $wholeattribute)))
+      return '';
+
+    return $wholeattribute;
+}
 
 function diary_display($did=0, $user=false) {
     global $loggeduser;
@@ -165,14 +222,15 @@
        <form method="POST">
        <input type="hidden" name="diary[did]" value="<?= $diary['did']; ?>">
                <b>Titel:</b><br /><input class="textbox" type="text" 
name="diary[title]" value="<?= quotequote($diary['title']); ?>" size="30" /><br 
/><br />
-       <b>Inlägget:</b><br /><textarea class="textbox" wrap="virtual" 
cols="70" rows="12" name="diary[bodytext]"><?= quotequote($diary['bodytext']); 
?></textarea></a><br /><br />
+       <b>Inlägget:</b><br /><textarea class="textbox" wrap="virtual" 
cols="70" rows="12" name="diary[bodytext]"><?= $diary['bodytext']; 
?></textarea></a><br /><br />
        <select name="action"><option value="edit" 
selected>Granska</option><option value="submit">Färdig</option></select>
        <input type="submit" name="submit" value="Submit" class="button">
        </form>
        <br />
        Du kan använda en del HTML om du vill, dock en begränsad del av de 
märkord som finns.
-       Inga automatiska radbrytningar görs, du för göra dem med &lt;br&gt; 
eller &lt;p&gt;.
-       Använd inte citationstecken i länkar (a href=)! Man får dessutom bara 
skriva ett inlägg per dygn.
+       Inga automatiska radbrytningar görs, du får göra dem med &lt;br&gt; 
eller &lt;p&gt;.
+       Man får dessutom bara skriva ett inlägg per dygn.
+       Nu går det att använda citationstecken i länkar (a href="")!
 <?
 }
 

Attachment: gnuheter_patch18
Description: Text document


reply via email to

[Prev in Thread] Current Thread [Next in Thread]