2016-07-12 10 views
0

Meine Website wurde vor kurzem gehackt/kompromittiert. Über Google habe ich gelernt, dass es Opfer von Injektionen ist. Ich glaube, ich habe meine Website gesäubert und hoffentlich gesichert, aber ich suche nach Möglichkeiten, um zu verhindern, dass es jemals wieder passiert. Ich bin auf einen Code gestoßen (siehe unten) und wollte wissen ob esVerhindern URL Injektionen

1) arbeiten wird, um solche Angriffe in der Zukunft zu verhindern? und

2) Wo sollte ich diesen Code hinzufügen, wie meine Website in WordPress eingebaut ist.

Jede Hilfe oder sogar bessere Codes, die jemand zur Verfügung stellen kann, wird sehr geschätzt, ich bin neu in der Programmierung.

Code:

<?php 
if(isset($_REQUEST["id"])){ 

if(!is_int($_REQUEST["id"])){ 

//redirect this person back to homepage 

} else { 

$id_raw = trim(htmlentities($_REQUEST["id"])); 
$id_secure = mysql_real_escape_string($id_raw); 
$sql = "SELECT * FROM databasetable WHERE id='".$id_secure."'"; 

} 
} 
?> 
+0

sollten Sie vorbereitete Anweisungen verwenden: http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers – awl19

+0

Dies ist SQL Injection, und ja, es ist schlecht. Als @ awl19 erwähnt, verwenden Sie vorbereitete Anweisungen oder verwenden Sie eine Bibliothek wie MeekroDB (http://meekro.com/), um Ihre Abfragen auszuführen (es würde auch die Datenbankarbeit viel einfacher machen) – mwieczorek

Antwort

1

Sie diese müssen verstehen:

  1. Nichts ist 100% sicher.
  2. Alles, was Sie tun können, ist die Erhöhung der Sicherheitsstufe, indem Sie verschiedene Sicherheitsmaßnahmen wie die Filterung der Benutzereingabe vor dem Abfragen von Datenbanken implementieren, indem Sie vorbereitete Anweisungen verwenden.
  3. Verwenden einer sicheren Verbindung für die Serverinteraktion durch Verschlüsselung der Daten mit SHA oder MD5 oder einer anderen Salzverschlüsselung .
  4. Verwenden von Captcha in Ihren Formularen zum Ausfiltern von Bot-Angriffen.

Soweit Ihr obiger Code betroffen ist:

  1. es nur überprüft, ob die Anfrage-ID eine ganze Zahl ist oder nicht.
  2. Es wird die Sonderzeichen herausgefiltert und dann die Abfrage ausgeführt.

Ich mag würde vorschlagen, dass Sie den folgenden Link, um zu überprüfen:

https://www.owasp.org/index.php/PHP_Top_5

Es Ihnen einen Einblick von dem, wie die Sicherheit in einer Anwendung zu implementieren.

+0

Jede Art von Injektion Angriff (SQL, HTML, XSS) * ist * ein gelöstes Problem und * kann * zu 100% sicher gemacht werden. Du musst nur fleißig sein. - Andere Aspekte von "Sicherheit" können in der Tat immer schwerer werden, besonders wenn man sich mit Social Engineering und dergleichen beschäftigt, über die man wenig bis keinen technischen Einfluss hat. – deceze

3

PDO ist ein Akronym für PHP Data Objects. PDO ist eine schlanke, konsistente Möglichkeit, auf Datenbanken zuzugreifen. Dies bedeutet, dass Entwickler portablen Code viel einfacher schreiben können. PDO ist keine Abstraktionsschicht wie PearDB. PDO ist eher eine Datenzugriffsschicht, die eine vereinheitlichte API (Application Programming Interface) verwendet. Sie haben grundsätzlich zwei Möglichkeiten, dies zu erreichen:

Beispiel:

$qry = $con->prepare('SELECT * FROM student WHERE name = :name'); 

$qry->execute(array('name' => $name)); 

foreach ($qry as $get) { 

// do something with $get 

} 

Einrichten Datenbank PDO mit

$servername = "localhost"; 
$username = "username"; 
$password = "password"; 
$dbname = "myDBPDO"; 

Ein DSN ist im Grunde eine Reihe von Optionen, die PDO sagen, welche Treiber zu verwenden , und die Verbindungsdetails ... Sie können alle Optionen hier PDO MYSQL DSN nachschlagen.

$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username,$password); 

Hinweis: Wenn Sie einen Fehler über Zeichensätze erhalten, stellen Sie sicher, dass Sie den charset Parameter auf den DSN hinzuzufügen. Das Hinzufügen des Zeichensatzes zum DSN ist aus Sicherheitsgründen sehr wichtig. Die meisten Beispiele, die Sie sehen werden, lassen es nicht zu. MÜSSEN SIE DEN CHARSET EINSCHLIESSEN!

Sie können auch einige Attribute nach PDO Konstruktion mit dem setAttribute Verfahren eingestellt:

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$stmt = $conn->prepare("SELECT id, firstname, lastname FROM MyGuests"); 
$stmt->execute(); 

// set the resulting array to associative 
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC); 
foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) { 
    echo $v; 
} 

Die Art und Weise Angriffe Injektionstyp arbeiten, ist durch irgendwie einen Interpreter (Die Datenbank) immer etwas zu bewerten, sollte das waren Daten, als ob es Code wäre. Dies ist nur möglich, wenn Sie Code und Daten auf demselben Medium mischen (zB wenn Sie eine Abfrage als String erstellen) .Parametrisierte Abfragen arbeiten, indem Sie den Code und die Daten separat senden, so dass es nie möglich sein würde, ein Loch zu finden Das.

2

SQL Injection ist eine Art von Sicherheitsanfälligkeit in Anwendungen, die eine SQL-Datenbank verwenden. Die Sicherheitsanfälligkeit tritt auf, wenn eine Benutzereingabe in einer SQL-Anweisung verwendet wird.

$n = $_GET['user']; 
$sql = "SELECT password FROM tbl_login WHERE name = '$n' "; 

Wie Sie den Wert sehen kann der Benutzer in die URL-Variable Benutzer gibt an die Variable $ n zugewiesen bekommen und dann direkt in die SQL-Anweisung platziert. Dies bedeutet, dass der Benutzer die SQL-Anweisung bearbeiten kann.

$name = "admin' OR 1=1 -- "; 
$query = "SELECT password FROM tbl_login WHERE name = '$n' "; 

Die SQL-Datenbank wird dann die SQL-Anweisung wie der folgenden:

SELECT password FROM tbl_login WHERE name = 'admin' OR 1=1 -- ' 

Um SQL-Injektionen zu verhindern wir etwas namens vorbereitete Anweisungen verwenden, müssen die gebundenen Parameter verwendet. Vorbereitete Anweisungen kombinieren keine Variablen mit SQL-Zeichenfolgen. Daher ist es für einen Angreifer nicht möglich, die SQL-Anweisung zu ändern. Vorbereitete Anweisungen kombinieren die Variable mit der kompilierten SQL-Anweisung, das bedeutet, dass die SQL und die Variablen getrennt gesendet werden und die Variablen nur als Zeichenfolgen interpretiert werden und nicht Teil der SQL-Anweisung sind.

Vorbereitete Anweisungen mit mySQLi.

Mit den Methoden in den folgenden Schritten müssen Sie keine anderen SQL-Injection-Filtertechniken wie mysql_real_escape_string() verwenden. Dies liegt daran, dass es mit vorbereiteten Anweisungen nicht möglich ist, konventionelle SQL-Injection durchzuführen.

mySQLi SELECT-Abfrage.

$n = $_GET['user']; 


// Prepare the statement 
if ($sql = $mysqli->prepare("SELECT password FROM tbl_login WHERE name=?")) { 


// Bind a variable to the parameter as a string. 
$sql->bind_param("s", $n); 

// Execute the statement. 
$sql->execute(); 

// Get the variables from the query. 
$sql->bind_result($pass); 

// Fetch the data. 
$sql->fetch(); 


// Close the prepared statement. 
$sql->close(); 
} 
+0

Vielen Dank für Ihr Feedback, wo genau würde ich Ihren Code hinzufügen oder platzieren? Ich bin neu im Programmieren und PHP - also vergib mir meine Ignoranz! Füge ich das zu meiner wp-login.php Datei hinzu? Bitte geben Sie an, wo. – yaw

+0

Sie müssen Ihren Code posten. Wie kann ich möglicherweise wissen, was in wp-login enthalten ist. Aber Sie können Ihre mein sql von PHP-Skript ändern. – Lucky

Verwandte Themen