2015-02-03 2 views
-1

내 코드가 SQL 삽입을 방지하고 있다고 생각했지만 인터넷을 보았을 때 내가 틀렸다는 것을 깨달았습니다. 내가 사용하여 ID 년대를 잡아되었습니다SQL 삽입 및 ID 잡기 방지

$id = mysqli_real_escape_string($_GET['id']); 

나는 MySQL의 실제 이스케이프 문자열을 사용하면 실제로 SQL 주입에서 저를 방지하지 않습니다 인터넷에서 배웠습니다. 그러나, 나는 내 서버에서 사용하려고하는 경우에도, 그것은 나에게이 오류 제공 :

expects exactly 2 parameters, 1 given - Line: 4 

내가 테스트 환경 (WAMP)에서 사용할 수 있었던 이유를 잘 모르겠어요,하지만하지 여기에 . 궁금한 점은 ID를 수집하고 SQL 삽입을 방지하는 올바른 방법은 무엇입니까?

+0

친절 참조 : http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php –

답변

0

올바른 방법은 prepared statements을 사용하는 것입니다. 귀하의 코드에 관한 한, 당신은 잘못된 방법으로 mysqli_real_escape_string을 사용하고 있습니다. mysqli 연결도 포함시켜야한다.

$id = mysqli_real_escape_string($mysqli, $_GET['id']); 

준비된 문을 사용할 때 필요하지 않습니다.

+0

감사합니다. 그러나, 나는이 http://www.wenda.io/questions/2406383/how-do-i-use-getid-securely-with-pdo-query.html을 읽은 후 MySQLi가 SQL 삽입을 방지하지 않는다는 것을 배웠다. 이게 사실인가요? – Achilles

+0

API 자체가 SQL 주입을 막을 수있는 API가 없으므로 올바르게 사용해야합니다. 이것은 쿼리가 실제로 실행되기 전에 입력이 이스케이프되고 쿼리가 "미리 결정"되어 있기 때문에 준비된 문을 권장 한 이유입니다 (쿼리를 올바르게 수행 한 경우). 인터넷에서 누군가의 의견을 읽는 대신에 이해할 수 있도록 공식 문서를 읽는 것이 매우 중요합니다. – EternalHour

0

나는 단지 준비된 문장을 사용하고 값을 바인딩 할 것이다. 이 예와 같이.

$stmt = $mysqli->prepare("DELETE FROM tbl_users WHERE name = ?"); 
$stmt->bind_param("s", $name); 
$stmt->execute(); 
$stmt->close();