2012-01-11 13 views
5

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>&nbsp;</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. :)

+1

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. –

+1

L'url ha un aspetto diverso quando si invia il modulo, come previsto per l'url della pagina del modulo stesso? – Gerben

+0

@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

risposta

7

Dato che sei in grado di pubblicare e che il tuo post-trattamento è apparentemente estremamente semplice e così improbabile che possa generare 403 errori o reindirizzare a directory proibite, ho intenzione di azzardare un'ipotesi che tu sia " ri eseguendo un firewall a livello di apache. Dai un'occhiata ai tuoi file di configurazione di apache e controlla se stai utilizzando mod_security o qualsiasi altro modulo firewall caricato. Esistono diversi modi per configurare mod_security, inclusa la scansione dei dati POST per il contenuto HTML e la reazione di conseguenza. Se è configurato per prevenire l'html injection, questo potrebbe essere il tuo problema (vedi i dettagli di configurazione qui: http://www.modsecurity.org/projects/modsecurity/apache/feature_content_injection.html).

Per verificare ciò, provare ad aggiungere un file .htaccess nella root web (supponendo che si è permesso di ignorare le impostazioni di Apache con .htaccess) e impostazione:

SecFilterEngine Off 

Riavviare apache e poi vedere se è ancora accadendo.

Se questo è un host condiviso, o che altrimenti non hanno la possibilità di modificare le impostazioni di Apache, si può provare una soluzione utilizzando JavaScript che base64 encodes tutti i dati prima di inviare (onsubmit), e poi base64_decode ($ _ POST [ chiave]) nello script php che lo elabora.

+1

Sto pensando che non è possibile ignorare quella funzione. Ho fatto phpinfo(); e non ho visto nulla sul firewall, o mod_security. Ho provato a inserire il codice in un file htaccess e mi ha dato un errore interno del server 500. Si tratta di un altro account client e stanno usando fastwebhost.com che .... blocca il tuo IP se respira male. – n0nag0n

+0

Grazie per il vostro aiuto. L'ho capito con il tuo e l'aiuto di Gerben. – n0nag0n

+0

Anche questa è un'ottima idea. Il mio è più ...... novizio e ..... sì, proprio alle prime armi. :) – n0nag0n

1

Appena avuto lo stesso tipo di problema su submit ha mostrato errore 403 ma per me è stato semplice perché il modulo era troppo grande innescando una regola su mod_security.

vale anche aumentando php.ini post_max_size e le dimensioni di prova utilizzando: $_SERVER['CONTENT_LENGTH']

0

potrebbe essere un po 'nervosa in ritardo, ma ho affrontato un problema simile oggi durante il tentativo di presentare un modulo attraverso il POST. Non mi avrebbe permesso di inviare un testo con un link e avrei lanciato un errore 403 Proibito accesso negato. Disabilitare la modsecurity (l'ho fatto dal pannello di controllo) l'ho risolto!

Problemi correlati