복붙노트

준비된 진술은 언제 사용해야합니까?

PHP

준비된 진술은 언제 사용해야합니까?

원래 mysql_connect와 mysql_query를 사용했다. 그런 다음 SQL 주입을 배웠으므로 준비된 문을 사용하는 방법을 배우려고합니다. 필자는 PDO 클래스의 준비 및 실행 기능이 SQL 삽입을 방지하는 데 얼마나 유용한 지 이해합니다.

그러나 사용자 입력이 데이터베이스에 저장 될 때만 준비된 명령문이 필요합니다. 이 함수를 사용하여 해킹 당할 위험이 없기 때문에 여전히 mysql_num_rows를 사용하는 것이 좋을까요? 또는 이것을하기 위해 준비된 진술을 사용하는 것이 더 안전합니까? mysql을 사용하는 모든 것에 대해 prepared statement를 사용해야합니까? 왜?

나는 정말 어떤 대답과 피드백을 주셔서 감사합니다. 고맙습니다.

해결법

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

    1.tl / dr

    tl / dr

    mysql_ * 함수는 더 이상 사용되지 않습니다. (큰 빨간색 상자를 보시오?)

    PDO 또는 MySQLi를 사용하는 것이 더 나을 것입니다. 준비된 문장을 사용할 때 이들 중 2 개가 호환 라이브러리로 충분합니다.

    준비된 진술이나 위생 처리없이 사용자 입력을 신뢰하는 것은 차를 이웃에두고, 차창에 열쇠를 꽂아 두는 것과 같습니다. 너는 근본적으로 말하고있다, 들어가서 나의 맛을 가져라.

    결코 사용자의 입력을 신뢰하지 말아야합니다. 당신이 이것을 원한다면 :

    데이터를 참조하고 주석을 언급 한대로 저장하면 결코 사용자 관련 입력을 신뢰하지 않아도됩니다. 101 % 확신하지 않는 한 데이터베이스 / 값을 조작하는 데 사용되는 데이터가 앱에 하드 코딩되어 있으므로 준비된 문을 사용해야합니다.

    이제 준비된 진술을 사용해야하는 이유에 대해 알아보십시오. 간단 해. SQL 인젝션을 방지하는 것이 가장 직접적인 방법입니다. 준비된 명령문이 작동하는 방식은 간단합니다. 쿼리와 데이터를 함께 보내지 만 별도로 (하하가 의미가있는 경우) - 이것이 의미하는 바는 다음과 같습니다.

    Prepared Statements
    Query: SELECT foo FROM bar WHERE foo = ?
    Data:  [? = 'a value here']
    

    전임자와 비교하여 데이터로 쿼리를 잘라내어 전체적으로 보냈습니다. 즉, SQL 인젝션 취약점을 유발하는 단일 트랜잭션으로 실행되었습니다.

    그리고 준비된 문장 / 바인드의 단순성을 보여주는 가상 PHP PDO 예제가 있습니다.

    $dbh = PDO(....); // dsn in there mmm yeahh
    $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
    $stmt->bindParam(':name', $name);
    $stmt->bindParam(':value', $value);
    
    // insert one row
    $name = 'one';
    $value = 1;
    $stmt->execute();
    

    PDO 준비 문에 대한 PHP 매뉴얼에서 가져온 것

    더 많은 독서

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

    2.TL; DR 응용 프로그램에서 사용자 입력을 허용하는 경우 준비된 문장을 100 % 사용

    TL; DR 응용 프로그램에서 사용자 입력을 허용하는 경우 준비된 문장을 100 % 사용

    너는 약간의 혼란이있는 것 같다. 먼저 mysql_ *을 사용하지 마십시오. mysql_ * 함수는 구식이며 비추천이며 비보안입니다. 대신에 MySQLi 또는 PDO를 사용하십시오. 둘째, mysql_num_rows는 준비된 명령문과 아무 관련이 없으며 어쨌든 PDO 기능이 아닙니다. 쿼리를 실행하기 전에 명령문을 준비하고 행을 계산할 때가 아닙니다.

    성명서 작성시기에 관해서는 @ Mike'Pomax'Kamermans가 의견에 등재했습니다. 한 번만 사용자가 건드린 적이있는 데이터 (심지어는 신뢰할 수있는 사용자)를 사용하거나 브라우저를 비롯한 타사 또는 타사 응용 프로그램에서 생성 된 데이터를 사용하는 경우 준비된 문을 사용하십시오. 데이터의 100 %가 단순한 카운터 변수와 같이 코드에 의해 하드 코딩되었거나 완전히 생성 된 경우에만 신뢰할 수 있습니다.

    예를 들어, 다음을 신뢰할 수 없습니다.

    물론 데이터베이스에 저장하기 전에 전자 메일 주소가 실제로 전자 메일 주소인지 확인하는 등 모든 작업을 검증해야합니다. 그러나 그때조차도, 준비된 진술을 사용하는 것이 안전한 방법입니다.

  3. ==============================

    3.Mysql_ *은 이미 더 이상 사용되지 않으므로 mysqli_ * 또는 PDO를 전환하는 것이 좋습니다

    Mysql_ *은 이미 더 이상 사용되지 않으므로 mysqli_ * 또는 PDO를 전환하는 것이 좋습니다

    SQL 주입 방지 (mysql) : - PHP에서 SQL 주입을 방지하려면 어떻게합니까?

    준비된 문 (모든 매개 변수와 별도로 데이터베이스 서버로 보내고 구문 분석되는 SQL 문입니다.) 모든 사용자 생성 쿼리 데이터에서 사용합니다.

    쿼리를 사용하여 db에 레코드를 일치 / 가져 오는 것과 같습니다. 양식 데이터로 쿼리를 실행하면 의미가 있습니다.

  4. ==============================

    4.이 솔루션에는 두 가지 해결책이 있습니다.

    이 솔루션에는 두 가지 해결책이 있습니다.

    01- 준비된 문 사용

    SQL 인젝션을 막으려면 바인드 된 매개 변수를 사용하는 prepared statements라는 것을 사용해야 할 것입니다. Prepared Statements는 변수를 SQL 문자열과 결합하지 않으므로 공격자가 SQL 문을 수정할 수 없습니다. Prepared Statements는 변수와 컴파일 된 SQL 문을 결합합니다. 즉, SQL과 변수가 별도로 보내지고 변수는 SQL 문에 포함되지 않고 문자열로 해석됩니다.

    02- mySQLi로 작성된 진술.

    아래 단계의 메소드를 사용하면 mysql_real_escape_string ()과 같은 다른 SQL 주입 필터링 기술을 사용할 필요가 없습니다. Prepared Statement를 사용하면 기존의 SQL injection을 수행 할 수 없기 때문입니다.

    예 -

    $name = $_GET['username'];
    
    if ($stmt = $mysqli->prepare("SELECT password FROM tbl_users WHERE name=?")) {
    
        // Bind a variable to the parameter as a string. 
        $stmt->bind_param("s", $name);
    
        // Execute the statement.
        $stmt->execute();
    
        // Get the variables from the query.
        $stmt->bind_result($pass);
    
        // Fetch the data.
        $stmt->fetch();
    
        // Display the data.
        printf("Password for user %s is %s\n", $name, $pass);
    
        // Close the prepared statement.
        $stmt->close();
    
    }
    

    이 양식에 대한 자세한 내용은 http://www.wikihow.com/Prevent-SQL-Injection-in-PHP에서 찾을 수 있습니다.

  5. from https://stackoverflow.com/questions/24988867/when-should-i-use-prepared-statements by cc-by-sa and MIT license