2012-01-11 84 views
5

我有一個非複雜的問題......它似乎比它應該更復雜。提交簡單的PHP表單時出現禁止的錯誤

我有一個簡單的表單,用於向網站添加內容。一些字段需要輸入html。但是,當您將某些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元素時纔會拋出此錯誤(它可以很好地處理一個html元素)。文字區域是廣告,關鍵字,工資和工作。其他文字區域將會很好,但這4個不會。如果我可以讓這個更容易混淆,如果我簡單地在這些字段中輸入文本並保存它,它會毫無問題地運行。

爲了處理髮布數據,我只使用mysql_real_escape_string()來處理數據,我不做strip_tags(),因爲我需要那裏的html。

這是一個奇怪的Apache錯誤,可以用.htaccess修復? PHP中是否存在與此衝突的模塊?

-------編輯下面是答案--------

本帶來了一個夢幻般的答案,也可能是問題,我無法修復它,因爲缺乏的特權。所以我從Gerben給我的想法創建了一個onsubmit事件,並寫了下面的javascript。

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來代替#@!回到<,至少讓事情奏效。

我在一匹馬.... hyaa!

感謝您的幫助。 :)

+1

你也可以發佈負責處理提交的代碼嗎?這可能是驗證php生成的重定向或錯誤處理程序問題。 – 2012-01-11 18:52:13

+1

當提交表單時,網址看起來有什麼不同,就像表單頁面本身的url一樣? – Gerben 2012-01-11 19:07:03

+0

@BenD真的沒有任何代碼負責處理提交。這是一個簡單的foreach語句,用於運行$ _POST變量並在其上引發一個mysql_real_escape_string。沒有任何javascript驗證。您只需點擊提交,即可加載相同的頁面,它只是屬於一個switch語句,應該將其置於該區域以更新信息。它適用於網站其他部分的其他所有內容(相同的foreach語句),當涉及多個html元素時,不在此處。 – n0nag0n 2012-01-11 19:38:32

回答

7

鑑於您可以發佈,並且您的後處理顯然非常簡單,因此不太可能會拋出403錯誤或重定向到禁止的目錄,我會冒險猜測,重新運行一個Apache級別的防火牆。看看你的apache配置文件,然後檢查你是否正在運行mod_security或其他加載的防火牆模塊。有多種方式可以配置mod_security,包括掃描HTML數據的POST數據並作出相應的反應。如果配置爲防止html注入,這可能是您的問題(請參閱此處的配置詳細信息:http://www.modsecurity.org/projects/modsecurity/apache/feature_content_injection.html)。

要測試此,嘗試添加一個htaccess文件到您的Web根目錄(假設你被允許覆蓋與htaccess的阿帕奇設置),並設置:

SecFilterEngine Off 

重啓Apache,然後看它是否仍然發生。如果這是一個共享主機,或者你沒有修改apache設置的能力,你可以嘗試使用javascript的解決方法,即提交之前的所有數據(onsubmit),然後base64_decode($ _ POST [ key])在處理它的php腳本中。

+1

我在想我不能重寫該功能。我做了phpinfo();我沒有看到有關防火牆或mod_security的任何信息。我嘗試將代碼輸入到htaccess文件中,它給了我一個內部服務器錯誤500.這是另一個客戶端帳戶,他們正在使用fastwebhost.com,它會阻止您的IP,如果您呼吸錯誤。 – n0nag0n 2012-01-11 21:10:02

+0

感謝您的幫助。我和你和格爾本的幫助一起解決了這個問題。 – n0nag0n 2012-01-11 21:35:22

+0

這也是一個好主意。礦是更多......新手和.....是隻是新手。 :) – n0nag0n 2012-01-11 21:51:29

1

剛剛提交的問題顯示了403錯誤,但對我來說很簡單,因爲表單太大觸發了mod_security的規則。

另外值得一增加的php.ini post_max_size和使用測試尺寸:$_SERVER['CONTENT_LENGTH']

0

可能會晚點升技的,但我今天遇到了類似的問題,而試圖通過POST提交表單。它不會允許我提交帶有鏈接的文本,並會發出403禁止訪問拒絕錯誤。 禁用modsecurity(我是從控制面板中完成的)解決了它!