作者giive (lala)
看板Ruby
标题HTML Filter
时间Thu Nov 16 17:44:34 2006
http://lightyror.blogspot.com/2006/11/html-filter.html
一般来说,通常使用者 input 的 field 都会作一些 filter 的动作,避免你塞一些危险的 HTML code (script之类)进去。而这部份 Ruby on Rails 作法很简单,就是在前面加上一个 h() 即可。h 在Ruby on Rails 作什麽事情呢?他是 html_escape 的 alias ,他会将所有的 < 还有 > 变成 & lt; ,& gt;,比如 <sctipt>alert('a'); </sctipt> 会变成
& lt;sctipt& gt;alert('a'); & lt;/sctipt& gt;
这样你就完全作不了乱啦,因为所有 tag 都不见了。但是这样通常嫌太过严格一点了,有时候我们会希望开放一些字型大小,颜色的tag 给你用,这时候 h() 通杀的特性会让一切都变得很麻烦。所以这时候 Ruby on Rails 就出现 sanitize() 这个 function,根据 Ruby on Rails 的api 上面解释
Sanitizes the given HTML by making form and script tags into regular text, and removing all "onxxx" attributes (so that arbitrary Javascript cannot be executed). Also removes href attributes that start with "javascript:".
他会砍掉 script 这个 tag ,以及 onClick onLoad 之类的 attribute ,你没有机会执行 javascript ,那就会让你 key-in 任何东西都如 sanitize 字面上一样『完全无害』。但是,Ruby on Rails 预设的 sanitize 管制方式又有点大方,你还是可以塞一些 div 或是 iframe 之类的 tag 让你的网站版面烂掉。
所以我们需要一个可以自订的 HTML Filter ,可以自由指定我们放行那些 tag 。这时候我发现了这个网页,这是 Brad Choate's 写的 perl 函式 sanitize_html 的 Ruby porting,你可以到这里下载 Ruby 的版本。这只有一个函式,请将这个函式放在任何可以 loading 的地方,然後使用
sanitize( HTML 程式码 )
即可。我们来仔细研究一下怎麽使用,他的第一行
def sanitize( html, okTags='a href, b, br, i, p' )
okTags 代表的意思是就是他允许的 tag ,目前有 a ,b , br , i , p 之类的 tag 。如果你输入 <iframe>aaa</iframe>之类的不允许的 code ,他会出现
aaa
这样的结果,所有不被允许的 tag 一律被滤掉。如果你想加入 span,font 这个两个 tag ,那就将他变成
def sanitize( html, okTags='a href, b, br, i, p, span, font' )
以此类推,很简单吧。至於第一个的 a href 代表什麽意思呢?第一个 a 代表 sanitize 允许 a 这个 tag ,第二个 href 跟第一个 a 中间没有逗号分开,代表 sanitize 允许 a 这个 tag 使用 href 这个 attribute。你要是不信的话,打入 <a href="
http://lightyror.blogspot.com" target="_blank">Haha</a>之类的程式,他只会出现
<a href="
http://lightyror.blogspot.com">Haha</a>
只有 href 这个 attribute 会被保留,其他的删无赦 XD。如果你想让 a 这个 tag 加入 target attribute ,那麽就这样写吧。
def sanitize( html, okTags='a href target, b, br, i, p' )
如此他就会保留 href 跟 target 这两个 attribute。最後,当我们输入这样的 HTML <a href="
http://lightyror.blogspot.com">Haha 有头无尾的 html code ,神奇的是他居然会补齐 tag 成
<a href="
http://lightyror.blogspot.com">Haha</a>
恩,这个东西实做相当完整,看起来十分有用。
--
lighty RoR 是一个介绍 lighttpd , SQLite , Ruby and Rails 的 Blog
http://lightyror.blogspot.com/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.218.90.242