| English | 의미 |
|---|---|
| route/ruːt/ | 경로 |
| validate input/ˈvælɪdeɪt ˈɪnpʊt/ | 입력 검증 |
| status/ˈsteɪtəs/ | 상태 코드 |
| SQL injection/ˌes kjuː ˈel ɪnˈdʒekʃn/ | SQL 주입 공격 |
| parameterised query/ˌpærəˈmetəraɪzd ˈkwɪərɪ/ | 파라미터화 쿼리 |
검색 문자열이 쿼리를 변경함
- 이름 검색 시
' OR 1=1 --을 받습니다. 만약 코드가 이를 SQL에 붙여넣는다면, 이 텍스트는 이름이 아닌 조건을 변경할 수 있습니다. - 경로(route) 는 요청 방법과 경로를 핸들러에 매핑합니다. 조회 구현 전에 경로 계약(path contract)을 명확히 유지하십시오.
형상과 권한 확인하기
- 입력 검증은 필수 값, 유형, 허용된 길이 및 범위를 확인하는 것을 의미합니다. 호출자의 권한은 별도로 확인하십시오.
- 상태(status) 는 결과를 설명합니다: 성공적 조회에는 200, invalid input에는 400, 자원이 없는 경우에는 404을 사용합니다. 권한 실패는 애플리케이션에서 합의한 정책에 따라 처리되며, 자동으로 bad input으로 간주되지 않습니다.
Implemented route 계약 하에 이러한 결과를 매칭하십시오.
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
이 의미들은 자체적으로 개인 권한 실패가 어떻게 표현되어야 하는지를 정의하지 않습니다.
값을 SQL 문장 외부에 유지하기
- SQL 주입은 신뢰할 수 없는 텍스트가 SQL 구文的一部分가 되는 경우 발생합니다. 파라미터화된 쿼리(parameterised query) 는 값을 문장과 별개로 바인딩합니다.
- 플레이스홀더는 임의의 테이블명이나 정렬 방향이 아닌 값을 바인딩합니다. 경로에서此类 식별자가 필요할 경우 고정된 서버 측 허용 목록에서 선택하십시오.
제출된 이름과 SQL 구文을 분리하는 검색은 무엇입니까?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
값 바인딩은 고정된 문장에서 값을 분리합니다.
SQL 플레이스홀더에 이름을 바인딩하는 것이 무엇을 변경하는지 설명하십시오.
난이도 3/5 · 200 코인 + 오늘 첫 완료 시 소액 보너스
명령문은 고정되어 있고, 별도로 바인딩된 값은 데이터로 남습니다.
값 플레이스홀더는 어떤 테이블 이름이나 정렬 방향을 안전하게 나타낼 수 있습니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
플레이스홀더는 값을 바인딩합니다. 동적 식별자는 고정된 서버 측 허용 목록에서 선택하십시오.
완전한 로컬 예제 실행하기
- SQLite를 사용하여 이 Python 예제를 저장하고 실행하십시오. 이상한 문자열은 이름으로 저장된 후 바인딩된 값으로 검색됩니다.
- 결과는 해당 이름의 행만 포함됩니다. 바인딩은 이 값을 SQL 구文一部分로 만들지 않도록 방지하지만, 권한을 설정하거나 모든 애플리케이션을 안전하게 만드는 것은 아닙니다.
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE students (id INTEGER PRIMARY KEY, name TEXT)")
name = "' OR 1=1 --"
con.executemany("INSERT INTO students VALUES (?, ?)", [(1, "Mei"), (2, name)])
rows = con.execute("SELECT id FROM students WHERE name = ?", (name,)).fetchall()
print(rows) # [(2,)]
con.close()
완전한 SQLite 예제에서 출력되는 내용은 무엇인가?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
특이한 문자열이 저장되고 리터럴 이름으로 매칭됩니다.
실패 상태를 유용하고 비공개로 유지하기
- 브라우저에 작동 가능한 명확한 메시지를 제공하십시오. 예를 들어 무효한 필드나 일시적 실패 등입니다. 원본 SQL 오류, 개인 자격 증명 또는 스택 트레이스를 반환하지 마십시오.
- 민감한 값이 제거된 보호된 로그에만 진단详细信息을 기록하십시오. 모든 개인 요청 본체를 복사하지 않고도 조사할 수 있는 충분한 맥락을 포함하십시오.
일반 사용자에게 원본 데이터베이스 오류를 반환하여 SQL 디버깅을 할 수 있게 하십시오.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
유용하고 안전한 메시지를 반환하고; 진단 로그를 보호하며 민감한 값을 제거하십시오.
성공적인 경로以外的 더 많은 경우 검증
- 유효, 누락, 잘못된 유형, 과도하게 큰 입력; 접근 거부; 일치하는 항목 없음; 시뮬레이션된 데이터베이스 실패를 확인하십시오. 각 경우에 대한 예상 결과를 명시하십시오.
- 드롭다운 값 포함 모든 동적 값을 바인딩에 유지하십시오. 브라우저의 목록은 사용자가 다른 값을 직접 전송하는 것을 방지할 수 없습니다.
요청을 검증하고, 호출자를 인증하며, 데이터 값을 바인딩하십시오. 이들은 서로 다른 문제를 해결하며, 하나가 다른 것을 대체할 수 없습니다.
어떤 외부 입력에 대해 적절한 서버 검증이 필요한가? 모두 선택하십시오.
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
평범해 보이는 외부 값도 잘못된 타입, 길이 또는 권한을 가질 수 있습니다.
쿼리가 파라미터화되었지만 모든 호출자가 개인 학생 행을 읽을 수 있습니다. Remaining(나머지)으로 빠진 것은 무엇인가?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
바인딩은 값 주입의 주소를 지정할 뿐이며, 호출자의 권한을 부여하지 않습니다.