У меня есть непростая проблема ... это кажется сложнее, чем должно быть.Запретная ошибка при отправке простой формы 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> </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 модуль, который противоречит этому?
------- EDIT ВОТ ОТВЕТ --------
Бен воспитан фантастический ответ, который, вероятно, проблема, и я не могу исправить это из-за отсутствия льгот , Поэтому я создал событие 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!
Благодарим за помощь. :)
Можете ли вы также опубликовать код, который отвечает за обработку представления? Это может быть проблема перенаправления или ошибки, сгенерированная с помощью проверки php. –
Является ли URL-адрес другим при отправке формы, как предполагалось в URL-адресе самой страницы формы? – Gerben
@BenD На самом деле нет никакого кода, отвечающего за обработку представления. Это простой оператор foreach, который запускается через vars_post и бросает на них mysql_real_escape_string. Нет никакой проверки javascript. Вы просто попали в submit, он загружает одну и ту же страницу, он просто попадает в оператор switch, который должен поместить его в область для обновления информации. Он работает для всего остального (тот же оператор foreach) на других частях сайта, только не здесь, когда задействовано несколько элементов html. – n0nag0n