2013-11-24 79 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

还值得注意的是,你可以直接在'DELETE'上放置'SELECT'的WHERE子句并添加一个'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();