2010-05-24 11 views
13

में उपयोगकर्ता इनपुट से बचें/स्वच्छ करें I वेब अनुप्रयोग बनाने के लिए क्लोजर/रिंग/कंपोजर-0.4/एनकिव स्टैक का उपयोग कर रहा हूं।क्लोजर/कंपोज़र

क्या इस स्टैक में कोई फ़ंक्शन है जो या तो HTML या HTML-encode (यानी <a> से &lt;a&gt;) को XSS हमलों को रोकने के लिए उपयोगकर्ता द्वारा आपूर्ति किए गए तारों को स्ट्रिप करेगा?

उत्तर

3

यह पता चला है कि डिफ़ॉल्ट रूप से HTML से बचें यदि आप HTML तत्व में टेक्स्ट डालने के लिए net.cgrand.enlive-html/content का उपयोग करते हैं।

(sniptest "<p class=\"c\"></p>" [:.c] (content "<script></script>")) 
"<p class=\"c\">&lt;script&gt;&lt;/script&gt;</p>" 
14

अद्यतन:

user> (require '[ring.util.codec :as c]) 
nil 
user> (c/url-encode "<a>") 
"%3Ca%3E" 
user> (c/url-decode "<a>") 
"<a>" 

इन रैपर के आसपास java.net.URLEncoder और java.net.URLDecoder हैं: मैं वहाँ पता था कि अधिक से अधिक होना ही था ...

ring-core से ring.util.codec एक कार्यों कहा जाता है जो इतना की तरह काम किया है । अपाचे कॉमन्स की कक्षा के आधार पर, वही नामस्थान बेस 64 एन्कोडिंग से निपटने के लिए कार्य प्रदान करता है।


मूल उत्तर निम्नानुसार है।

मुझे यकीन है कि यह करने के लिए एक सार्वजनिक समारोह है कि क्या वहाँ नहीं कर रहा हूँ, लेकिन Enlive दो निजी कार्यों xml-str और attr-str जो ऐसा करते हैं कहा जाता है: (। attr-str भी निकल जाता है ")

(defn- xml-str 
"Like clojure.core/str but escapes < > and &." 
[x] 
    (-> x str (.replace "&" "&amp;") (.replace "<" "&lt;") (.replace ">" "&gt;"))) 

आप उस समारोह में @#'net.cgrand.enlive-html/xml-str के साथ प्राप्त कर सकते हैं (क्लोजर वास्तव में निजी ...) या बस इसे अपने नामस्थान पर कॉपी करने के लिए नहीं करता है।

+0

यह एक बमर का थोड़ा सा है। अधिकांश क्लोजर वेब ढांचे में एक प्रमुख निरीक्षण की तरह लगता है। –

+1

स्पष्ट रूप से स्थिति बहुत खराब नहीं है: अद्यतन उत्तर देखें।:-) –

+1

ऐसा लगता है कि मैं Enlive को दोष देने के लिए थोड़ा जल्दी था, लेकिन वैसे भी धन्यवाद। :) –

17

hiccup.util/escape-htmlhiccup में यह करता है। वह फ़ंक्शन कंपोज़र में ही होता था (क्योंकि हिचकी में सभी कार्यक्षमता कंपोज़र का हिस्सा होती थी)। यह एक साधारण काम है कि आप इसे आसानी से लिख सकते हैं हालांकि।

(defn escape-html 
    "Change special characters into HTML character entities." 
    [text] 
    (.. #^String (as-str text) 
    (replace "&" "&amp;") 
    (replace "<" "&lt;") 
    (replace ">" "&gt;") 
    (replace "\"" "&quot;"))) 

वहाँ भी है clojure.contrib.string/escape है, जो चार का एक नक्शा ले जाता है -> स्ट्रिंग भागने दृश्यों और एक स्ट्रिंग और आप के लिए यह निकल जाता है।

user> (clojure.contrib.string/escape {\< "&lt;" \> "&gt;"} "<div>foo</div>") 
"&lt;div&gt;foo&lt;/div&gt;" 

यह, के रूप में यह हो सकता है के रूप में उपयोगी नहीं के रूप में मुझे हमलों क्योंकि आप बहु चरित्र दृश्यों से बचने के लिए चाहते हो सकता है और यह आप नहीं दूँगा। लेकिन यह आपके एचटीएमएल से बचने की जरूरतों के लिए काम कर सकता है।

और फिर इसके लिए कई जावा पुस्तकालय हैं। आप अपाचे कॉमन्स से StringEscapeUtils इस्तेमाल कर सकते हैं:

(org.apache.commons.lang.StringEscapeUtils/escapeHtml4 some-string) 

यह इस उद्देश्य के लिए, हालांकि थोड़ा दिग्गज के रूप में मेरे से टकराई।

+1

StringEscapeUtils http://commons.apache.org/lang/api-release/org/apache/commons/lang/StringEscapeUtils.html – grm

+0

अपडेट किया गया यूआरएल http://commons.apache.org/proper/commons- में सही URL लैंग/javadocs/api-3.1/org/अपाचे/कॉमन्स/lang3/StringEscapeUtils.html –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^