2012-04-18 3 views
2

준비된 문 내에서 HTML 컨텐트를 처리 할 방법을 찾고 있습니다.PDO가 HTML 컨텐트를 저장하기 위해 준비된 문

내 응용 프로그램은 기본 WYSIWYG 편집기를 제공하며 사용자가 콘텐츠를 저장하면 스크립트가 HTML 데이터를 sqlite 데이터베이스에 저장합니다.

하지만 준비된 문을 사용하면 내 HTML이 자연스럽게 이스케이프 처리됩니다.

try { 

    /* Create databases and open connections */ 
    $dbh = new PDO('sqlite:db/coaching.sqlite'); 

    /* Set Error Mode for Exception Handling */ 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    /* Prepare SQL Statement */ 
    $query = $dbh->prepare("UPDATE Content SET Value=:value WHERE Token=:token"); 

    /* Bind Param to Statement */ 
    $query->bindParam(':token', $_POST['id'], PDO::PARAM_STR); 
    $query->bindParam(':value', $_POST['value'], PDO::PARAM_STR); 

    /* Execute Query */ 
    $query->execute(); 

    /* Echo Data */ 
    echo $_POST['value']; 

    /* Close connections to Database */ 
    $dbh = NULL; 

} 
catch(PDOException $e) { 

    /* Print Error-Messages */ 
    echo $e->getMessage(); 
} 
+1

HTTP 요청에서 HTML을 검색 할 때 bindParam()에 의해 이스케이프되는지 확인 하시겠습니까? – Leven

+0

내가 아는 한 사용자 입력은 bindParam() 내에서 자동으로 인용됩니다. – gearsdigital

+2

@gearsdigital 준비된 문은 변수를 이스케이프 처리하지 않습니다. 명령과 변수는 동시에 데이터베이스에 전송되지만 독립적으로 수행됩니다. 데이터가 데이터베이스에서 이스케이프 된 경우 다른 이유가 있습니다. 예 : 'magic_quotes'가 켜져 있습니다. 스크립트에'get_magic_quotes_gpc'을 반향하여 켜거나 끌 수 있습니까? – bostaf

답변

7

준비된 문을 사용 후/이전에 사용하는 경우

http://php.net/base64_encode

또는

http://php.net/serialize 작동합니다. 명령과 변수는 동시에 데이터베이스에 전송되지만 독립적으로 수행됩니다. 데이터가 데이터베이스에서 이스케이프 된 경우 다른 이유가 있습니다. 예 : magic_quotes이 켜져 있습니다. 스크립트에 get_magic_quotes_gpc을 표시하여 켜거나 껐을 수 있습니까? 사용중인 경우 different techniques을 사용하여 Off로 설정할 수 있습니다. 이렇게하면 문제가 해결됩니다.

덧붙여 말하면, 준비된 명령문은 prevent SQL injection attacks을 사용하므로 변수를 이스케이프 할 필요가 없습니다. 준비된 진술이 작동하는 방식은 이해하기 어려울 수 있습니다. 쿼리를 가지고 말 :있는 그대로

$query = "SELECT `id` FROM `users` WHERE `login` = '" . $login . "' AND `password` = '" . $password ."'"; 

$login$password가 직접 쿼리에 전달됩니다.

$query = "SELECT `id` FROM `users` WHERE `login` = 'mylogin' -- ' AND `password` = 'anypassword'"; 

을 데이터베이스로 보낼 수 있습니다 : 누군가가 $loginmylogin' --을 통과하려고하면, 쿼리가됩니다. 이렇게하면 공격자가 모든 계정에 액세스 할 수 있습니다.

준비된 명령문은 쿼리에서 독립적으로 쿼리 인수를 전송합니다. 쿼리는 데이터베이스로 전송되기 전에 변수의 빌드가 아닙니다. 대신 변수는 쿼리 옆에 어떻게 든 전송됩니다. 쿼리에서 참조됩니다. 이렇게하면 의도적으로 또는 실수로 쿼리를 스푸핑 할 수 없습니다.

예문을 사용하면 $login이 그대로 전송되며 쿼리 구조에는 영향을 미치지 않습니다.

승객이 실제로 탑승하지 않은 상태에서 승객을 비행기로 탑승하는 것이 가능한 경우 "준비된 항공편"이라고합니다. 승객은 경로에 영향을 미치지 않고 비행기를 공중 납치 할 수 없습니다. 그들은 비행기 착륙과 함께 표적 공항에 나타 났을 것입니다.

+0

비행기 예가 awsome입니다 :) 감사합니다! – gearsdigital

+0

나는 슈퍼 전역'$ _POST'와'$ _GET'에서'magic_quotes'와 동일한 문제가있었습니다. 나는 PHP 5.4에이 "기능"이 없다는 것을 알게되었다. – user17753

2

하면 인코딩 된 데이터를 저장하는 것을 시도했다 :

이 내가 지금까지했습니다 무엇인가? DB를이 변수를 탈출하지 않는

+1

HTML은 텍스트 일뿐입니다. 데이터베이스에 저장하기 전에 직렬화 할 필요가 없습니다. – Leven

+2

맞지만 대신 사용할 것은 무엇입니까? base64? – Hajo

+1

그냥 문자열로 저장하십시오. 문자열을 직렬화하거나 인코딩하는 이유는 무엇입니까? – Leven