요즘 MS-SQL이나 Oracle로 구축된 사이트의 경우 개발언어가 무엇이든간에 DB성능상의 이유로 Prepared Statement 를 사용해서 구축된다. 이럴때는 SQL에 변수를 바인딩하기 때문에 SQL Injection 공격을 당할 소지 자체가 원천적으로 사라진다.
하지만 mysql의 경우 Prepared Statement를 이상한 형태로 지원한다. MySQL은 SQL문의 실행계획을 DB레벨이 아니라 Connection레벨에서 유지한다. 즉, 커넥션 끊어버리면 실행계획이 다 날아간다. 따라서 Permanent Connection 이나 Connection Pooling을 사용할 때나 실행계획 재사용이라는 Prepared Statement의 이점을 누릴 수 있다. 하지만 php 개발하는데 누가 커넥션 풀링을 사용하나? (간혹 있는데 대부분의 중소 사이트는 그렇지 않다.) 따라서 자연스럽게 Prepared Statement를 하지 않고 Text로 SQL을 조립하는 방향으로 개발하게 된다. 10년전.. MSSQL이나 Oracle세계에서 쓰던 방식이 되겠다... 하아....
결과적으로, 변수받아서 SQL을 조립할 때 SQL Injection 방지를 위한 별도의 처리를 해주지 않으면 해커들에게 "날 잡아잡수쇼~" 하는게 되는 것이다.
모든 변수에다가 별도처리해주려면 그야말로 환장을 한다. 어흐흐흐. mysql은 빨리 제대로 된 Prepared Statement 를 지원하라!!!!!!!! -_-;;;;;;;;;
Posted by maceo

