다른 답변은 이미 알아야 할 사항을 다룹니다. 하지만 좀 더 명확히하면 도움이 될 수 있습니다.
다음 두 가지 작업을 수행해야합니다.
1. 양식 데이터의 유효성을 검사합니다.
로 조나단 홉스 '응답 쇼는 매우 명확 양식 입력을위한 HTML 요소의 선택을 위해 신뢰할 수있는 모든 필터링을하지 않습니다.
유효성 검사는 일반적으로 데이터를 변경하지 않지만 "이 항목을 수정하십시오"로 표시된 필드와 함께 양식을 다시 표시하는 방식으로 수행됩니다.
대부분의 프레임 워크와 CMS에는이 작업에 도움이되는 양식 작성기가 있습니다. 뿐만 아니라 공격의 또 다른 형태 인 CSRF (또는 "XSRF")에 대해서도 도움이됩니다.
2. SQL 문에서 변수 삭제 / 이스케이프 ..
.. 또는 준비된 진술이 당신을 위해 일을하도록하십시오.
사용자가 제공하거나 제공하지 않은 변수를 사용하여 (My) SQL 문을 작성하는 경우 이러한 변수를 이스케이프하고 인용해야합니다.
일반적으로 MySQL 문에 삽입하는 이러한 변수는 문자열이거나 PHP가 안정적으로 MySQL이 소화 할 수있는 문자열로 변환 할 수있는 변수 여야합니다. 예 : 숫자.
문자열의 경우 여러 방법 중 하나를 선택하여 문자열을 이스케이프해야합니다. 즉, MySQL에서 부작용이있는 모든 문자를 대체해야합니다.
- 구식 MySQL + PHP에서는 mysql_real_escape_string ()이 작업을 수행합니다. 문제는 잊기 너무 쉽기 때문에 준비된 명령문이나 쿼리 작성기를 반드시 사용해야한다는 것입니다.
- MySQLi에서는 준비된 문을 사용할 수 있습니다.
- 대부분의 프레임 워크와 CMS는이 작업에 도움이되는 쿼리 작성기를 제공합니다.
숫자를 다루는 경우 이스케이프와 따옴표를 생략 할 수 있습니다 (이것이 준비된 명령문에서 유형을 지정할 수있는 이유입니다).
데이터베이스 자체가 아니라 SQL 문에 대한 변수 를 이스케이프한다는 점을 지적하는 것이 중요 합니다 . 데이터베이스는 원래 문자열을 저장하지만 명령문에는 이스케이프 된 버전이 필요합니다.
이 중 하나를 생략하면 어떻게됩니까?
양식 유효성 검사를 사용하지 않지만 SQL 입력을 삭제하면 모든 종류의 잘못된 작업이 발생할 수 있지만 SQL 주입은 표시되지 않습니다! (*)
첫째, 계획하지 않은 상태로 신청서를 보낼 수 있습니다. 예를 들어 모든 사용자의 평균 연령을 계산하고 싶지만 한 사용자가 해당 연령에 대해 "aljkdfaqer"를 지정하면 계산이 실패합니다.
둘째, 고려해야 할 다른 모든 종류의 인젝션 공격이있을 수 있습니다. 예를 들어 사용자 입력에 javascript 또는 기타 항목이 포함될 수 있습니다.
데이터베이스에 여전히 문제가있을 수 있습니다. 예를 들어 필드 (데이터베이스 테이블 열)가 255 자로 제한되고 문자열이 그보다 긴 경우. 또는 필드에 숫자 만 허용되고 대신 숫자가 아닌 문자열을 저장하려고 시도하는 경우. 그러나 이것은 "주입"이 아니라 "응용 프로그램 충돌"일뿐입니다.
그러나 유효성 검사없이 입력을 허용하는 자유 텍스트 필드가 있어도 데이터베이스 문으로 이동할 때 적절하게 이스케이프하면 그대로 데이터베이스에 저장할 수 있습니다. 이 문자열을 어딘가에서 사용하려는 경우 문제가 발생합니다.
(*) 아니면 이건 정말 이국적인 것입니다.
SQL 문에 대한 변수를 이스케이프하지 않고 양식 입력의 유효성을 검사 한 경우 여전히 잘못된 작업이 발생하는 것을 볼 수 있습니다.
첫째, 데이터를 데이터베이스에 저장하고 다시로드하면 더 이상 동일한 데이터가 아닌 "번역에서 손실"될 위험이 있습니다.
둘째, 잘못된 SQL 문이 발생하여 애플리케이션이 중단 될 수 있습니다. 예를 들어 어떤 변수에 따옴표 또는 큰 따옴표 문자가 포함되어 있으면 사용하는 따옴표 유형에 따라 잘못된 MySQL 문이 표시됩니다.
셋째, 여전히 SQL 주입이 발생할 수 있습니다.
양식의 사용자 입력이 이미 필터링 / 검증 된 경우, 입력이 하드 코딩 된 옵션 목록으로 축소되거나 숫자로 제한되는 경우 의도적 인 SQl 삽입 가능성이 줄어들 수 있습니다. 그러나 SQL 문에서 변수를 제대로 이스케이프하지 않으면 자유 텍스트 입력을 SQL 주입에 사용할 수 있습니다.
양식 입력이 전혀 없더라도 파일 시스템에서 읽거나 인터넷에서 스크랩 한 등 모든 종류의 소스에서 가져온 문자열을 가질 수 있습니다. 아무도 이러한 문자열이 안전하다고 보장 할 수 없습니다.
<select>
. 실제로 약간 기술적 인 사용자라도 브라우저 콘솔을 사용하여 추가 옵션을 추가 할 수 있습니다. 당신이 화이트리스트 사용 가능한 값의 배열을 유지하고 대한 입력을 비교하면 (원치 않는 값을 방지하기 때문에 당신은해야한다), 당신은을 완화 할 수