너무 간단하지 않습니다. 대신 리터럴 값 만 대신에 SQL 식으로 응용 프로그램 변수를 보간의 바인딩 매개 변수를 사용할 수 있습니다
$sql = "SELECT * FROM MyTable WHERE id = ".$_GET["id"]; // not safe
$sql = "SELECT * FROM MyTable WHERE id = ?"; // safe
하지만 당신은 리터럴 값 외에 쿼리의 일부 동적을해야하는 경우?
$sql = "SELECT * FROM MyTable ORDER BY ".$_GET["sortcolumn"]; // not safe
$sql = "SELECT * FROM MyTable ORDER BY ?"; // doesn't work!
매개 변수는 항상 열 식별자가 아니라 값으로 해석됩니다. 과 다른 ORDER BY 'score'
을 사용하여 쿼리를 실행할 수 있으며 매개 변수를 사용하면 앞의 것으로 해석됩니다. 즉 score
열의 값이 아닌 상수 문자열 'score'
이 해석됩니다.
동적 SQL을 사용하고 응용 프로그램 변수를 쿼리에 삽입하여 원하는 결과를 얻는 경우가 많이 있습니다. 이 경우 검색어 매개 변수가 도움이되지 않습니다. SQL 인젝션 결함을 예방하기 위해서는 여전히 방심하지 않고 코드를 방어해야합니다.
이 작업은 프레임 워크 또는 데이터 액세스 라이브러리에서 수행 할 수 없습니다. SQL 삽입 결함을 포함하는 SQL 쿼리 문자열을 항상 생성 할 수 있으며 데이터 액세스 라이브러리가 SQL 쿼리를보기 전에이 작업을 수행해야합니다. 그렇다면 어떻게 의도적이고 결함이 있는지를 어떻게 알 수 있습니까? 여기
이 방법은 보안 SQL 쿼리를 달성하기 위해 다음과 같습니다
필터 입력. SQL 쿼리에 삽입되는 모든 가변 데이터를 추적합니다. 잘못된 문자를 제거하려면 filters 입력을 사용하십시오.예를 들어, 정수를 예상 할 경우 입력이 정수로 제한되어 있는지 확인하십시오.
출력을 이스케이프 처리합니다.이 컨텍스트의 출력은 데이터베이스 서버에 보내는 SQL 쿼리가 될 수 있습니다. 값에 대해 SQL 쿼리 매개 변수를 사용할 수 있다는 것을 알고 있지만 열 이름은 무엇입니까? mysql_real_escape_string()
이 문자열 값을위한 것과 같이 식별자에 대해 이스케이프/인용 기능이 필요합니다.
코드 리뷰. 누군가가 두 번째 눈 쌍이되도록하고 SQL 코드를 살펴보고 위의 두 기술을 사용하지 않은 곳을 찾을 수 있도록 도와줍니다.
예. ORDER BY를 할 수 없다는 것을 알았습니까? 비트와 매개 변수. 좋은 대답. –
내가 downvote있어? Downvoter, 당신은이 대답이 만족스럽지 않다고 생각하는 이유를 묘사해야합니다. 아마 나는 그것을 향상시킬 수있다. –