2011-02-22 6 views
0

MySQL 데이터베이스에 넣을 PHP로 포맷 된 큰 JSON을 전달하는 자바 스크립트 리치 페이지가 있습니다. JSON의 데이터에는 사용자 제출 문자열이 포함되며 기본 html (<a>, <strong> 등)이 포함 된 문자열이 포함됩니다.MySQL에서 데이터베이스 저장을 위해 json 데이터를 인코딩하는 방법은 무엇입니까?

오전 데 문제가 ' 인용 부호를 포함하는 문자열을 탈출 할 때, 나는 혼합되어

<a href=\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'example.com\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'></a> 

사용자가이를 저장할 때마다 같은 합성 탈출로 이어지는, 슬래시를 제거 할 수있다, 심각 팽만감 데이터베이스 필드 MySQL의에 데이터를 삽입하는

내 문자열 변환은 다음과 같습니다

$correspondenceArray = base64_encode(json_encode($_POST['saveArray']['correspondenceObject'])); 

그리고 얻을 수있는 데이터 돌아 : 내 의도를 한 일에서

function stripslashes_deep($value) 
{ 
    $value = is_array($value) ? 
       array_map('stripslashes_deep', $value) : 
       stripslashes($value); 

    return $value; 
} 

$correspondenceJSON = stripslashes_deep(json_decode(base64_decode($resultArray['correspondence_array']), true)); 

데이터에 슬래시를 제거하는 것입니다 자바 스크립트가 이스케이프 처리되지 않은 데이터를 가질 수 있도록 데이터베이스에서 나옵니다.

+1

당신은'magic_quotes_gpc()'을 켜 놓았습니까? 그것들은 당신의 데이터 전체에 쓰레기를 버릴 것이고, 옵션은 꺼야합니다. –

+0

아, 그게 켜져 있습니다. 흠, 내가 이것을 끄면 나는 다른 곳에 영향을 줄 가능성이있다? –

+0

불쾌한 주사를 피하기 위해 mysql_real_escape_string()을 쿼리에 사용하고 싶지만 @Marc B가 맞으면 꺼야합니다 (PHP 5.3에서는 사용되지 않습니다). – Capsule

답변

3

는 SQL에 대한 문자열 세대를 사용하지 마십시오) 때문에 해당 기능을 사용할 수 없습니다 나는 json_encode($a,JSON_HEX_QUOT) 가능성이 도움이 될 것이다 실현,하지만 난 실행 해요 서버는 PHP 5.2.16 있습니다. 자리 사용하는 경우

문제 (스토리지)마법 이스케이프는이 필요하지 않습니다 것입니다. VARCHAR 유형으로 저장하십시오. 완료 및 완료. 출력 (입력시) 용

살균 마찬가지로 적절한 라이브러리를 사용하여 수행한다 - 두 개의 다른 작업 가 존재하는 단계; 그러나 이것은 저장 영역과 별개의 문제입니다.

PDO 하나로서 준비된 문을 참조 편집 (읽기 : 자리) 구현을. 다른 사람은 (내가 PHP를 사용하지 않지만 수동으로 문자열 기반 SQL 쿼리를 구축에 관한 설계 실수의 영구화를 해결하는 의무감을 느낀다.) 존재할 수있는 준비된 문에

매개 변수가 될 필요가 없습니다 인용; 드라이버가 자동으로 처리합니다. 응용 프로그램이 준비된 문을 독점적으로 사용하는 경우 개발자는 SQL 삽입이 발생하지 않을 것임을 확신 할 수 있습니다. (그러나 쿼리의 다른 부분이 이스케이프 처리되지 않은 입력으로 작성되는 경우에도 SQL 주입이 가능합니다.

사운드가 너무 좋음. 이제 은 문자열 생성 문을 사용하여 종료합니다. 부디.

해피 코딩.

+0

문제점은 내가 인코딩하고있는 객체가 매우 깊은 다차원 배열 (현재 최대 5 개의 레이어까지)이고 완전히 동적. –

+0

@ Zak Henry 내 대답이 변하지 않습니다. JSON은 텍스트입니다. ** 텍스트는 * 자리 표시 자 *가 SQL 문 (일명 "준비된 명령문")에 사용되는 경우 "이스케이프 처리"하지 않고 데이터베이스에 안전하게 저장할 수 있습니다. 참조 : http://php.net/manual/en/pdo.prepared-statements.php 또는 유사 - 나쁜 디자인은 반드시 죽어야합니다. 준비된 문을 사용하면 이론적으로 (백엔드, 어댑터 및 사용 패턴을 포함한 여러 요소에 따라) 성능을 크게 향상시킬 수 있습니다. –

+1

불행히도 PDO는 변수에 대한 참조와 함께 어리석은 구현을 사용하는 것처럼 보입니다. 그러나 어쨌든 PDO는 나쁜 접근 방식에서 수용 가능한 접근 방식으로 바뀝니다. –

관련 문제