PHP SQL Injection 방지 방법에 대해 작성한다.
OWASP 에서 1위로 선정된 위협으로 SQL Injection 이 있다.
$sql="SELECT * FROM users WHERE userid='$userid' and password='$password'";
위처럼 id와 암호를 받아서 로그인하는 부분에서 클라이언트가 $password input에 ' or '1' = '1 이라는 문자열을 넣으면 or 뒤의 조건문이 참이되어 관리자로 로그인이 가능하다.
해당 공격을 막기 위해서는 동적 쿼리가 아닌 Prepared Statement와 Bound Parameter 을 사용해야 한다.
// PDO 사용
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute([ 'name' => $name ]);
foreach ($stmt as $row) {
// Do something with $row
}
// MySQLi 사용
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// Do something with $row
}
PHP의 경우 직접적으로 데이터베이스에 연결하기 보다는 PDO를 사용하는것이 좋다.
PHP 라라벨의 경우 쿼리빌더에서 자동으로 해당 input 을 변환하여 안전하게 실행된다.
#참고자료
wiki.owasp.org/index.php/SQL_Injection
stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php
반응형
'개발 > Web' 카테고리의 다른 글
Javascript 특정영역 내/외 클릭 (0) | 2021.07.02 |
---|---|
[Javascript] 장식자(Decorator) (0) | 2020.11.16 |
Nginx CORS 활성화 (0) | 2020.09.26 |
wavesurfer events (이벤트) (0) | 2020.09.18 |
wavsurfer.js method(메서드) (0) | 2020.09.18 |