Ho un problema non complicato ...... che sembra essere più complicato di quanto dovrebbe essere.Errore proibito durante l'invio di un semplice modulo PHP
Ho un modulo semplice che viene utilizzato per aggiungere contenuto a un sito Web. Alcuni dei campi devono essere inseriti in html. Tuttavia, quando inserisci determinati elementi html nelle diverse parti del modulo, decide che ti odia e genera un errore 403 proibito. Ecco il modulo sottostante:
<?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>
Ho altre forme che seguono questo stesso modello senza alcuna difficoltà. Per renderlo ancora più confuso, questo errore viene generato solo quando vengono forniti 2 elementi HTML nell'area di testo (gestisce un elemento html). Le aree di testo sono annunci, parole chiave, stipendi e lavori. Le altre aree di testo lo prenderanno bene, ma queste 4 non lo faranno. Se riesco a rendere questo un po 'più confuso, se inserisco semplicemente il testo in quei campi e lo salvo, funziona senza problemi.
Per gestire i dati del post, utilizzo solo mysql_real_escape_string() per gestire i dati, non eseguo strip_tags() poiché ho bisogno dell'html.
Si tratta di un errore di apache strano che può essere risolto con .htaccess? C'è un modulo in PHP che è in conflitto con questo?
------- EDIT Ecco la risposta --------
Ben allevato una risposta fantastica che è probabilmente il problema e non riesco a risolvere il problema a causa di una mancanza di privilegi . Così ho creato un evento onsubmit da un'idea che Gerben mi ha dato e ha scritto il seguente 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;
}
Quindi sul lato ricevente, ho eseguito uno str_replace per sostituire # @! di nuovo a un < e che almeno ha fatto funzionare la cosa.
Sono a cavallo .... hyaa!
Grazie per tutto il vostro aiuto. :)
Puoi inserire anche il codice che si occupa dell'elaborazione dell'invio? Potrebbe trattarsi di un problema di reindirizzamento o di gestione degli errori generato dal php di convalida. –
L'url ha un aspetto diverso quando si invia il modulo, come previsto per l'url della pagina del modulo stesso? – Gerben
@BenD Non c'è davvero alcun codice responsabile dell'elaborazione dell'invio. È una semplice istruzione foreach che scorre attraverso le $ _POST vars e lancia su mysql_real_escape_string. Non c'è alcuna convalida javascript. Basta premere invio, carica la stessa pagina, cade semplicemente in un'istruzione switch che dovrebbe atterrare nell'area per aggiornare le informazioni. Funziona per tutto il resto (stessa dichiarazione foreach) su altre parti del sito, ma non qui quando sono coinvolti più elementi html. – n0nag0n