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부 모범 사례