programing

PHP MySQLI SQL 주입 방지

randomtip 2022. 12. 1. 23:33
반응형

PHP MySQLI SQL 주입 방지

곧 가동될 웹 사이트를 구축했습니다. SQL 주입 방지와 관련하여 몇 가지 질문이 있습니다. 사용 방법은 잘 알고 있습니다.mysqli_real_escape_string다만 SQL 문에 대해 취득하는 모든 변수에 대해 그것을 사용해야 하는지, 아니면 select 문을 실행할 때도 사용해야 하는지, 아니면 insert update 및 delete 시에만 사용해야 하는지 궁금할 뿐입니다.또, 사이트를 가동하기 전에, 그 밖에 어떤 시큐러티를 실장하는 것을 추천하고 싶은지 가르쳐 주세요.잘 부탁드립니다.

모든 쿼리는 읽기 또는 쓰기, 지속성 또는 과도성 여부에 관계없이 주입할 수 있습니다.주입은 1개의 쿼리를 종료하고 다른 쿼리를 실행함으로써 실행할 수 있습니다(을 사용하여 가능).mysqli)는, 목적의 쿼리를 무관하게 합니다.

외부 소스로부터의 쿼리에 대한 입력은 사용자로부터의 입력이든 내부 입력이든 쿼리에 대한 인수 및 쿼리 컨텍스트 내의 파라미터로 간주해야 합니다.쿼리의 모든 매개 변수를 매개 변수로 지정해야 합니다.이를 통해 적절한 파라미터화된 쿼리가 생성되어 인수로 준비된 스테이트먼트를 생성하여 실행할 수 있습니다.예를 들어 다음과 같습니다.

SELECT col1 FROM t1 WHERE col2 = ?

?는 파라미터의 플레이스 홀더입니다.사용.mysqli, 를 사용하여 준비된 스테이트먼트를 작성할 수 있습니다.prepare를 사용하여 변수(예:)를 파라미터에 바인드합니다.bind_param를 사용하여 쿼리를 실행합니다.execute당신은 논쟁을 완전히 없앨 필요가 전혀 없습니다(사실 그렇게 하는 것은 해롭습니다). mysqli널 위해서야전체 프로세스는 다음과 같습니다.

$stmt = $mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();

매개 변수화된 쿼리와 준비된 문 사이에는 중요한 차이점도 있습니다.이 문장은 작성되어 있어도 파라미터화 되지 않기 때문에 주입에 취약합니다.

$stmt = $mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");

요약:

  • 모든 쿼리는 파라미터가 없는 경우를 제외하고 적절하게 파라미터화해야 합니다.
  • 쿼리에 대한 모든 인수는 소스에 관계없이 가능한 한 적대적으로 취급해야 합니다.

언급URL : https://stackoverflow.com/questions/16282103/php-mysqli-prevent-sql-injection

반응형