2011-01-20 2 views
6

다음 코드를 보면 $city을 도주하고 위생 처리해야합니까?준비된 PHP/MySQL 쿼리를 사용할 경우 입력을 살균해야합니까?

<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$city = "Amersfoort"; 

/* create a prepared statement */ 
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { 

    /* bind parameters for markers */ 
    $stmt->bind_param("s", $city); 

    /* execute query */ 
    $stmt->execute(); 

    /* bind result variables */ 
    $stmt->bind_result($district); 

    /* fetch value */ 
    $stmt->fetch(); 

    printf("%s is in district %s\n", $city, $district); 

    /* close statement */ 
    $stmt->close(); 
} 

/* close connection */ 
$mysqli->close(); 
?> 

준비된 쿼리를 사용할 때 입력을 위생해야합니까?

답변

9

아니요. 당신은 그것을 피하거나 주사 보호를 위해 위생 처리 할 필요가 없습니다. 다른 앱의 특정 작업에 대해서는 위생적으로 처리 할 수 ​​있습니다.

나는 잠시 동안 다시 비슷한 질문을했다 :

mysqli_stmt_bind_param SQL Injection

8

@Gary는 : 당신은 바로 mysqli에 대한 php.net에서 수동으로 코드의 조각 준비 :: 것을 복사됩니다. 같은 페이지에 다음 텍스트가 있습니다 :

"준비된 명령문의 목적은 SQL 문에 데이터를 포함시키지 않는 것입니다.이 명령문을 SQL 문에 포함시키는 것은 안전하지 않습니다. 항상 준비된 문을 사용하십시오. 코드를 읽기 쉽도록), SQL 인젝션에 취약하지 않습니다. "

질문에 대한 답변 :

+4

나무가 나무를 길에 넣었습니다. ;) –

+0

예,하지만 준비된 문장은 종종 응용 프로그램 계층과 데이터 계층 모두에서 더 많은 리소스를 필요로합니다. "항상 준비된 문 사용"이라고 말할 때 조심하십시오. – Jmoney38

+0

@ Jmoney38 Spot on, 모든 솔루션은 일반적인 방법으로 보이기 때문에 신중하게 선택하는 대신 생각해야한다고 생각합니다. – Sander

1

또한. 게다가.

준비된 statenens을 올바르게 사용하면 SQL 주입 문제가 거의 완전히 완화됩니다. 그러나 그럼에도 불구하고 입력 데이터를 포맷/위생 처리해야합니다. 청소 입력은 보안 기능이 아니지만 견고 함과 유용성을 위해 권장됩니다. 탈출 데이터베이스 또는 준비된 문을 대체하지 않습니다,하지만 작동하도록 일관된 데이터를 보장 :

$city = trim(preg_replace("/[^\w-]+/", " ", $city)); 

어느 다시 : 당신의 $ 도시의 경우에, 당신은 모든 단어가 아닌 문자를 제거 할 수 있습니다.

+0

하지만 위생적이지는 않습니다 (데이터에서 불법 문자를 제거하십시오.). 그들은 서로 다른 두 가지입니다. 준비된 진술로도 항상 데이터의 유효성을 검사해야합니다. – viery365

0

나는이 질문이 매우 오래되었다는 것을 알고 있습니다. 같은 정보를 검색하는 동안 나는 그것을 우연히 발견했습니다. Sander의 답변에 대해 의견을 말하고 싶지만 아직 논평할만한 평판은 없습니다.

Sander는 위생 처리가 필요하지 않지만 http://www.w3schools.com/php/php_mysql_prepared_statements.asp이라고 말합니다. (그리고 w3schools는 항상 최신 정보원이 아니며 정확한 정보원이 아니라는 것을 알고 있습니다. 이해할 수있는 방식), 그들은 "참고 : 외부 소스 (사용자 입력과 같은)의 데이터를 삽입하려는 경우 데이터를 삭제하고 유효성을 검증하는 것이 매우 중요합니다."

양식을 사용하고 사용자 입력을 수락 할 때 이 보이면 위생 처리해야합니다.