2011-12-05 6 views
6

내가 준비하고있는 변수를 전달 사용하는 경우 PDO 당신이 변수를 탈출 할 필요가 없습니다 읽을 실행 :DB 입력을 이스케이프 처리해야합니까?

$st = $dbh->prepare("INSERT INTO mytable (name,email) VALUES (?,?)"); 
$st->execute(array($_POST['name'], $_POST['email'])); 

이 트루인가?

아니면 $ _POST로 처리해야합니까?

+1

이스케이프가 필요하지 않지만 입력 값에서 정상, 허용 범위, 올바른 형식의 전자 메일 등을 확인하고 적절한 경우 사용자에게 오류 메시지를 반환하십시오. –

+0

예, 나는 단지 SQL 공격에 대해 궁금합니다. – JohnSmith

+0

쿼리에 넣는 위치와 수행 할 위치에 대해 엄격한 한 (예 : 항상 매개 변수 사용, 사용자 제공 데이터의 누출 허용 안함) 동적 쿼리의 연결된 부분으로) 그러면 안전 할 것입니다. – Polynomial

답변

5

준비된 명령문에서 이스케이프 처리는 필요하지 않습니다. 이스케이프 처리하면 이중 이스케이프가 발생하여 이스케이프 처리 된 데이터가 DB에 기록됩니다.

그러나 PDO 준비 문은 모든 쿼리 변형을 처리 할 수 ​​없으며 때때로 "외부"데이터를 쿼리 문자열에 직접 삽입해야합니다. 즉, 이스케이프 처리를 올바르게 수행해야합니다. 특히 테이블 및/또는 필드 이름이 변경되는 동적 쿼리는 준비된 문을 사용하여 지정할 수 없습니다. 예 :

SELECT ? FROM ? WHERE ?=? 

할 수 없습니다. 자리 표시 자로 값만 지정할 수 있습니다.

+0

을 선택 하시겠습니까? 어디에서? = 작동하지 않는 것 같습니다. 분명히 값만 가질 수 있습니까? ... – JohnSmith

+0

정확합니다. 필드 및 테이블 이름은 자리 표시 자로 지정할 수 없습니다. –

2

짧은 대답 : 아니오, 아무 것도 피할 필요가 없습니다. 파라미터 화 된 쿼리는 입니다. :

긴 대답 :이 데이터베이스에 무슨으로 아니, 당신은 아무것도 을 탈출 할 필요가 없습니다. 그러나 XSS 공격을 막기 위해 검색어의 데이터베이스 출력을 표시 할 때는 여전히 htmlspecialchars을 사용해야합니다. 그렇지 않으면 임의의 입력란에 다음과 같은 내용이 쌓이게됩니다.

<script type="text/javascript">alert('sup, I'm in ur site!');</script>.

+1

데이터베이스 출력을 표시 할 때 *를 강조합니다. 필드가 실제로 HTML이 아닌 한 일반적으로 데이터베이스에 HTML을 저장하지 않아야합니다 **. – phihag

2

이것은 사실입니다. 코드는 정확합니다 ($_POST['name']이 설정되지 않은 경우를 처리 할 수도 있음).

PDO의 prepared statement 기능은 명시 적 이스케이프가 필요없는 형식으로 값을 전달합니다.

+1

PDO가 실제로 이스케이프 처리를 수행하지 않는다는 점에 유의하는 것이 중요합니다. 단지 데이터를 쿼리 언어에서 완전히 분리하기 때문입니다. – Polynomial

+0

@ Polynomial Thanks, updated. – phihag

관련 문제