26.10.2015 Views

Modern PHP - 맛보기 PDF

조시 록하트 저 | 정병렬 역 | 한빛미디어 | 2015년 10월 | 22,000원

조시 록하트 저 | 정병렬 역 | 한빛미디어 | 2015년 10월 | 22,000원

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

preg_replace_all(), preg_replace_callback(), preg_replace() 등의 정규<br />

표현식 함수로 HTML의 위험을 제거하지 않도록 하자. 정규표현식은 복잡하며 입력 HTML이 유효하지 않<br />

을 수도 있기 때문에 오류가 발생할 위험이 높다.<br />

SQL 쿼리<br />

입력 데이터에 기반해서 쿼리를 만들어야 할 때가 있다. 어떤 경우는 HTTP 요청 쿼리 문자열<br />

이 입력 데이터로 사용된다(예: ?user=1 ). 또 어떤 경우는 HTTP 요청 URI의 일부분이 입력<br />

데이터로 사용된다(예: /users/1). 주의를 기울이지 않으면 악당들이 고의적으로 SQL 쿼리<br />

를 망가뜨려 데이터베이스에 엄청난 피해를 입힐 수도 있다. 일례로 나는 [예제 5-2]처럼 $_<br />

GET과 $_POST 데이터를 입력받은 그대로 이어붙여 SQL 쿼리를 만드는 초급 <strong>PHP</strong> 개발자들을<br />

많이 보았다.<br />

예제 5-2 나쁜 SQL 쿼리<br />

$sql = sprintf(<br />

'UPDATE users SET password = "%s" WHERE id = %s',<br />

);<br />

$_POST['password'],<br />

$_GET['id']<br />

이런 방식은 나쁘다! 만약 누군가가 다음과 같은 HTTP 요청을 <strong>PHP</strong> 스크립트로 보내면 어떻<br />

게 될까?<br />

POST /user?id=1 HTTP/1.1<br />

Content-Length: 17<br />

Content-Type: application/x-www-form-urlencoded<br />

password=abc";- -<br />

이 HTTP 요청으로 인해 모든 사용자의 비밀번호가 abc로 바뀌게 된다. 많은 SQL 데이터베이<br />

스가 --를 주석의 시작으로 간주하고 그 뒤에 이어지는 문자열을 무시하기 때문이다. 위험이<br />

제거되지 않은 입력 데이터는 절대 SQL 쿼리에서 사용하면 안 된다. 만약 SQL 쿼리에 입력<br />

54 2부 모범 사례

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!