PHP에서 SQL 삽입 방지

사용자 입력이 SQL 쿼리에 확인되지 않은 상태로 삽입되면 아래 예제와 같이 응용 프로그램이 SQL 삽입 공격에 취약해집니다.

$variable = $_POST['input_utilisateur']; 

mysql_query("INSERT INTO 'table' ('column') 값 ('$variable')");
이 예에서 사용자는  를 입력할 수 있습니다. 값'); DROP TABLE table;--') 입니다. 쿼리는 다음과 같습니다.

mysql_query("INSERT INTO 'table' ('column') VALUES('value'); DROP TABLE table;--')

해커의 목표는 숨겨진 정보를 읽거나 다른 작업(읽기, 수정, 삭제)을 수행할 수 있도록 SQL 쿼리를 수정하는 것입니다. 이 예제에서는 테이블이 데이터베이스에서 제거됩니다.
이 유형의 결함은 가장 광범위하고 위험하며 코드가 안전하지 않으면 위험이 엄청납니다.

SQL 주입 결함에 대한 해결책은 prepared queries 또는 parameterized queries를 사용하는 것입니다. 실행을 준비하면 쿼리가 데이터베이스 서버로 전송되고 구문 검사를 수행합니다. 이 방법을 사용하면 해커가 악의적 인 SQL.

이를 위해 세 가지 옵션이 있습니다 :

1- PDO 사용 :

$statement = $pdo-> 준비('SELECT * FROM administrator WHERE name = :name'); 

$statement-> 실행(배열('이름' => $nom));

foreach ($row로 $statement) {
// 뭔가를 합니다
}
2- MySQLi 사용:

$statement = $dbConnection-> prepare('SELECT * FROM administrator WHERE name = ?'); 
$statement-> bind_param('s', $nom);

$statement-> 실행();

$result = $statement-> get_result();
while ($row = $result-> fetch_assoc()) {
// 뭔가를 합니다
}
3- 메서드 사용 PHP mysql_real_escape_string
PHP에는 이 취약점을 수정하는 자체 방법이 있지만 앞의 두 방법이 더 효과적이라는 점에 유의해야 합니다. mysql_real_escape_string  MySQL 쿼리에 사용될 문자열을 가져와서 SQL 삽입에서 이스케이프된 것과 동일한 문자열을 반환합니다. quotas(')는 \'로 바뀝니다. 이 기능을 사용하려면 데이터베이스에 이미 연결되어 있어야 합니다.

$nom = "' OR 1'"; 

$nom = mysql_real_escape_string($nom);

$query = "SELECT * FROM administrator WHERE name = '$nom'";
echo "주입 방지: < br />" 입니다. $query . "< 브롬 />";

$name_vul = "'; DELETE FROM administrator WHERE 1 or name = '";

$name_vul = mysql_real_escape_string($name_vul);

$query_vul = "SELECT * FROM administrator WHERE name = '$nom'";
echo "주입 방지: < br />" 입니다. $query_vul입니다.

참조:
https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php