복붙노트

[SQL] bind_param은 무엇을 수행합니까?

SQL

bind_param은 무엇을 수행합니까?

나는 SQL 주입을 방지에 대한 학습 그리고 난 조금 혼란 스러워요.

bind_param를 사용하는 경우, 나는 목적을 이해하지 않습니다. 매뉴얼 페이지에, 나는이 예제를 발견 :

$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);

$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;

이제 그 4 개 변수는 사용자가 입력했다 가정하고,이 방지가 주사를 SQL 방법을 이해하지 않습니다. 나의 이해함으로써, 그들은 여전히 ​​그들은 거기에 원하는 입력 할 수 뭐든간에.

나는 또한 거기에 'SSSD'에 대한 설명을 찾을 수 없습니다. 그것은 무엇을합니까? 즉, 보안 - 어를 만드는 것입니다?

마지막 질문 : 나는 mysqli_real_escape_string이되지 않습니다 또 다른 문제에 읽을 수 있지만,이 설명서에 그런 말을하지 않습니다. 그것을 어떻게 사용되지 않습니다? 그것은 어떤 이유로 더 이상 특수 문자를 벗어날 수 있습니까?

참고 :이 질문은 무엇 bind_param 설명하지만, 어떤 안전 또는 그 이상의 보호 왜 난 아직도 이해가 안 돼요. Bind_param 설명

해결법

  1. ==============================

    1.DB 서버에 안전한 쿼리를 전송하기 위해 설계되었습니다 준비된 문을 사용하여이 주요 원칙은, 이것은 실제 쿼리의 일부가 아닌 사용자 입력을 탈출, 또한 (where 절)을을 확인하는 어떤없이 쿼리를 선택하여 수행 할 수 있습니다 매개 변수를 사용하기 전에 쿼리의 유효성.

    DB 서버에 안전한 쿼리를 전송하기 위해 설계되었습니다 준비된 문을 사용하여이 주요 원칙은, 이것은 실제 쿼리의 일부가 아닌 사용자 입력을 탈출, 또한 (where 절)을을 확인하는 어떤없이 쿼리를 선택하여 수행 할 수 있습니다 매개 변수를 사용하기 전에 쿼리의 유효성.

    이 질문에서 : PDO는 Mysqli 준비된 쿼리를 전송하면서, 모두 같은 결과를 MySQL의 원시 쿼리를 보냅니다

    $stmt = $mysqli->prepare("SELECT * FROM users WHERE username =?")) {
    $stmt->bind_param("i", $user);
    $user = "''1''";
    

    서버 로그 :

      130802 23:39:39   175 Connect   ****@localhost on testdb
        175 Prepare   SELECT * FROM users WHERE username =?
        175 Execute   SELECT * FROM users WHERE username =0
        175 Quit
    

    쿼리가 유효하면 준비된 문을 사용하여, DB 서버가이 단계에서, 어떤 매개 변수없이 쿼리를 확인합니다, 오류가 어떤 매개 변수를 바인딩하기 전에 감지 할 수 있습니다, 다음, 매개 변수는 쿼리를 마무리하기위한 서버로 전송 될 것입니다.

    PHP에서 수동 http://php.net/manual/en/mysqli.quickstart.prepared-statements.php :

    ..

    답은 여기에 있습니다 : http://php.net/manual/en/mysqli-stmt.bind-param.php

    i
    corresponding variable has type integer
    
    d
    corresponding variable has type double
    
    s
    corresponding variable has type string
    
    b
    corresponding variable is a blob and will be sent in packets
    

    당신은 참조를 줄 수 있습니까? 나는 당신이 오해 생각 (는 mysql_real_escape_string ())

  2. ==============================

    2.준비된 문을 사용하면 사용자가 입력 한 데이터에서 SQL 쿼리를 분리합니다. 대신 입력 데이터, 당신은 당신의 SQL 쿼리 ( '?'문자) 자리를 넣어. 그런 다음에 의해 DBMS 서버 (예를 들면 : MySQL의)에 질의를 보내 "mysqli :: 준비"방법을. 그래서, 입력 데이터를 기다리는 경우 모든 것이 괜찮 서버 점검 그래서. 지금까지 이미 쿼리를 알고있다. 그냥 입력 데이터가 쿼리에 바인딩 기다려야합니다.

    준비된 문을 사용하면 사용자가 입력 한 데이터에서 SQL 쿼리를 분리합니다. 대신 입력 데이터, 당신은 당신의 SQL 쿼리 ( '?'문자) 자리를 넣어. 그런 다음에 의해 DBMS 서버 (예를 들면 : MySQL의)에 질의를 보내 "mysqli :: 준비"방법을. 그래서, 입력 데이터를 기다리는 경우 모든 것이 괜찮 서버 점검 그래서. 지금까지 이미 쿼리를 알고있다. 그냥 입력 데이터가 쿼리에 바인딩 기다려야합니다.

    이 시점에서, "bind_param는"사용자가 입력 한 데이터에 자리를 바인딩, 행동으로 제공됩니다. 공지 사항 bind_param 만 쿼리를 변경 떠난 자리에 데이터를 결합하는 것이다. 사용자가 입력 한 데이터 쿼리를 방해 할 수 있으므로 별도로 SQL 쿼리 및 입력 데이터를 전송하기 때문에이 이미 준비 방법에 의해 서버로 전송하고 있기 때문에 그래서, 원래의 SQL 쿼리를 변경할 수있는 방법이 없습니다.

    어쨌든...

    SQL에서 준비된 문을 사용하는 실제 목적은, 처리 쿼리의 비용을 절감하기 위해 쿼리에서 데이터를 분리하지 않는 것입니다. 즉, 그것은 처음에 사용할 수 있도록 설계되었다 어떻게하지, 지금 사용되고 방법입니다.

    'SSSD는' "문자열", "문자열", "문자열"와 "더블"을 의미합니다. 사실 : $ 코드는 문자열은 $ 관계자는 문자열이며, $ %는 더블 타입, $ 언어는 문자열입니다.

    mysqli_real_escape_string는 사용되지되지 않고는 mysql_real_escape_string이되지 않습니다 (첫 번째는 내가 "개선"의 약자 mysqlI가있다).

  3. from https://stackoverflow.com/questions/18426172/what-does-bind-param-accomplish by cc-by-sa and MIT license