ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • mysqli 활용한 SQL Injection 예방
    개발/PHP 2010. 6. 2. 19:31

    SQL Injection 예방을 위한 DB 쿼리 방식을 mysqli 를 활용하여 Executes a prepared Query 방식을 통해 안전한 DB 쿼리를 할 수 있다.

    이에 대한 예제를 참고로 기존 코드 및 차후 코드를 변경하는 것이 보안성 및 편리성을 추구할 수 있다.

    아래에서 동일한 기능을 하는 간단한 예제 두가지 방식을 제시한다.

    Example #1 Object oriented style

    <?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();
    }

    $mysqli->query("CREATE TABLE myCity LIKE City");

    /* Prepare an insert statement */
    $query "INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)";
    $stmt $mysqli->prepare($query);

    $stmt->bind_param("sss"$val1$val2$val3);

    $val1 'Stuttgart';
    $val2 'DEU';
    $val3 'Baden-Wuerttemberg';

    /* Execute the statement */
    $stmt->execute();

    $val1 'Bordeaux';
    $val2 'FRA';
    $val3 'Aquitaine';

    /* Execute the statement */
    $stmt->execute();

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

    /* retrieve all rows from myCity */
    $query "SELECT Name, CountryCode, District FROM myCity";
    if (
    $result $mysqli->query($query)) {
        while (
    $row $result->fetch_row()) {
            
    printf("%s (%s,%s)\n"$row[0], $row[1], $row[2]);
        }
        
    /* free result set */
        
    $result->close();
    }

    /* remove table */
    $mysqli->query("DROP TABLE myCity");

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

    Example #2 Procedural style

    <?php
    $link 
    mysqli_connect("localhost""my_user""my_password""world");

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

    mysqli_query($link"CREATE TABLE myCity LIKE City");

    /* Prepare an insert statement */
    $query "INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)";
    $stmt mysqli_prepare($link$query);

    mysqli_stmt_bind_param($stmt"sss"$val1$val2$val3);

    $val1 'Stuttgart';
    $val2 'DEU';
    $val3 'Baden-Wuerttemberg';

    /* Execute the statement */
    mysqli_stmt_execute($stmt);

    $val1 'Bordeaux';
    $val2 'FRA';
    $val3 'Aquitaine';

    /* Execute the statement */
    mysqli_stmt_execute($stmt);

    /* close statement */
    mysqli_stmt_close($stmt);

    /* retrieve all rows from myCity */
    $query "SELECT Name, CountryCode, District FROM myCity";
    if (
    $result mysqli_query($link$query)) {
        while (
    $row mysqli_fetch_row($result)) {
            
    printf("%s (%s,%s)\n"$row[0], $row[1], $row[2]);
        }
        
    /* free result set */
        
    mysqli_free_result($result);
    }

    /* remove table */
    mysqli_query($link"DROP TABLE myCity");

    /* close connection */
    mysqli_close($link);
    ?>

    위 예제의 출력:

    Stuttgart (DEU,Baden-Wuerttemberg)
    Bordeaux (FRA,Aquitaine)


    예제 출처 : http://kr.php.net/

    '개발 > PHP' 카테고리의 다른 글

    mysqli-stmt  (0) 2010.06.02
    mysqli 클래스의 prepare, bind_param, bind_result, execute 효과내기  (0) 2010.06.02
    PHP로 MVC구현_제2회  (0) 2010.06.01
    웹(PHP) 개발에 유용(필요)한 유틸  (0) 2010.06.01
    __autoload() - 2  (0) 2010.03.24
Designed by Tistory.