2012-05-18 4 views
3

<textarea> 양식의 html을 보존하고 데이터를 데이터베이스에 저장하기 위해 base64_encode을 사용했습니다. 검색시 base64_decode이 사용되고 데이터가 텍스트 영역에 입력됩니다. 이것은 mysql_real_escape_string()을 사용하지 않고 안전하게 할 수 있습니까?mysql_real_escape_string 대신 base64_encode를 사용하는 것이 안전합니까?

템플릿 id$_GET 매개 변수를 검색 할 때 mysql_real_escape_string을 사용합니다.

templates.php?id=4

그러나 html로도 하나의 텍스트 영역에 추가 할 수있는 악의적 인 SQL 코드를 보존 유지하기 위해 64 기수를 사용. 지금까지 아무런 문제가 없었습니다.

mysql_real_escape_string() 대신 base64를 사용하는 것은 나쁜 습관입니까?

"작업에 잘못된 도구"?

참고 : xss에는 htmlspecialchars($text, ENT_QUOTES);을 사용합니다.

+2

고대의'mysql_ *'함수로 새로운 코드를 작성하는 것을 중단하십시오. 그들은 더 이상 유지되지 않으며 커뮤니티는 [비추천 프로세스]를 시작했습니다 (http://news.php.net/php.internals/53799). 대신 준비된 구문을 배우고 [PDO] (http://php.net/pdo) 또는 [MySQLi] (http://php.net/mysqli)를 사용해야합니다. 만약 당신이 배울 점이 있다면, 여기 [PDO 관련 튜토리얼] (http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers). –

+1

데이터베이스에 base64 blob을 실제로 저장 하시겠습니까? 공간을 낭비 할뿐만 아니라 데이터베이스 내부의 데이터를 조작하지 못하게합니다. – deceze

+0

@deceze 괜찮습니다. 저장된 html에 대한 쿼리를 실행하지 않지만 mysql이 이스케이프 처리 한 다른 부분은 수행합니다. – Kyle

답변

3

기술적으로 base64_encode은 SQL 주입에 사용할 수있는 모든 것을 출력하지 않습니다. 사실 안전합니다.

그러나, 나는 항상 SQL 탈출로를 어떤 쿼리에 사용 어떤 매개 변수를하는 습관을 만들 것 또는 항상 시작하는 매개 변수화 된 쿼리를 사용하는 (정말, 시대와 함께 간다!). 더 간단하고 간단하며 나중에 코드를 변경할 때 문제가 발생하지 않습니다.

+0

비록 OP와 같이 투명하게 text/html을 통과한다면 xss 취약점을주의해야합니다. – nos

2

예, base64 문자열은 데이터베이스에서 사용하는 것이 안전합니다. 그러나 그것은 몇 가지 단점이 있습니다.

  • 문자열을 인코딩/디코딩 할 때마다 데이터베이스에 들어가거나 디코딩 할 필요가 있지만, 이스케이프/준비시에는 하나만해야합니다.
  • 공간을 낭비하고 있습니다. base64 문자열은 원래 문자열보다 약 33 % 큽니다.

가장 좋은 방법은 현재의 MySQL 드라이버 (예 : mysqli 또는 PDO)로 이동하고, 준비된 문을 사용하는 것입니다. 어떤 이유로 든 가능하지 않은 경우 mysql_real_escape_string을 붙이십시오.

관련 문제