PHP
MySQL och PHP - Hur du kan förhindra SQL-injicering
I exemplen nedan har data skickats till php-sidan från inmatningsfält i ett formulär. $_POST["inmatningsfältnamn"] fångar upp data skickad från formuläret.
Mysqli - Procedural stil
Spar exempelkoden nedan i en fil med filändelsen .php
Exempelkod - mysqli_real_escape_string:
Läs från MySQL-databas:
<?php
// connect
$host = "127.0.0.1";
$user = "db_username";
$password = "password for db_username";
$database = "db_name";
$conn = mysqli_connect($host, $user, $password, $database, 3306);
//check connection
if(mysqli_connect_errno()){
echo "Connect failed";
exit();
}
echo "Connected to database";
// escape input
$input = $_POST["city"];
$city = mysqli_real_escape_string($conn, $input);
echo '<p>'.$city.'</p>'."\n";
// execute query
$query = "SELECT FirstName FROM users WHERE city = '$city'";
$result = mysqli_query($conn, $query);
// fetch values
while($list = mysqli_fetch_assoc($result)){
echo $list["FirstName"].'<br/>'."\n";
}
// close connection
mysqli_close($conn);
?>
Skriv till MySQL-databas:
<?php
// connect
$host = "127.0.0.1";
$user = "db_username";
$password = "password for db_username";
$database = "db_name";
$conn = mysqli_connect($host, $user, $password, $database, 3306);
//check connection
if(mysqli_connect_errno()){
echo "Connect failed";
exit();
}
echo "Connected to database";
// escape input
$firstname = mysqli_real_escape_string($conn, $_POST["firstname"]);
$lastname = mysqli_real_escape_string($conn, $_POST["lastname"]);
$city = mysqli_real_escape_string($conn, $_POST["city"]);
// execute query
$query = "INSERT INTO users (FirstName, LastName, city) VALUES ('$firstname', '$lastname', '$city')";
mysqli_query($conn, $query);
echo "<p>Data saved</p>";
// close connection
mysqli_close($conn);
?>
Exempelkod - mysqli_stmt_bind_param:
Läs från MySQL-databas:
<?php
// connect
$host = "127.0.0.1";
$user = "db_username";
$password = "password for db_username";
$database = "db_name";
$conn = mysqli_connect($host, $user, $password, $database, 3306);
//check connection
if(mysqli_connect_errno()){
echo "Connect failed";
exit();
}
echo "Connected to database";
$stmt = mysqli_prepare($conn, "SELECT FirstName FROM users WHERE city = ?");
mysqli_stmt_bind_param($stmt, 's', $city);
$city = $_POST["city"];
// execute prepared statement
mysqli_stmt_execute($stmt);
// bind variables to prepared statement
mysqli_stmt_bind_result($stmt, $col1);
// fetch values
while(mysqli_stmt_fetch($stmt)){
printf("%s<br/>\n", $col1);
}
// close statement
mysqli_stmt_close($stmt);
// close connection
mysqli_close($conn);
?>
Skriv till MySQL-databas:
<?php
// connect
$host = "127.0.0.1";
$user = "db_username";
$password = "password for db_username";
$database = "db_name";
$conn = mysqli_connect($host, $user, $password, $database, 3306);
//check connection
if(mysqli_connect_errno()){
echo "Connect failed";
exit();
}
echo "Connected to database";
$stmt = mysqli_prepare($conn, "INSERT INTO users (FirstName, LastName, city) VALUES (?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $city);
$firstname = $_POST["firstname"];
$lastname = $_POST["lastname"];
$city = $_POST["city"];
// execute prepared statement
mysqli_stmt_execute($stmt);
// close statement
mysqli_stmt_close($stmt);
echo "<p>Data saved</p>";
// close connection
mysqli_close($conn);
?>
Mysqli - Objekt-orienterad stil
Spar exempelkoden nedan i en fil med filändelsen .php
Exempelkod - mysqli::real_escape_string:
Läs från MySQL-databas:
<?php
// connect
$host = "127.0.0.1";
$user = "db_username";
$password = "password for db_username";
$database = "db_name";
$mysqli = new mysqli($host, $user, $password, $database);
// check connection
if($mysqli->connect_error){
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
} else {
echo "Connected to database";
}
// escape input
$city = $mysqli->real_escape_string($_POST["city"]);
$query = "SELECT FirstName FROM users WHERE city = '$city'";
if($result = $mysqli->query($query)){
while($list = $result->fetch_assoc()){
echo $list["FirstName"].'<br/>'."\n";
}
}
// close connection
$mysqli->close();
?>
Skriv till MySQL-databas:
<?php
// connect
$host = "127.0.0.1";
$user = "db_username";
$password = "password for db_username";
$database = "db_name";
$mysqli = new mysqli($host, $user, $password, $database);
// check connection
if($mysqli->connect_error){
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
} else {
echo "Connected to database";
}
$firstname = $mysqli->real_escape_string($_POST["firstname"]);
$lastname = $mysqli->real_escape_string($_POST["lastname"]);
$city = $mysqli->real_escape_string($_POST["city"]);
$query = "INSERT INTO users (FirstName, LastName, city) VALUES ('$firstname', '$lastname', '$city')";
$mysqli->query($query);
echo "<p>Data saved</p>";
// Close the connection
$mysqli->close();
?>
Exempelkod - mysqli_stmt::bind_param:
Läs från MySQL-databas:
<?php
// connect
$host = "127.0.0.1";
$user = "db_username";
$password = "password for db_username";
$database = "db_name";
$mysqli = new mysqli($host, $user, $password, $database);
// check connection
if($mysqli->connect_error){
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
} else {
echo "Connected to database";
}
if($stmt = $mysqli->prepare("SELECT FirstName FROM users WHERE city = ?")){
// Bind parameters
$stmt->bind_param('s', $city);
$city = $_POST["city"];
//Execute it
$stmt->execute();
//Bind results
$stmt->bind_result($result);
// fetch values
while($stmt->fetch()){
printf("%s<br/>\n", $result);
}
//close statement
$stmt->close();
}
// close connection
$mysqli->close();
?>
Skriv till MySQL-databas:
<?php
// connect
$host = "127.0.0.1";
$user = "db_username";
$password = "password for db_username";
$database = "db_name";
$mysqli = new mysqli($host, $user, $password, $database);
// check connection
if($mysqli->connect_error){
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
} else {
echo "Connected to database";
}
if($stmt = $mysqli->prepare("INSERT INTO users (FirstName, LastName, city) VALUES (?, ?, ?)")){
// Bind parameters
$stmt->bind_param('sss', $firstname, $lastname, $city);
$firstname = $_POST["firstname"];
$lastname = $_POST["lastname"];
$city = $_POST["city"];
//Execute it
$stmt->execute();
//close statement
$stmt->close();
}
echo "<p>Data saved</p>";
// close connection
$mysqli->close();
?>
Mer info:
Vanliga säkerhetshål och lösningar
How can I prevent SQL injection in PHP?
mysqli::real_escape_string / mysqli::escape_string /mysqli_real_escape_string
mysqli_stmt::bind_param / mysqli_stmt_bind_param


