2015-09-27 5 views
6

मैं एक विलक्षण क्वेरी का परिणाम लेने की कोशिश कर रहा हूं, और इसके परिणामों को JSON प्रतिक्रिया के रूप में आउटपुट कर रहा हूं। मेरा एप्लिकेशन एचटीएमएल प्रतिक्रिया उत्पन्न करने के लिए स्लिम और ट्विग का उपयोग करता है, हालांकि मुझे अनिश्चितता है कि अगर मुझे जेएसओएन जेनरेट करने के लिए टवीग का उपयोग करना चाहिए।क्या शुद्ध JSON प्रतिक्रिया उत्पन्न करने के लिए Twig का उपयोग करना उचित है?

मुझे पता है कि मैं PHP के मूल echo json_encode(...) फ़ंक्शन का उपयोग कर सकता हूं, लेकिन यदि मेरे डेटाबेस में HTML इकाइयां हैं तो यह एक संभावित XSS भेद्यता बनाता है। टवीग को उचित रूप से मेरे आउटपुट से बचने का प्रभारी माना जाता है।

मुझे this question पता है, हालांकि यह एक प्रासंगिक उत्तर प्रदान नहीं करता है। मैं भी json_encode फिल्टर के बारे में पता कर रहा हूँ, लेकिन जब मैं यह कर:

/api/users-json.twig

{ 
    "rows" : {{rows | json_encode}} 
} 

/API/उपयोगकर्ताओं नियंत्रक:

// Simulate database query results 
$result = [ 
    "rows" => [ 
     [ 
      "user_name" => "alex", 
      "message" => "grawr!"  
     ], 
     [ 
      "user_name" => "h4xx0r", 
      "message" => "<script>alert('hello, I can execute JS on your website!');</script>"  
     ]     
    ] 
]; 

$app->response->headers->set('Content-Type', 'application/json; charset=utf-8'); 
$app->render("api/users-json.twig", $result); 

प्रतिक्रिया इस तरह दिखती है:

{ 
    "rows" : [{&quot;user_name&quot;:&quot;alex&quot;,&quot;message&quot;:&quot;grawr!&quot;},{&quot;user_name&quot;:&quot;h4xx0r&quot;,&quot;message&quot;:&quot;&lt;script&gt;alert(&#039;hello, I can execute JS on your website!&#039;);&lt;\/script&gt;&quot;}] 
} 

जो आगे की प्रक्रिया के बिना व्याख्यात्मक क्लाइंट-साइड नहीं है। मेरे ब्राउज़र के अनुसार, सामग्री-प्रकार सही ढंग से application/json पर सेट है।

मैं, ज़ाहिर है, कर सकते हैं: /api/users-json.twig

{ 
    "rows" : {{rows | json_encode | raw}} 
} 

कौन सा मुझे प्रतिक्रिया देता है:

{ 
    "rows" : [{"user_name":"alex","message":"grawr!"},{"user_name":"h4xx0r","message":"<script>alert('hello, I can execute JS on your website!');<\/script>"}] 
} 

लेकिन अगर मैं h4xx0r के रेंडर करने के लिए थे क्लाइंट-साइड कोड में संदेश, मैं एक एक्सएसएस हमले के लिए खुला हूं।

उत्पादन है कि मेरा मानना ​​है कि 'सही' होगा होगा:

{ 
    "rows" : [{"user_name":"alex","message":"grawr!"},{"user_name":"h4xx0r","message":"&lt;script&gt;alert(&#039;hello, I can execute JS on your website!&#039;);&lt;\/script&gt;"}] 
} 

ध्यान दें कि h4xx0r के "संदेश" अब बच रहा है, लेकिन एक पूरे के रूप प्रतिक्रिया की संरचना मान्य JSON के रूप में संरक्षित है।

मैं निश्चित रूप से प्रत्येक पंक्ति के माध्यम से लूप कर सकता हूं और मैन्युअल रूप से htmlspecialchars प्रत्येक मान, और फिर echo json_encode या इसे टिग से पास कर सकता हूं। लेकिन ऐसा लगता है कि यह टिग की ज़िम्मेदारी होनी चाहिए!

संपादित करें: यह प्रतीत होता है कि PHP के filter_var_array, json_encode के साथ संयुक्त, टहनी का उपयोग करने के लिए एक उचित विकल्प नहीं है:

$app->response->headers->set('Content-Type', 'application/json; charset=utf-8'); 
echo json_encode(filter_var_array($result, FILTER_SANITIZE_SPECIAL_CHARS)); 

का उत्पादन:

{"rows":[{"user_name":"alex","message":"grawr!"},{"user_name":"h4xx0r","message":"&#60;script&#62;alert(&#39;hello, I can execute JS on your website!&#39;);&#60;\/script&#62;"}]} 

लेकिन मैं अभी भी यकीन है कि अगर यह है नहीं कर रहा हूँ कुछ ऐसा है जो इसके बजाय टवीग के साथ "किया जाना चाहिए"।

क्या स्लिम और ट्विग के साथ ऐसा करने का कोई तरीका है? या, क्या मैं पूरी तरह से गलत ट्रैक पर हूं, और क्या मुझे प्रतिपादन से पहले सामग्री से बचने के लिए मेरे क्लाइंट-साइड (जेएस) कोड की ज़िम्मेदारी होनी चाहिए?

+0

मुझे नहीं लगता कि एक्सएसएस एट्रैक को रोकने से टिग की ज़िम्मेदारी है। इसे रोकने के लिए आपको आउटपुट नहीं, अपने इनपुट को फ़िल्टर करना होगा। –

+0

@ गुस्तावो यह सही नहीं है। निश्चित रूप से, आपको हमेशा ** इनपुट ** अपने इनपुट को हमेशा फ़िल्टर करना चाहिए, लेकिन ** भागना ** ऐसा कुछ है जो आउटपुट में किया जाना चाहिए। एस्केपिंग इनपुट एक [एंटीपाटरर्न] है (http://security.stackexchange.com/a/42521/74909)। – alexw

+0

उह, क्या आप अशिष्टता से पूछ रहे हैं? – alexw

उत्तर

0

ट्विग एचटीएमएल एन्कोडेड के रूप में दिए गए किसी भी चर को प्रस्तुत करेगा। हालांकि, जैसा कि आप परिणाम को जेसन करना चाहते हैं, आपको डेटा के माध्यम से पुन: प्रयास करने की आवश्यकता है क्योंकि Twig आपके लिए सरणी में नहीं पहुंचता है।

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

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