Запрещенная ошибка при отправке простой формы PHP - PullRequest
6 голосов
/ 11 января 2012

У меня есть несложная проблема ...... которая кажется более сложной, чем должна быть.

У меня есть простая форма, которая используется для добавления контента на сайт. Для некоторых полей необходимо ввести 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 модуль, который конфликтует с этим?

------- РЕДАКТИРОВАТЬ ЗДЕСЬ ОТВЕТ --------

Бен выдвинул фантастический ответ, который, вероятно, является проблемой, и я не могу ее исправить из-за отсутствия привилегий. Поэтому я создал событие onsmit, исходя из идеи, которую дал мне Гербен, и написал следующий 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, чтобы заменить # @! вернуться к <и это, по крайней мере, заставило вещь работать. </p>

Я на коне .... хяа!

Спасибо за вашу помощь. :)

Ответы [ 6 ]

7 голосов
/ 12 января 2012

Учитывая, что вы можете отправлять сообщения и что ваша обработка сообщений, по-видимому, чрезвычайно проста и поэтому вряд ли выдает 403 ошибки или перенаправляет в запрещенные каталоги, я рискну предположить, что вы запускаете брандмауэр уровня Apache. Просмотрите ваши конфигурационные файлы apache и проверьте, запущен ли у вас mod_security или какой-либо другой загруженный модуль брандмауэра. Существует несколько способов настройки mod_security, в том числе сканирование данных POST для html-содержимого и соответствующая реакция. Если он настроен для предотвращения внедрения html, это может быть вашей проблемой (см. Подробности конфигурации здесь: http://www.modsecurity.org/projects/modsecurity/apache/feature_content_injection.html).

Чтобы проверить это, попробуйте добавить файл htaccess в корневой веб-каталог (при условии, что вы можете переопределить настройки apache с помощью htaccess) и установить:

SecFilterEngine Off

Перезапустите apache и посмотрите, происходит ли оно по-прежнему.

Если это общий хост или у вас нет возможности изменить настройки apache, вы можете попробовать обходной путь, используя javascript, который base64 кодирует все данные перед отправкой (onsubmit), и затем base64_decode ($ _ POST [ключ]) в сценарии php, который его обрабатывает.

2 голосов
/ 11 апреля 2018
<IfModule mod_security.c>
  SecFilterEngine Off
  SecFilterScanPOST Off
</IfModule>

Используйте этот код, я думаю, что это решило вашу проблему

2 голосов
/ 29 июля 2014

Только что такая же проблема при отправке показала ошибку 403, но для меня это было просто, потому что форма была слишком большой, вызывая правило для mod_security.

Также стоит увеличить php.ini post_max_size и размер теста, используя: $_SERVER['CONTENT_LENGTH']

0 голосов
/ 22 июня 2019

В моем случае отключение безопасности MOD в cPanel решило проблему для меня.

0 голосов
/ 07 марта 2019

Проблема вызвана модом Apache Firewall, его также можно исправить с помощью файла .htaccess, если вы не можете или не хотите редактировать httpd.conf.

Создайте или отредактируйте существующий файл .htaccess в каталоге, где вызывается скрипт (обычно там, где находится index.php), и добавьте следующие строки:

<IfModule mod_security.c>
#SecRuleEngine Off
SecRequestBodyAccess Off
</IfModule>
0 голосов
/ 25 июля 2017

Возможно, опоздал, но сегодня я столкнулся с подобной проблемой при попытке отправить форму через POST. Это не позволило бы мне отправить текст со ссылкой и выдало ошибку 403 Forbidden Acess Denied. Отключение modsecurity (я сделал это с панели управления) решило это!

...