2013-04-23 3 views
-1

이상한 것으로 알려 졌는데 mysql_real_escape_string 기능이 있습니다. 또는 을 이스케이프 처리하지 않습니다. 예를 들어 “TEST”\“TEST\”으로 변환되지 않습니다.mysql_real_escape_string이 모든 유형의 문자를 이스케이프 처리하지 못합니다. "

기능은 (자세히 보면 당신은 다른 참조) "와 함께 잘 작동

이 문제를 해결하는 방법에 대해 어떤 생각, 차라리 처음부터이 기능을 쓸 수 없습니다. 더 이상 사용되지 않습니다. 대안이 있습니까?

수정 : 답변 해 주셔서 감사합니다. 명확하게하려면이 문자열을 삽입하려고합니다. "내가 좋아하는 것"카탈로그 \ r \ n을 DB에 삽입하고 어떤 이유로 작동하지 않습니다. 모든 다른 문자열에 대해 잘 작동하며 오류 메시지가 나타나지 않습니다, 그것은 단지 DB에 나타나지 않습니다. 그래서 나는 "과 관련이있을 것으로 생각했습니다.

나에게 쉽게 가라!

EDIT2

 $interestTable = "5431591 1 Things I Like” <br>"; 

//problem lies here 
     $count = 0; 
     $interestTable = preg_replace_callback('/<br>/', function($match) use($tagName, &$count) { 
      return $tagName[$count++][0] . ' ' . PHP_EOL; 
     }, $interestTable); 


    //$interestTable = "5431591 1 Things I Like” catalog \r\n" after format 

     $interestTable = mysql_real_escape_string($interestTable); 

     echo $interestTable; 


     mysql_query("INSERT INTO $tbl_name(userID,storyID,rank, storyType, interestTable)VALUES('$userID','$storyID','$rank','$storyType','$interestTable')", $dbh1); 

EDIT3 내가 잘못하지 않았다, 나는에서 문자열을 변경 것 I 좋아요 "카탈로그 \ r에 \ n을것 I AA 카탈로그 \ r에 \ n을에 및 그것은 효과가 있었다. 왜 이런 일이 일어나는지 전혀 모르겠다. 어쩌면 문자열로 변환 한 후 인코딩이 엉망이 될지 모르지만 확실하지 않다. "을 문자열에서 제거한 후에 모든 것이 올바르게 작동 함을 알 수 있습니다.

+0

mysql_ 함수 사용을 중지하십시오. – Kermit

+2

피드백 보내기 현재 상태 이것은 의도적으로 설계된 동작입니다. 그 따옴표는 무해합니다. – SLaks

+4

[** 새 코드 **에서 mysql_ * 함수를 사용하지 마십시오. (http://bit.ly/phpmsql). 그들은 더 이상 유지되지 않으며 [공식적으로 사용되지 않습니다] (http://j.mp/XqV7Lp). [** 빨간색 상자 **] (http://j.mp/Te9zIL)를 참조하십시오. 대신 [* prepared statements *] (http://j.mp/T9hLWi)에 대해 알아보고 [PDO] (http://php.net/pdo) 또는 [MySQLi] (http://php.net/)를 사용하십시오. mysqli) - [이 기사] (http://j.mp/QEx8IB)는 어떤 결정을 내리는 데 도움이 될 것입니다. PDO를 선택하면 [여기는 좋은 튜토리얼입니다] (http://j.mp/PoWehJ). – ceejayoz

답변

0

내가 생각하기에 그것은 문제가되는 것으로 드러났습니다.

내 문자열에 utf8_encode (http://php.net/manual/en/function.utf8-encode.php)을 사용하면 모든 것이 정상적으로 작동합니다.

도움 주셔서 감사합니다 (특히 다항식).

3

곱슬 따옴표는 MySQL에 특별한 의미가 없으므로 이스케이프 할 필요가 없습니다.

3

"똑똑한"따옴표가 MySQL 엔진에 의해 따옴표로 인식되지 않기 때문에 주입 공격의 위험이 전혀 없습니다.

+0

이것은 내가 생각한 것입니다. 그러나 어떤 이유로 인해 'Things I Like \ r \ n' 카탈로그를 카탈로그에 삽입 할 수 없습니다. 모든 것은 다른 문자열에서 잘 작동합니다. – r3x

2

또는 을 탈출 할 필요가 없습니다. 고칠 것이 없습니다.

0

mysql_ 기능은 더 이상 유지되지 않습니다 및 당신은 그러나 또는 을 탈출 할 필요가 없습니다

PHP 5.5.0의로 사용되지 않습니다. MySQL에서는 따옴표로 인식하지 않습니다.

MySQL 데이터베이스에 연결할 때 PDO 또는 MySQLi 확장을 사용하는 것이 좋습니다.

5

넵. 안전을위한 블랙 리스팅 메커니즘에 의존하지 마십시오. 그것은 깨진, 그리고 몇 가지 흥미로운 SQL 주입 될 수 있습니다 :

$query = "SELECT id, title, body FROM posts WHERE id = " . mysql_real_escape_string($_GET['id']); 

이 여전히 주입 할 수 있습니다 결과

1 OR 1=1 

:

SELECT id, title, body FROM posts WHERE id = 1 OR 1=1 

모든 결과가 반환됩니다. 이것이 나쁘다고 확신하지 않습니까? 승인...

1 OR 1=1 UNION SELECT id, username, password FROM users 

웁스!

왜 주사 할 수 있습니까? 개발자가 숫자 ID를 인용하는 것을 잊어 버렸습니다. 이 실수를하는 경우 더 나은 해결책을 찾아야합니다.


문자열 연결을 사용하지 말고, 더 이상 사용되지 않는 mysql_ 함수를 사용하지 말고 내용이 쿼리 언어와 명시 적으로 분리되어있는 매개 변수가있는 쿼리로 MySQLi 또는 PDO로 이동합니다.

+1

귀하의 쿼리에 2 따옴표를 추가하는 것은 사실 매개 변수화 된 쿼리로 이동하는 것보다 훨씬 간단합니다. –

+6

@YourCommonSense 예,하지만 ** ** 점이 아닙니다. 이 모든 "잡았다"를 잡을 수 있다고 보장 할 수 있습니까? 개발자가 매개 변수에서 벗어나거나 부적절하게 이스케이프 처리하지 못하고 보안 문제를 모르고 있기 때문에 SQL 주입으로 테스트하는 거의 모든 응용 프로그램이 그렇게합니다. MySQLi 또는 PDO를 사용하는 것이 훨씬 안전합니다. 출처 : 소프트웨어 개발 20 년, 수년간의 보안 연구, 침투 테스트에서의 작업, [Sec.SE] (http://security.stackexchange.com/)에 대한 30k 담당자. – Polynomial

+0

동의합니다. 그러나 오래된 mysql ext로 준비된 문장을 위조 할 수있다. 따라서이 API는 단순한 API가 아닌 강조점을 가져야합니다. –

관련 문제