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
'programing' 카테고리의 다른 글
다른 어레이를 기반으로 키를 기준으로 어레이를 정렬하시겠습니까? (0) | 2022.12.01 |
---|---|
팬더, 빈 끈으로 NaN 대체 (0) | 2022.12.01 |
collections.defaultdict는 어떻게 작동합니까? (0) | 2022.12.01 |
컴포넌트가 재렌더되는 원인을 특정하는 방법 (0) | 2022.12.01 |
gcc는 C 및 C++ 헤더파일을 어디에서 검색합니까? (0) | 2022.12.01 |