문제

대화를 시작할 수 있는 몇 가지 방법은 다음과 같습니다.

  1. 초기화 시 모든 입력을 이스케이프합니다.
  2. 가급적이면 SQL을 생성할 때 각 값을 이스케이프하세요.

첫 번째 솔루션은 차선책입니다. 웹 페이지에 출력하는 것과 같이 SQL 이외의 다른 항목에서 사용하려면 각 값을 이스케이프 해제해야 하기 때문입니다.

두 번째 솔루션이 훨씬 더 합리적이지만 각 값을 수동으로 이스케이프 처리하는 것은 고통스럽습니다.

나는 알고있다 준비된 진술, 그러나 내가 찾은 MySQLi 번거롭다.또한 쿼리를 입력과 분리하는 것이 걱정됩니다. 올바른 순서를 얻는 것이 중요하지만 실수하기 쉽고 잘못된 데이터를 잘못된 필드에 쓰기 때문입니다.

도움이 되었습니까?

해결책

@Rob Walker가 말했듯이 매개변수화된 쿼리가 최선의 방법입니다.최신의 뛰어난 PHP를 사용하고 있다면 다음을 살펴보는 것이 좋습니다. PDO (PHP 데이터 개체).이는 광범위한 데이터베이스(물론 MySQL 포함)와 명명된 매개변수가 있는 준비된 명령문을 지원하는 기본 데이터베이스 추상화 라이브러리입니다.

다른 팁

준비된 진술이 최선의 답변입니다.실수할 수 있기 때문에 테스트를 하게 됩니다!

보다 이것 질문.

나는 준비된 진술을 사용하여 갈 것입니다.준비된 명령문을 사용하려면 아마도 PHP용 PDO 함수를 확인하고 싶을 것입니다.이를 통해 준비된 명령문을 쉽게 실행할 수 있을 뿐만 아니라 mysql_, mysqli_ 또는 pgsql_로 시작하는 함수를 호출하지 않음으로써 좀 더 데이터베이스에 구애받지 않게 할 수 있습니다.

PDO는 언젠가는 그만한 가치가 있을 수 있지만 아직은 그 수준에 도달하지 못했습니다.DBAL이며 벤더 간 전환을 더 쉽게 만드는 것이 강점입니다.실제로 SQL 주입을 잡기 위해 빌드된 것은 아닙니다.

어쨌든 입력 내용을 이스케이프 처리하고 위생적으로 처리하려면 준비된 명령문을 사용하는 것이 좋은 방법이 될 수 있습니다.나는 그것이 훨씬 쉽다고 믿지만, 예를 들어.활용하여 필터.

저는 항상 첫 번째 솔루션을 사용해 왔습니다. 왜냐하면 99%의 경우 변수가 $_GET, $_POST, 그리고 $_COOKIE 브라우저에 출력되지 않습니다.또한 (쿼리에서 따옴표를 사용하지 않는 한) 실수로 SQL 삽입으로 코드를 작성하지 않을 것입니다. 반면 두 번째 솔루션을 사용하면 결국 문자열 중 하나를 이스케이프하는 것을 쉽게 잊어버릴 수 있습니다.

사실 제가 항상 그런 식으로 해왔던 이유는 제 모든 사이트에 기본적으로 Magic_quotes 설정이 켜져 있고, 이 두 솔루션 중 하나를 사용하여 많은 코드를 작성한 후에는 변경하는 데 많은 작업이 필요하기 때문입니다. 다른 하나에게.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top