У меня непростая проблема … это кажется сложнее, чем должно быть.
У меня есть простая форма, которая используется для добавления контента на веб-сайт. В некоторых из полей должен быть введен 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> </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 (я сделал это с панели управления) решил!