[Top][All Lists]
[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 <br>
eller <p>.
- 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 <br>
eller <p>.
+ Man får dessutom bara skriva ett inlägg per dygn.
+ Nu går det att använda citationstecken i länkar (a href="")!
<?
}
gnuheter_patch18
Description: Text document
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnuheter-dev] diary: isRealUser, XSS, citat,
Ulf Harnhammar <=