2014-06-12 2 views
0

나는 기존 응용 프로그램에이 코드를 발견Doctrine 1은 SQL 인젝션을 허용합니까?

$salt = $this->generateSalt(); 
$new_pass_update = Doctrine_Query::create() 
    ->update('User') 
    ->set('password', '"'. $this->hash($newPass, $salt) .'"') 
    ->set('salt', "sleep(10)") // $salt) <- I replaced this 
    ->where('email = ?', array($mail)) 
    ->getDql();     
die($new_pass_update); 

나는이 DQL가 출력으로 생성 된보고 충격을 받았다 : 모든

UPDATE User SET password = "3dbe00a167653a1aaee01d93e77e730e" 
salt = sleep(10) WHERE email = ? 

첫째, 나는 인용 부호를 볼 것으로 예상하지 않았다 암호 값 주변. 나는 교리 나를 위해 그렇게 할 것이라고 thougt, 그래서 나는 그들없이 두 번째 인수를 시도하지만이 DQL가 출력으로 생성 된보고 충격을 받았다 : 나는 변경하는 경우

UPDATE User SET password = "3dbe00a167653a1aaee01d93e77e730e" 
salt = sleep(10) WHERE email = ? 

-> getDql()에 대한 -> 실행()는 정확히 실행 된 쿼리이고 db는 10 초 동안 휴면합니다.

왜 doctrine이 이와 같이 작동합니까? 검보는 지적

+0

세 번째 매개 변수로 값을 전달해야한다고 생각합니다. 'set ('salt ','? ','sleep (10) ')'. – Gumbo

+0

와우, 좋은 캐치. 대답을 게시 할 수 있도록 받아 들일 수 있습니까? –

답변

1

오른쪽 API는 * 업데이트 구문은 교리 1. 사용 : "?"

$new_pass_update = Doctrine_Query::create() 
    ->update('User') 
    ->set('password', "?", $this->hash($newPass, $salt)) 
    ->set('salt', "?", $salt) 
    ->where('email = ?', array($mail)) 
    ->execute(); 

그래서, 두 번째 인수가 있어야한다 세 번째 것은 연관된 값입니다.

관련 문제