programing

PDO 준비문은 얼마나 안전합니까?

starjava 2023. 7. 26. 21:32
반응형

PDO 준비문은 얼마나 안전합니까?

얼마 전부터 PDO가 준비한 성명서를 사용하기 시작했으며, 제가 이해하기로는 모든 탈출/보안이 가능합니다.

예를 들어 $_POST['title']가 양식 필드라고 가정합니다.

$title = $_POST['title'];
$query = "insert into blog(userID, title) values (?, ?)"
$st = $sql->prepare($query);
$st->bindParam(1, $_SESSION['user']['userID'], PDO::PARAM_INT);
$st->bindParam(2, $title);
$st->execute();

이게 정말 안전한가요?제가 다른 일을 해야 하나요?제가 또 고려해야 할 사항은 무엇입니까?

감사해요.

엄밀히 말하면 매개 변수 값이 쿼리 문자열에 삽입되지 않기 때문에 실제로 이스케이프가 필요하지 않습니다.

쿼리 매개 변수가 작동하는 방법은 호출할 때 쿼리가 데이터베이스 서버로 전송되는 것입니다.prepare()매개 변수 값은 나중에 전송됩니다.execute()따라서 쿼리의 텍스트 형식과는 별도로 유지됩니다.SQL 주입 기회가 전혀 없습니다(제공).PDO::ATTR_EMULATE_PREPARES거짓).

예, 쿼리 매개 변수는 이러한 형태의 보안 취약성을 방지하는 데 도움이 됩니다.

보안 취약점에 대해 100% 입증이 가능합니까?아니, 물론 아니지.쿼리 매개 변수는 SQL 식에서 단일 리터럴 값만 대체합니다.단일 매개 변수를 값 목록 대신 사용할 수 없습니다. 예:

SELECT * FROM blog WHERE userid IN ( ? );

매개 변수를 사용하여 테이블 이름 또는 열 이름을 동적으로 만들 수 없습니다.

SELECT * FROM blog ORDER BY ?;

다른 유형의 SQL 구문에는 매개 변수를 사용할 수 없습니다.

SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;

그래서 이전에 쿼리를 문자열로 조작해야 하는 경우가 꽤 많습니다.prepare()이 경우에도 SQL 주입을 방지하기 위해 코드를 신중하게 작성해야 합니다.

SQL 주입으로부터 안전합니다.

안전하지 않은 몇 가지 사항:

  • 서비스 거부(과도한 양의 행이 생성됨)
  • 사이트 간 스크립팅 공격(제목이 다른 사용자에게 반향된 경우)

보안은 단순히 SQL 주입을 방지하는 것 이상의 기능을 의미합니다.

SQL Injections와 관련하여, 특히 PDO::와 같은 상수를 사용하는 경우 가장 안전하다고 생각합니다.PARAM_INT.

XSS가 언급된 것을 보니, XSS 공격을 방지하기 위해 이 입력 청소 클래스 http://www.phpclasses.org/browse/package/2189.html 와 같은 것들을 사용하는 것을 살펴보는 것도 좋다고 생각합니다.

언급URL : https://stackoverflow.com/questions/1314521/how-safe-are-pdo-prepared-statements

반응형