2013-11-24 5 views
0

Я довольно новый с PDO. Мне интересно, это теперь безопасно от инъекций SQL?Безопасно ли это от инъекций?

$name = isset($_GET['name']) ? $_GET['name'] : null; 

// Fetch some info 
$stmt = $db->prepare("SELECT * FROM players WHERE name = ? AND account_id = ?"); 
$stmt->execute(array($name, $aid)); 
$row = $stmt->fetch(); 

if ($row) { 
$stmt = $db->prepare("DELETE FROM players WHERE id = ?"); 
$stmt->execute(array($row['id'])); 
header("Location: /account"); 
exit(); 
} else { 
header("Location: /account"); 
exit(); 
} 
+5

Да. Использование связанных параметров в '?' Предотвращает SQL-инъекцию. Это не означает, что пользователям не удастся удалить записи, которые у них нет разрешения на удаление. Убедитесь, что пользователь, выполнивший это действие, имеет разрешение на значение для 'name'. (Так как мы не можем видеть какой-либо код, связанный с разрешениями - просто хедз-ап) –

+3

Также стоит отметить, что вы можете поместить предложение 'WHERE' из' SELECT' непосредственно на 'DELETE' и добавить' TOP 1 'или' LIMIT 1' в зависимости от ваших dbms, чтобы получить тот же результат с одним запросом. Если вы не находитесь в транзакции pdo, ваш код уязвим для одновременной модификации. – Dan

ответ

0

Да, код безопасен от инъекций SQL. Вы можете использовать Dan's advice и объединить операторы с данными:

$stmt = $db->prepare("DELETE FROM players WHERE name = ? AND account_id = ? LIMIT 1"); 
$stmt->execute(array($name, $aid)); 
header("Location: /account"); 
exit(); 
Смежные вопросы