2015-09-07 3 views
0

Я новичок в программировании на PHP и базе данных и пытаюсь добавить данные из формы в базу данных MySQL. Он отлично работает, но открыт ли он для моей MySQL-инъекции? Я читал много учебников, и я думаю, что подготовленные заявления PDO. Как я могу это сделать для моего поля комментариев, например? Это поле (это текстовое поле) будет достаточно открытым для того, что пользователь хочет поставить. Как я могу написать это, чтобы сделать его более безопасным?Как я могу сделать эту вставку безопасной от MySQL-инъекции?

<?php 
ob_start(); 
$username = 'name'; 
$password = 'pass'; 
$host = 'localhost'; 
$dbname = 'map'; 



try { 
$dbh = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); 
// set the PDO error mode to exception 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$sql = "INSERT INTO Incidents (


     protocol, 
     jurisdiction, 
     date, 
     time, 
     comments, 
     video, 
     lat, 
     lng 



      ) 

     VALUES (


     '".$_POST["protocol"]."', 
     '".$_POST["jurisdiction"]."', 
     '".$_POST["date"]."', 
     '".$_POST["time"]."', 
     '".$_POST["comments"]."', 
     '".$_POST["video"]."', 
     '".$_POST["lat"]."', 
     '".$_POST["lng"]."' 


     ) 

     "; 

// use exec() because no results are returned 
$dbh->exec($sql); 
header("Location: map1.php"); 

} 
catch(PDOException $e) 
{ 
echo $sql . "<br>" . $e->getMessage(); 
} 

$dbh = null; 




ob_end_flush(); 
?> 
+0

см это: http://stackoverflow.com/questions/7043303/php-mysql-injection-protection –

ответ

2

PDO уже намного безопаснее. Теперь вы можете использовать bindParam() для повышения безопасности, как:

<?php 
ob_start(); 
$username = 'name'; 
$password = 'pass'; 
$host = 'localhost'; 
$dbname = 'map'; 

try { 
$dbh = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); 
// set the PDO error mode to exception 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$sql = "INSERT INTO Incidents SET protocol = ?, jurisdiction = ?, date = ?, time = ?, comments = ?, video = ?, lat = ?, lng = ? "; 
$smt->$dbh->prepare($sql); 
$smt->bindParam(1, $_POST["protocol"]); 
$smt->bindParam(2, $_POST["jurisdiction"]); 
$smt->bindParam(3, $_POST["date"]); 
$smt->bindParam(4, $_POST["time"]); 
$smt->bindParam(5, $_POST["comments"]); 
$smt->bindParam(6, $_POST["video"]); 
$smt->bindParam(7, $_POST["lat"]); 
$smt->bindParam(8, $_POST["lng"]); 

// use exec() because no results are returned 
$smt->execute(); 
if($smt->rowCount()) { // if insertion success 
    header("Location: map1.php"); 
} 

} 
catch(PDOException $e) { 
    echo $sql . "<br>" . $e->getMessage(); 
} 

$dbh = null; 

ob_end_flush(); 
?> 
+1

PDO, если это не сделано правильно, не более безопасно, чем API-интерфейсы mysql или mysqli. – Mike

+1

** PDO очень легко изучить и реализовать ** по сравнению с ** mysqli ** Просто откройте и перейдите по ссылке @cosmin. – SHAZ

+0

Кривая обучения довольно субъективна. Некоторые люди более удобны с процедурным кодом стиля и старыми функциями mysql_ *, поэтому переход к mysqli вместо PDO, вероятно, будет немного проще. – Mike

2

Вы уже используете PDO, и это очень хорошо.

Но вы также должны использовать подготовленные операторы, которые должны быть доказательством SQL-инъекции. Проверить эту ссылку для получения дополнительной информации: http://php.net/manual/en/pdo.prepared-statements.php

В качестве примера вставки из дока:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 
0

Вы должны использовать подготовить заявление.

Ну, это сделать:

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

$sql = 'SELECT name, colour, calories 
    FROM fruit 
    WHERE calories < :calories AND colour = :colour'; 

$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); 

$sth->execute(array(':calories' => $variable, ':colour' => $color)); 

$red = $sth->fetchAll(); 

$sth->execute(array(':calories' => 175, ':colour' => 'yellow')); 

$yellow = $sth->fetchAll(); 

Пример первоначально взят из php.net

Вы можете прочитать об этом здесь: http://php.net/manual/en/pdo.prepare.php

Смежные вопросы