apache अपाचे पर एन्कोडेड स्लैश की अनुमति देने की आवश्यकता है




apache2 apache-config (6)

यह समस्या अपाचे बग 35256 से संबंधित नहीं है। बल्कि, यह बग 46830 से संबंधित है। AllowEncodedSlashes सेटिंग वर्चुअल होस्ट द्वारा विरासत में नहीं है, और वर्चुअल होस्ट का उपयोग कई डिफ़ॉल्ट अपाचे कॉन्फ़िगरेशन में किया जाता है, जैसे कि उबंटू में। वर्कअराउंड एक AllowEncodedSlashes <VirtualHost> कंटेनर ( /etc/apache2/sites-available/default उबंटू में /etc/apache2/sites-available/default ) के अंदर AllowEncodedSlashes सेटिंग को जोड़ना है।

बग 35256 : %2F को PATH_INFO में डीकोड किया जाएगा ( AllowEncodedSlashes को AllowEncodedSlashes देने के लिए प्रलेखन का कहना है कि कोई डिकोडिंग नहीं की जाएगी)

बग 46830 : यदि अनुमति AllowEncodedSlashes On वैश्विक संदर्भ में सेट है, तो यह वर्चुअल होस्ट द्वारा विरासत में नहीं है। आपको प्रत्येक <VirtalHost> कंटेनर में स्पष्ट रूप से AllowEncodedSlashes On सेट करना होगा।

विभिन्न कॉन्फ़िगरेशन अनुभागों को विलय करने के तरीके के लिए प्रलेखन कहता है:

<VirtualHost> अनुभागों के अंदर अनुभाग वर्चुअल होस्ट परिभाषा के बाहर संबंधित खंडों के बाद लागू होते हैं। यह वर्चुअल होस्ट को मुख्य सर्वर कॉन्फ़िगरेशन को ओवरराइड करने की अनुमति देता है।

मैं वर्तमान में एक यूआरएल के भीतर एक यूआरएल रखने की कोशिश कर रहा हूँ। उदाहरण के लिए:

http://example.com/url/http%3A%2F%2Fwww.url2.com

मुझे पता है कि मुझे यूआरएल एन्कोड करना है, जो मैंने किया है, लेकिन अब मुझे अपने ऐप के बजाय सर्वर से 404 त्रुटि मिल रही है। मुझे लगता है कि मेरी समस्या अपाचे के साथ निहित है और निर्देश AllowEncodedSlashes On साथ तय किया जा सकता है।

मैंने httpd.conf के निचले हिस्से में निर्देश को कोई प्रभाव नहीं डालने का प्रयास किया है, और मुझे यह सुनिश्चित नहीं है कि आगे क्या करना है। क्या मैं इसे सही जगह पर डाल रहा हूं? यदि हां, तो क्या किसी के पास कोई अन्य समाधान है?


मैं इस पोस्ट में एक और मुद्दे के लिए आ रहा था। मुझे बस असली जल्दी समझाओ।

मेरे पास एक ही शैली यूआरएल था और यह प्रॉक्सी करने की भी कोशिश कर रहा था।

उदाहरण: प्रॉक्सी अनुरोध /example/ दूसरे सर्वर से अनुरोध करता है।

/example/http:%2F%2Fwww.someurl.com/

समस्या 1: अपाचे का मानना ​​है कि यह एक अवैध यूआरएल है

समाधान: httpd.conf में AllowEncodedSlashes On

समस्या 2: अपाचे एन्कोडेड स्लैश को डीकोड करता है

समाधान: httpd.conf में AllowEncodedSlashes NoDecode को AllowEncodedSlashes NoDecode (अपाचे 2.3.12+ की आवश्यकता है)

समस्या 3: mod_proxy URL को %2F से %252F (जैसे। /example/http:%252F%252Fwww.someurl.com/ ) बदलने के लिए पुनः-एन्कोड (डबल एन्कोड) करने का प्रयास करता है

समाधान: httpd.conf में प्रॉक्सी के माध्यम से कच्चे यूआरएल को पास करने के लिए प्रॉक्सीपास कीवर्ड nocanon का उपयोग करें।

ProxyPass http://anotherserver:8080/example/ nocanon

httpd.conf फ़ाइल:

AllowEncodedSlashes NoDecode

<Location /example/>
  ProxyPass http://anotherserver:8080/example/ nocanon
</Location>

संदर्भ:


मैंने इस समस्या पर भी कई घंटे बर्बाद कर दिए। मैं पार्टी के लिए थोड़ा देर हो चुकी हूं, लेकिन ऐसा लगता है कि अब एक समाधान है।

इस धागे के अनुसार, अपाचे में एक बग है (जैसे) अगर आपके पास AllowEncodedSlashes On , तो यह 404 को रोकता है, लेकिन यह गलती से स्लैश को डीकोड करता है, जो आरएफसी के अनुसार गलत है।

यह टिप्पणी उपयोग करने के लिए एक समाधान प्रदान करती है:

AllowEncodedSlashes NoDecode

निष्पक्ष परीक्षण के बाद, और अपाचे में बग को देखते हुए, मैंने निष्कर्ष निकाला है कि विभिन्न मंचों में प्रस्तावित समाधानों के बावजूद, यह अपाचे में एक अनसुलझा मुद्दा है। बग देखें: https://issues.apache.org/bugzilla/show_bug.cgi?id=35256

मेरे लिए काम करने वाला वर्कअराउंड यूआरआई को दोबारा प्रतिक्रिया देना है ताकि जिस आइटम में बच निकले स्लेश हो, वह पथ के बजाय यूआरआई के क्वेरी सेक्शन में हो। मेरे परीक्षणों से पता चलता है कि जब वे वहां होते हैं, तो उन्हें अपाचे द्वारा फ़िल्टर नहीं किया जाता है, भले ही AllowEncodedSlashes और AcceptPathInfo सेटिंग्स कोई फर्क नहीं पड़ता।

तो: http://test.com/url?http%3A%2F%2Fwww.url2.com

या: http://test.com/url?theURL=http%3A%2F%2Fwww.url2.com

इसके बजाय: http://test.com/url/http%3A%2F%2Fwww.url2.com

इसका मतलब है हमारी परियोजना के लिए एक वास्तुकला परिवर्तन, लेकिन यह अपरिहार्य लगता है। आशा है कि आपको एक समाधान मिलेगा।


सभी परेशानियों के प्रकाश में, मैंने ur64encoding के बाद base64_encoding का चयन किया। यह अपाचे सर्वर सेटिंग्स के साथ बेवकूफ़ बनाने या बग रिपोर्ट देखने के बिना काम करता है। यह क्वेरी अनुभाग में यूआरएल डाले बिना काम करता है।

$enc_url = urlencode(base64_encode($uri_string));

और इसे वापस पाने के लिए

$url = base64_decode(urldecode($enc_url));

http://example.com/admin/supplier_show/8/YWRtaW4vc3VwcGxpZXJz

http://example.com/admin/supplier_show/93/YWRtaW4vc3VwcGxpZXJzLzEwMA%3D%3D


क्लाइंट साइड पर %2F को %252F साथ बदलें।

यह आगे स्लैश का डबल-एन्कोडेड रूप है।

तो जब यह सर्वर तक पहुंच जाता है और समय-समय पर डीकोड किया जाता है तो यह इसे% 2F पर डीकोड कर देगा जो वास्तव में आप चाहते हैं।





apache-config