Intereting Posts
Вход с Amazon говорит, что пользователь не согласился, но у них есть – Alexa SMAPI PHP / mySQL – как вставить вложенные строки в многомерную матрицу SQL Как и как phpize – Не удается найти config.m4. phpseclib – Могу ли я подключиться с использованием имени пользователя, ключа и пароля (а не ключевой фразы) Невозможно назначить роли пользователям, использующим базу данных (пул ролей пуст) Задание переменной sessionigniter с переменной не работает Выйти из уязвимости XSS, поддерживая синтаксис Markdown? CodeIgniter с фатальной ошибкой PHPExcel не может переопределять класс IOFactory PHP: Как установить текущий рабочий каталог таким же, как каталог, выполняющий скрипт phpmyadmin, отображающий странные символы (utf8) Как выполнить необработанные запросы с помощью Laravel 5.1? PHP: Как отправить «JSON» с помощью метода PUT? Безопасный запрос ajax GET / POST для сервера SoapClient: невозможно найти обертку «https»

Запрещенная ошибка при отправке простой 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 не будут. Если я могу сделать это еще немного запутанным, если я просто вложу текст в эти поля и сохраню его, он будет работать без проблем.

Чтобы обрабатывать данные post, я использую mysql_real_escape_string () для обработки данных, я не делаю strip_tags (), поскольку мне нужен html.

Является ли это странной ошибкой apache, которая может быть исправлена ​​с помощью .htaccess? Есть ли в PHP модуль, который противоречит этому?

——- ИЗМЕНИТЬ ЗДЕСЬ ОТВЕТ ——–

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

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

Учитывая, что вы можете публиковать сообщения, и что ваша пост-обработка, по-видимому, чрезвычайно проста и вряд ли будет метать 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 [key]) в скрипте php, который обрабатывает его.

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

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

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