2013-06-10 1 views
1

나는 최근에 pdo를 조사하기 시작했는데, 그 이유는 mysql을 너무 오랫동안 사용 해왔기 때문이다. 지금 당장 일부 스크립트를 PDO로 번역하고 있습니다.내 사이트를 PDO로 번역하는 것은 맞습니까?

주입으로 완전히 안전한가요?

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

$stmt = $db->prepare("SELECT id,name FROM users WHERE name = '$name'"); 
$stmt->execute(); 
$row = $stmt->fetch(); 



$stmt = $db->query("SELECT *, tr.name, t.name AS teamName FROM player AS p 
       LEFT JOIN team_ranks AS tr ON tr.id = p.rank_id 
       LEFT JOIN teams AS t on t.id = tr.team_id 
       WHERE p.id = {$row['id']}"); 
$row = $stmt->fetch(); 

답변

6

짧은 대답 : 아니오. 당신은 준비된 진술을 오해했습니다.

이 줄은 여전히 ​​PHP 큰 따옴표 확장을 사용하여 정적 SQL 문자열을 생성합니다. PDO/MySQL은 변수가 어디에 있는지 알지 못하므로 주입으로부터 당신을 보호 할 수 없습니다.

$stmt = $db->prepare("SELECT id,name FROM users WHERE name = '$name'"); 

은 무엇 당신이해야 할 것은 이것이다 : 여기

$stmt = $db->prepare("SELECT id,name FROM users WHERE name = :name"); 

, :name 데이터베이스 말에 전달되는 자리 표시 자입니다 "이 사항이 실행 실제로 때 여기에 변수가 될 것입니다."

$stmt->bindParam(':name', $name, PDO::PARAM_STR); 
$stmt->execute(); 

: PDO에게 매개 변수에 대한 자세한 정보를 제공하는

$stmt->execute(array(':name' => $name)); 

다른 방법으로, bindParam()을 사용할 수 있습니다 : 다음 함수에 인수를 전달하는 것처럼, 당신은 그 자리에 값을 전달하여 실행하기 이제 데이터베이스는 전달 된 변수가 SQL로 해석되지 않고 하나의 문자열로 취급되어야하므로 코드를 쿼리에 삽입 할 수있는 방법이 없다는 것을 알고 있습니다.

관련 문제