Frage PHP / Apache-Fehler: 406 nicht akzeptabel


Also habe ich diesen Fehler heute erhalten, ich habe mich auf dieses Problem beschränkt:

Meine Seite ist meine Musikerseite Hier. Es erlaubt den Leuten, hereinzukommen und Fotos von mir zu sehen, Nachrichten, meine Musik und Ereignisse, bei denen ich spiele.

Alles lief anschwellend, ich gab Daten manuell in MySQL ein, um es automatisch auf die Homepage zu bringen. Jetzt füge ich die Systemsteuerung hinzu, damit ich Dinge aus dem Internet hinzufügen, bearbeiten und löschen kann.

Bis auf die Möglichkeit zum Hinzufügen / Bearbeiten von Ereignissen funktioniert alles einwandfrei. Ich habe es auf die Tatsache beschränkt, dass ich 2 URLs nicht eingeben kann oder ich diesen Fehler erhalte. Ich muss 2 URLs eingeben (eine, um die Ereignisseite anzuzeigen, eine, um Tickets zu kaufen), aber ich kann nicht mehr als 1 gleichzeitig eingeben. Gibt es etwas, was ich tun kann, um diesen Fehler zu korrigieren oder zu umgehen, egal ob in Apache oder meinem Code?

<?php
    $specevlink = "http://facebooklink.com";
    $specgigtick = "http://ticketplacelink.com";
?>
     <form method="post" action="index.php?page=editgigs">
         <table>
                <tr>
                     <td>
                          Event Page (Link):
                     </td>
                     <td style="text-align: left;">
                          <input type="url" name="giglink" value="<?php echo $specevlink; ?>" />
                     </td>
                </tr>
                <tr>
                     <td>
                          Event Tickets (Link):
                     </td>
                     <td style="text-align: left;">
                          <input type="url" name="gigtick" value="<?php echo $specgigtick; ?>" />
                     </td>
                </tr>
         </table><br />
         <input type="submit" name="editgig" value="submit" /><br />
         <br />
     </form>

BEARBEITEN:

Ich füge die vollständige Codezeile hinzu, damit Sie genau sehen können, was ich verwende.

Hier ist ein Bild von Schritt 1  Hier ist ein Bild von Schritt 2

Dies ist in einer index.php Datei enthalten:

<?php
if(isset($_GET["page"])){
$page = $_GET["page"];
} else {
$page = "";
}

if($page === "editgigs"){
 include ('inc/logincheck.php');
?>
 <div class="label">
      EDIT GIGS
 </div><br />
 <div style="margin: 0 auto; text-align: center; width: 100%">
      <form method="post" action="index.php?page=editgigs">
<?php
      if(!isset($_POST['selectgigs'])){
           if(!isset($_POST['updgigs'])){
?>
                Select one of the options below:<br />
                <br />
                <select name="selgigs" style="max-width: 26%;">
<?php
                     while($gigsall_data = mysqli_fetch_array($gigsall_query)){
                          $gigid = stripslashes($gigsall_data['idgigs']);
                          $gigdate = stripslashes($gigsall_data['date']);
                          $gigname = stripslashes($gigsall_data['name']);
                          $gigdate = date('F j, Y', strtotime($gigdate));
?>
                          <option value="<?php echo $gigid; ?>">
                               <?php echo $gigdate; ?>: <?php echo $gigname; ?>
                          </option>
<?php
                     }
?>
                </select><br /><br />
                <input type="submit" name="selectgigs" value="Select" /><br />
                <br />
<?php
           }
      }
      if(isset($_POST['selectgigs'])){
           $gigtoed = trim($_POST['selgigs']);
           $specgig_query = mysqli_query($con, "SELECT * FROM `gigs` WHERE `idgigs` = '$gigtoed'") or die(mysqli_error($con));
           $specgig_data = mysqli_fetch_array($specgig_query);
           $specdate = stripslashes($specgig_data['date']);
           $specname = stripslashes($specgig_data['name']);
           $specevlink = stripslashes($specgig_data['evlink']);
           $specgigtick = stripslashes($specgig_data['ticklink']);
           $specnos = stripslashes($specgig_data['noshow']);
           if($specnos === '0'){
                $noshow = '';
           } else {
                $noshow = 'checked';
           }
?>
           <table style="border-spacing: 5px; padding: 10px;">
                <tr>
                     <td>
                          Past Event?:
                     </td>
                     <td style="text-align: left;">
                          <input type="checkbox" name="nos" <?php echo $noshow; ?> /> Past Event
                     </td>
                </tr>
                <tr>
                     <td>
                          Date:
                     </td>
                     <td style="text-align: left;">
                          <input type="date" name="gigdate" value="<?php echo $specdate; ?>" required />
                     </td>
                </tr>
                <tr>
                     <td>
                          Name:
                     </td>
                     <td style="text-align: left;">
                          <input type="text" name="gigname" value="<?php echo $specname; ?>" required />
                     </td>
                </tr>
                <tr>
                     <td>
                          Event Page (Link):
                     </td>
                     <td style="text-align: left; width: 350px;">
                          <input type="url" name="giglink" style="width: 100%;" value="<?php echo $specevlink; ?>" />
                     </td>
                </tr>
                <tr>
                     <td>
                          Event Tickets (Link):
                     </td>
                     <td style="text-align: left; width: 350px;">
                          <input type="url" name="gigtick" style="width: 100%;" value="<?php echo $specgigtick; ?>" />
                     </td>
                </tr>
           </table><br />
           <input type="hidden" name="gigid" value="<?php echo $gigtoed; ?>" />
           <input type="submit" name="updgigs" value="Update" /><br />
           <br />
<?php
      }
      if(isset($_POST['updgigs'])){
           $newid = trim($_POST['gigid']);
           $newdate = mysqli_real_escape_string($con, trim($_POST['gigdate']));
           $newname = mysqli_real_escape_string($con, trim($_POST['gigname']));
           $newlink = mysqli_real_escape_string($con, trim($_POST['giglink']));
           $newtick = mysqli_real_escape_string($con, trim($_POST['gigtick']));
           if(isset($_POST['nos'])){
                $newnoshow = mysqli_real_escape_string($con, '1');
           } else {
                $newnoshow = mysqli_real_escape_string($con, '0');
           }
           echo $newid.' '.$newdate.' '.$newname.' '.$newlink.' '.$newtick.' '.$newnoshow.'<br />';
           /*mysqli_query($con, "UPDATE `gigs` SET `date` = '$newdate', `name` = '$newname', `evlink` = '$newlink', `ticklink` = '$newtick', `noshow` = '$newnoshow' WHERE `idgigs` = '$newid' LIMIT 1") or die(mysqli_error($con));*/ //commented for testing
?>
           <div style="text-align: center;">
                <span class="confirm">
                     Successfully updated click <a href="index.php?page=events">here</a> to view it!
                </span>
           </div>
<?php
      }
?>
      </form>
 </div>
<?php
}

FYI- die logincheck.php ist nichts anderes als zu überprüfen, ob der Benutzer angemeldet ist, wenn sie nicht zurück auf die Homepage gesendet wird.


5
2017-11-22 21:01


Ursprung


Antworten:


Ihre Website generiert einen Fehler, wenn ein Benutzereingabeelement mit einem der beiden beginnt http:// oder https:// .

Wenn ich versuche mit einem Link beginnend mit http:// Ich habe eine 406 nicht akzeptabel:

http://onkore.us/?blah=http://www.google.com

Es ist in Ordnung, wenn ich das versuche:

http://onkore.us/?blah=www.google.com

Sie haben erwähnt, dass Sie Probleme haben, wenn es mehr als einen Link gibt, aber wenn ich versuche, mit zwei Links wie unten, ist es in Ordnung:

http://onkore.us/?blah1=www.google.com&blah2=www.google.com

Sie könnten jedoch entweder das Problem finden oder beheben, das für Ihre Serverkonfiguration spezifisch sein könnte, oder Sie könnten versuchen, ein Problem zu umgehen.

Ich bin mir nicht sicher, ob dieser Workaround hilft, aber bedenkt das http:// oder https:// schaffen das Problem, was ich denke, ist das Entfernen der http:// und https:// von Benutzereingabe. Zuerst sollten Sie versuchen, sich zu ändern <input type="url" zu <input type="text" damit das URL-Format nicht erzwungen wird. Dann könnten Sie Javascript verwenden, um Vorkommen von zu entfernen http:// und https:// von der Benutzereingabe im Formular vor dem Senden an den Server. Außerdem könnten Sie diese vor dem Auffüllen der Formularwerte aus den Daten entfernen.

Hoffe das hilft .

Regex: So entfernen Sie "http: //" von einer URL in JavaScript


5
2017-11-26 01:44



Dieser Fehler bedeutet beispielsweise, dass Sie den Server nach Büchern fragen (und Sie verstehen nur Spanisch). Der Server hat nur englische und deutsche Bücher.
Daher hat der Server Ihre Antwort aber es wird es dir nicht geben, weil er weiß, dass du nichts Nützliches tun wirst oder du etwas Schlechtes damit tun wirst !! (wie zum Beispiel die Bücher nicht lesen und sie an die Köpfe der Menschen werfen).

406 Not Acceptable "ist ein ungewöhnlicher Statuscode - die gebräuchlichsten sind 200, 404, 500, 301. Sie sehen nur eine 406, wenn etwas mit dem Server nicht stimmt, normalerweise etwas Dummes, aber schwer zu diagnostizieren.

Ebenfalls: 

Dieser allgemeine Fehler bedeutet, dass die von Ihnen vorgenommene Anfrage als gefunden wurde   potenzieller Hackversuch zum Server [...]
https://billing.stablehost.com/knowledgebase/178/What-does-406-Not-Acceptable-mean.html


Die häufigste Lösung für diesen Fehler ist mit mod_security verbunden.

1. Mod_Sicherheit

ModSecurity kann den HTTP-Verkehr in Echtzeit überwachen, um   Erkennung von Angriffen [...] als Web Intrusion Detection Tool.   ModSecurity kann auch sofort reagieren, um Angriffe zu verhindern   Ihre Webanwendungen.

Dieser 406-Fehler könnte von mod_security als Antwort von einem möglichen Angriff über POST stammen, wobei einige URLs anstelle von normalem und normalem Text übergeben werden.

Die gängigste Lösung ist das Deaktivieren der POST-Überprüfung und der mod_security-Filterung in htaccess:

<IfModule mod_security.c>
SecFilterEngine Off
SecFilterScanPOST Off
</IfModule>

Führen Sie im Terminal außerdem Folgendes aus:

sudo a2dismod security2_module 
sudo service apache2 restart 

Um ModSecurity zu deaktivieren.

Wenn das nicht funktioniert, bearbeiten Sie die Datei

/etc/apache2/mod-security/modsecurity_crs_10_config.conf

Und füge ein # am Anfang der Zeile, die so etwas hat:

SecDefaultAction “phase:2,log,deny,status:403,t:lowercase,t:replaceNulls,t:compressWhitespace”

Starten Sie schließlich den Apache neu

sudo service apache2 restart


4
2017-11-25 17:05



Ich habe dieses Problem für eine Weile und nur gelegentlich, so dass es schwer zu identifizieren war.

Nach einigen Tests habe ich den Fehler in meinem Fall gefunden. Es mag nicht in dir sein, aber wenn jemand es hat 406 Nicht akzeptabel Fehler, es ist einen Versuch wert.

In meinem Fall trat dieser Fehler auf, wenn die geposteten Daten "shell:" enthielten, was, wie ich vermute, falsch interpretiert wird und ein Fehler ausgelöst wird. Die Lösung für mich bestand darin, diese Zeichenfolge zu ersetzen, bevor sie veröffentlicht wurde.


1
2018-04-01 12:02