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
'programing' 카테고리의 다른 글
PHP의 정적 속성에 대한 Magic __getgetter (0) | 2023.07.26 |
---|---|
이 mysql 오류 코드 #1089가 계속 표시됩니다. (0) | 2023.07.26 |
평판에 기반한 권한 구현 (0) | 2023.07.26 |
ASP를 통해 파일을 업로드하려면 어떻게 해야 합니까?NET MVC와 진행 표시줄을 표시하시겠습니까? (0) | 2023.07.26 |
오라클 11g에 무제한 문자를 저장하는 방법은 무엇입니까? (0) | 2023.07.26 |