2013-09-21 2 views
0

데이터베이스에 데이터를 입력하기 위해 준비된 문을 사용하고 있지만 준비된 문을 사용하여 데이터를 가져 오지 않았습니다. 그 이유는 코드가 조금 작아서 내가 읽은 것에서 조금 더 빠릅니다. 이 보안 문제가 있습니까?mysqli 데이터 및 보안 가져 오기

예 :

데이터를 삽입하는 단계;

$stmt = mysqli_prepare($con, "INSERT USERS (userFname) (VALUES (?)"); 
mysqli_stmt_bind_param($stmt, 's', $userFname); 
mysqli_stmt_execute($stmt); 
mysqli_stmt_close($stmt); 

데이터를 가져올 수 있습니다.

$query = mysqli_query($con,"SELECT * FROM users WHERE userEmail = '$userEmail'"); 

데이터를 가져 오기 위해 준비된 명령문을 사용하는 것만 큼 안전합니다. 당신의 예에서

+1

** 항상 ** 준비된 문구를 사용해야합니다. 예외 없음. –

+0

코드를 변경하겠습니다. 감사합니다. – Medeno

답변

0

<input type="email" name="email"><button type="submit">login</button> 

당신의 PHP 스크립트가 실행 양식 로그인이 말할 수 있습니다 : 그래서

<?php 
$email = $_POST['email']; 
$query = mysqli_query($con,"SELECT * FROM users WHERE userEmail = '$email'"); 

가, 누군가가 여기에 "재미있는"을 할 수있는 공격 벡터는 당신의 데이터 베이스.

이제 스크립트가 사용자 입력과 접촉하지 않고 레코드의 전자 메일을 가져 와서 루프에서 실행 한 다음 해당 사용자를 가져 와서 안전하다고 생각할 수 있습니다.
하지만 그 소스가 얼마나 안전합니까?

당신은 테이블을 newsletter_signups

id| email          | registered 
1 | [email protected]      | 2017-04-02 
2 | [email protected]');Drop table `users`;-- | 2017-05-01 

을 가지고 있고 당신은 그것을 통해 반복 시작합니다.

foreach($newsletter_records as $record) { 
    $email = $record['email']; 
    $query = mysqli_query($con,"SELECT * FROM users WHERE userEmail = '$email'"); 
    ... etc... 
} 

당신은 고통을 상상할 수 있습니다.

요컨대. 안전을 위해 결코 데이터를 신뢰하지 못합니다.
데이터에 관한 편집증을 가지고 항상 준비된 문구를 사용하십시오. 그것은 당신이가는 기본 방법이어야합니다. 100 % 안전하더라도.
추가 된 이점은 대개 준비된 명령문을 다시 사용할 수 있으며 변수를 바꿔 코드를 빠르게 실행할 수 있다는 것입니다.

관련 문제