簡體   English   中英

提交簡單 PHP 表單時出現禁止錯誤

[英]Forbidden Error When Submitting Simple PHP Form

我有一個不復雜的問題......這似乎比它應該的更復雜。

我有一個簡單的表單,用於向網站添加內容。 有些字段需要輸入 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。

這是一個可以用 .htaccess 修復的奇怪的 apache 錯誤嗎? PHP中是否有與此沖突的模塊?

-------編輯這里是答案--------

Ben 提出了一個奇妙的答案,這可能是問題所在,由於缺乏特權,我無法解決它。 因此,我根據 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來替換#@! 回到一個 < 並且至少使事情起作用。

我騎在馬上....嘿!

感謝你的幫助。 :)

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

要對此進行測試,請嘗試將 htaccess 文件添加到您的 Web 根目錄中(假設您可以使用 htaccess 覆蓋 apache 設置)並設置:

SecFilterEngine Off

重新啟動apache,然后查看它是否仍在發生。

如果這是共享主機,或者您無法修改 apache 設置,您可以嘗試使用 javascript 在提交 (onsubmit) 之前對所有數據進行base64 編碼的解決方法,然后使用 base64_decode($_POST[key])在處理它的 php 腳本中。

<IfModule mod_security.c>
  SecFilterEngine Off
  SecFilterScanPOST Off
</IfModule>

使用此代碼我認為這解決了您的問題

只是在提交時遇到了同樣的問題,顯示 403 錯誤,但對我來說這很簡單,因為表單太大觸發了 mod_security 上的規則。

還值得增加 php.ini post_max_size和測試大小使用: $_SERVER['CONTENT_LENGTH']

就我而言,在 cPanel 中禁用 MOD 安全性為我解決了這個問題。

<IfModule mod_security.c>
SecRuleEngine Off
SecRequestBodyAccess Off
</IfModule>

<IfModule mod_security.c>
  SecFilterEngine Off
  SecFilterScanPOST Off
</IfModule>

在我的 htaccess 文件中添加這個后,問題就解決了。

可能有點晚了,但我今天在嘗試通過 POST 提交表單時遇到了類似的問題。 它不允許我提交帶有鏈接的文本,並且會拋出 403 Forbidden Acess Denied 錯誤。 禁用 modsecurity(我從控制面板執行此操作)解決了它!

該問題是由 Apache Firewall mod 引起的,如果您不能或不想編輯 httpd.conf,也可以通過 .htaccess 文件修復它。

在調用腳本的目錄(通常是 index.php 所在的位置)中創建或編輯現有的 .htaccess 文件並添加以下行:

<IfModule mod_security.c>
#SecRuleEngine Off
SecRequestBodyAccess Off
</IfModule>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM