2013-06-02 2 views
1

PHP에서 PDO의 bindParam() 함수에서 전달하는 데이터 유형을 지정해야하는 이유에 대해 다소 혼란 스럽습니다. 예 :bindParam()에서 매개 변수 유형을 지정해야하는 이유는 무엇입니까?

$calories = 150; 
$colour = 'red'; 
$sth = $dbh->prepare('SELECT name, colour, calories 
FROM fruit 
WHERE calories < ? AND colour = ?'); 
$sth->bindParam(1, $calories, PDO::PARAM_INT); 
$sth->bindParam(2, $colour, PDO::PARAM_STR, 12); 
$sth->execute(); 

세 번째 매개 변수를 지정하지 않으면 보안 상 위험 할 수 있습니까?

$sth->bindParam(1, $calories); 
$sth->bindParam(2, $colour); 

답변

1

이 유형 bindParam() 안전 간주 될 수 사용이 더욱 SQL 주입을 방지, 엄격한 검증을 할 수 있기 때문에, : 난 그냥 bindParam()에서 할 경우 내 말은. 그러나 실제 보안 위험이 관련되어 있다고 말하지는 않습니다. 그런 식으로하지 않으면 더 많이 입력 확인보다 SQL 주입을 방지하는 prepared statement입니다. 당신은 사전을 사용하는 의무를하지 않을

$calories = 150; 
$colour = 'red'; 

$sth = $dbh->prepare('SELECT name, colour, calories 
         FROM fruit 
         WHERE calories < :calories AND colour = :colour'); 

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

, 당신은 또한 지금 막 당신처럼 그것을 할 수 있습니다이를 달성하기위한 간단한 방법은 단순히이처럼 execute() 함수에 배열을 전달하는 대신 bindParam()을 사용하는 것입니다 questionmarks와 함께 배열에 같은 순서로 놓습니다. 그러나이 방법이 완벽하게 작동하더라도 첫 번째 매개 변수를 사용하는 습관을 만드는 것이 좋습니다.이 메서드는 특정 수의 매개 변수에 도달하면 혼란입니다. 완료되는 위해, 다음과 같이 표시됩니다 : 당신은 유형을 지정하지 않으면

$calories = 150; 
$colour = 'red'; 

$sth = $dbh->prepare('SELECT name, colour, calories 
         FROM fruit 
         WHERE calories < ? AND colour = ?'); 

$sth->execute(array($calories, $colour)); 
+0

이전 mysql_x 함수에서 $ (id) $ id를 사용하지 않고 $ id를 사용했다면; 그리고 우리가 mysql_real_escape_string ($ id)를 사용했다하더라도 우리는 여전히 SQL injection을 얻을 수있다. 그러나 PDO에서 동일합니까? –

+0

[Prepared statements] (http://en.wikipedia.org/wiki/Prepared_statement)는 쿼리 서버 측을 준비하고 매개 변수를 바인딩하여 MySQL 주입을 피하는 데 도움이됩니다. 그것을하는 당신의 방법은 잘못이 아니었다, 나는 적어도 당신에게 그것을하는 더 쉬운 방법을 보여주고 있었다, 최소한 내 의견으로는. – PLPeeters

+0

두 방법이 모두 올바른 것으로 알고 있습니다. 내가 알고 싶은 것은 예를 들어, 공격자가 $ _POST [ 'id'] = '1 or 3 = 3'과 같은 id 값을 제공하는 경우입니다. 이것은 항상 사실이지만, 이렇게하면 : $ id = (int) $ id; 위의 공격은 일어나지 않습니다. 그래서 내가 알고 싶은 것은 PDO에서 $ _POST [ 'id']를 bindParam() 함수에 넣을 수 있습니까? 그 'id'가 interger라는 것을 명시하지 않고? –

2

이 매개 변수는 기본적으로 문자열로 결합됩니다. 그러면 다음과 같은 검색어로 끝날 수 있습니다.

SELECT foo FROM bar WHERE baz = '42' 

이것은 문제 일 수도 있고 아닐 수도 있습니다. PHP와 다른 프로그래밍 언어와 마찬가지로 데이터베이스의 유형은 이며 의 형식은입니다. 일반적으로 MySQL은 필요에 따라 숫자 문자열을 암시 적으로 숫자로 변환합니다. 일부 데이터베이스는 특정 작업에 적합한 유형이 필요한 다른 데이터베이스보다 엄격합니다. 대부분의 경우 차이가 거의 없습니다. 그러나 실제로 42를 42이 아니라 '42'이 아닌 것으로 전달해야하는 경우이를 명시 적으로 INT으로 바인딩해야합니다.

관련 문제