2012-01-11 8 views
5

मेरे पास कोई जटिल समस्या नहीं है ...... जो कि यह होना चाहिए उससे अधिक जटिल होना प्रतीत होता है।सरल PHP फॉर्म सबमिट करने पर निषिद्ध त्रुटि

मेरे पास एक साधारण रूप है जिसका उपयोग वेबसाइट पर सामग्री जोड़ने के लिए किया जाता है। कुछ क्षेत्रों में एचटीएमएल को इनपुट करने की आवश्यकता है। हालांकि, जब आप फॉर्म के विभिन्न हिस्सों में कुछ HTML तत्व इनपुट करते हैं, तो यह निर्णय लेता है कि यह आपको नफरत करता है और एक प्रतिबंधित 403 त्रुटि फेंकता है। नीचे दिया गया फॉर्म यहां दिया गया है:

<?php 
    $data = f("SELECT * FROM table WHERE id = '{$_GET['id']}'"); 
?> 
<form action="<?=$_SERVER['PHP_SELF']?>?id=<?=$_GET['id']?>&action=edit" method="post"> 
    <table cellspacing="0" cellpadding="2" border="0"> 
     <tr> 
      <td><b>Title:</b></td> 
      <td><input type="text" name="title" style="width: 300px;" value="<?=$data['title']?>" /></td> 
     </tr> 
     <tr> 
      <td><b>URL:</b></td> 
      <td><input type="text" name="url" style="width: 300px;" value="<?=$data['url']?>" /></td> 
     </tr> 
     <tr> 
      <td><b>Sub-Category:</b></td> 
      <td> 
       <select name="subCategoryId"> 
        <option value=""></option> 
        <option value="1">A</option> 
        <option value="2">B</option> 

       </select> 
      </td> 
     </tr> 
     <tr> 
      <td><b>Short Description:</b></td> 
      <td><textarea name="shortDescription" rows="6" cols="60"><?=$data['shortDescription']?></textarea></td> 
     </tr> 
     <tr> 
      <td><b>Template:</b></td> 
      <td><textarea name="template" rows="6" cols="60"><?=$data['template']?></textarea></td> 
     </tr> 
     <tr> 
      <td><b>Ads:</b></td> 
      <td><textarea name="ads" rows="6" cols="60"><?=$data['ads']?></textarea></td> 
     </tr> 
     <tr> 
      <td><b>Keywords:</b></td> 
      <td><textarea name="keywords" rows="6" cols="60"><?=$data['keywords']?></textarea></td> 
     </tr> 
     <tr> 
      <td><b>Questions:</b></td> 
      <td><textarea name="questions" rows="6" cols="60"><?=$data['questions']?></textarea></td> 
     </tr> 
     <tr> 
      <td><b>Salary:</b></td> 
      <td><textarea name="salary" rows="6" cols="60"><?=$data['salary']?></textarea></td> 
     </tr> 
     <tr> 
      <td><b>Jobs:</b></td> 
      <td><textarea name="jobs" rows="6" cols="60"><?=$data['jobs']?></textarea></td> 
     </tr> 
     <tr> 
      <td><b>Meta Description:</b></td> 
      <td><input type="text" name="metaDescription" style="width: 300px;" value="<?=$data['metaDescription']?>" /></td> 
     </tr> 
     <tr> 
      <td><b>Meta Keywords:</b></td> 
      <td><input type="text" name="metaKeywords" style="width: 300px;" value="<?=$data['metaKeywords']?>" /></td> 
     </tr> 
     <tr> 
      <td>&nbsp;</td> 
      <td><input type="submit" name="submit" value="Edit Job" /></td> 
     </tr> 
    </table> 
</form> 

मेरे पास अन्य रूप हैं जो बिना किसी परेशानी के इस पैटर्न का पालन करते हैं। इसे और भी भ्रमित करने के लिए, यह केवल इस त्रुटि को फेंक देगा जब पाठ क्षेत्र में 2 एचटीएमएल तत्वों की आपूर्ति की जाती है (यह एक HTML तत्व को ठीक से संभालती है)। टेक्स्ट क्षेत्र विज्ञापन, कीवर्ड, वेतन और नौकरियां हैं। अन्य टेक्स्ट एरिया इसे ठीक लगेगा, लेकिन ये 4 नहीं होंगे। अगर मैं इसे थोड़ा और भ्रमित कर सकता हूं, अगर मैं उन क्षेत्रों में पाठ में सरल प्रवेश करता हूं और इसे सहेजता हूं, तो यह बिना किसी समस्या के चलता है।

पोस्ट डेटा को संभालने के लिए, मैं डेटा को संभालने के लिए केवल mysql_real_escape_string() का उपयोग करता हूं, मैं स्ट्रिप_टैग() नहीं करता क्योंकि मुझे वहां HTML की आवश्यकता है।

क्या यह एक अजीब अपाचे त्रुटि है जिसे .htaccess के साथ ठीक किया जा सकता है? क्या PHP में कोई मॉड्यूल है जो इसके साथ संघर्ष कर रहा है?

------- संपादित करें यहाँ जवाब है --------

बेन एक शानदार जवाब है कि शायद समस्या है लाया है और मैं इसे विशेषाधिकारों की कमी की वजह से ठीक नहीं कर सकते । इसलिए मैंने एक विचार से एक ऑनसबमिट कार्यक्रम बनाया जिसने गेर्बेन ने मुझे दिया और निम्नलिखित जावास्क्रिप्ट लिखा।

function awesome() { 
     elements = document.forms[0].elements; 
     for(var i = 0; i < elements.length; i++) { 
      switch(elements[i].name) { 
       case "ads": 
       case "shortDescription": 
       case "template": 
       case "questions": 
       case "salary": 
       case "jobs": 
        str = elements[i].value; 
        elements[i].value = str.replace(/</g,"#@!"); 
        break; 
      } 
     } 
     return true;  
    } 

फिर प्राप्त करने के अंत में, मैंने # @ को बदलने के लिए str_replace किया था! < पर वापस आ गया और कम से कम इस काम को काम किया।

मैं घोड़े पर हूं .... हाया!

आपकी सभी मदद के लिए धन्यवाद। :)

+1

क्या आप जमा कोड को संसाधित करने के प्रभारी कोड भी पोस्ट कर सकते हैं? यह मान्य php द्वारा उत्पन्न एक रीडायरेक्ट या त्रुटि-हैंडलर समस्या हो सकती है। –

+1

क्या प्रपत्र सबमिट करते समय यूआरएल अलग दिखता है, जैसा प्रपत्र पृष्ठ के यूआरएल के रूप में माना जाता है? – Gerben

+0

@BenD वास्तव में सबमिशन को संसाधित करने के प्रभारी कोई कोड नहीं है। यह $ _POST युद्धों के माध्यम से चलाने के लिए एक सरल foreach स्टेटमेंट है और उन पर एक mysql_real_escape_string फेंक दें। कोई जावास्क्रिप्ट सत्यापन नहीं है। आप बस सबमिट करते हैं, यह एक ही पृष्ठ लोड करता है, यह सिर्फ एक स्विच स्टेटमेंट में पड़ता है जिसे जानकारी को अपडेट करने के लिए क्षेत्र में इसे जमीन पर रखना चाहिए। यह साइट के अन्य हिस्सों पर अन्य सभी चीज़ों (समान फोरैच स्टेटमेंट) के लिए काम करता है, बस यहां नहीं जब कई HTML तत्व शामिल होते हैं। – n0nag0n

उत्तर

7

यह देखते हुए कि आप पोस्ट करने में सक्षम हैं, और यह कि आपका पोस्ट-हैंडलिंग स्पष्ट रूप से बेहद सरल है और 403 त्रुटियों को फेंकने या वर्जित निर्देशिकाओं पर रीडायरेक्ट करने की संभावना नहीं है, मैं अनुमान लगा रहा हूं कि आप ' एक अपाचे-स्तर फ़ायरवॉल चला रहे हैं। अपनी अपाचे कॉन्फ़िगरेशन फ़ाइलों को देखें, और यह देखने के लिए जांचें कि क्या आप mod_security या किसी अन्य फ़ायरवॉल मॉड्यूल को लोड कर रहे हैं या नहीं। एचटीएमएल सामग्री के लिए पोस्ट डेटा स्कैनिंग और तदनुसार प्रतिक्रिया देकर mod_security को कॉन्फ़िगर किया जा सकता है। अगर यह एचटीएमएल इंजेक्शन को रोकने के लिए कॉन्फ़िगर किया गया है, तो यह आपका मुद्दा हो सकता है (यहां कॉन्फ़िगरेशन विवरण देखें: http://www.modsecurity.org/projects/modsecurity/apache/feature_content_injection.html)।

SecFilterEngine Off 

पुनः प्रारंभ अपाचे और फिर देखें कि यह अभी भी हो रहा है:

इस परीक्षण के लिए, (यह मानते हुए आप इनको साथ अपाचे सेटिंग को ओवरराइड करने की अनुमति है) और सेटिंग अपने वेब जड़ में एक htaccess फ़ाइल जोड़ने का प्रयास करें।

इसे एक साझा मेजबान है, या आप अन्यथा अपाचे सेटिंग्स को संशोधित करने की क्षमता नहीं है, तो आप एक समाधान जावास्क्रिप्ट का उपयोग करने की कोशिश कर सकते हैं कि base64 encodes सभी डेटा (ऑनसबमिट), और फिर base64_decode ($ _ पोस्ट [प्रस्तुत करने से पहले कुंजी]) php स्क्रिप्ट में जो इसे संसाधित करता है।

+1

मुझे लगता है कि मैं उस सुविधा को ओवरराइड नहीं कर सकता। मैंने phpinfo किया(); और मुझे फ़ायरवॉल, या mod_security के बारे में कुछ भी नहीं मिला। मैंने कोड को एचटीएसीएएस फ़ाइल में इनपुट करने का प्रयास किया और उसने मुझे एक आंतरिक सर्वर त्रुटि 500 ​​दिया। यह एक और ग्राहक खाता है और वे fastwebhost.com का उपयोग कर रहे हैं जो .... यदि आप गलत सांस लेते हैं तो आपके आईपी को ब्लॉक करता है। – n0nag0n

+0

आपकी मदद के लिए धन्यवाद। मैंने इसे आपके साथ और गेर्बेन की मदद से समझ लिया। – n0nag0n

+0

यह भी एक अच्छा विचार है। मेरा और अधिक ...... नौसिखिया और ..... हाँ सिर्फ नौसिखिया है। :) – n0nag0n

1

सबमिट पर उसी तरह की समस्या थी, जिसमें 403 त्रुटि दिखाई दी लेकिन मेरे लिए यह आसान था क्योंकि फ़ॉर्म mod_security पर नियम को बहुत बड़ा कर रहा था।

इसके अलावा बढ़ती php.ini post_max_size और परीक्षण आकार का उपयोग लायक: $_SERVER['CONTENT_LENGTH']

0

देर abit हो सकता है, लेकिन मैं आज एक ऐसी ही समस्या का सामना करना पड़ा पोस्ट के माध्यम से एक फ़ॉर्म सबमिट करने का प्रयास करेगा। यह मुझे एक लिंक के साथ एक पाठ जमा करने की अनुमति नहीं देगा और 403 निषिद्ध अतिरिक्त अस्वीकार त्रुटि फेंक देगा। modsecurity को अक्षम करना (मैंने इसे नियंत्रण कक्ष से किया) इसे हल किया!

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