2009-11-27 4 views
3

외부에서 오는 데이터를 애플리케이션 제어, 스토리지, 로직 등에 사용하기 전에 제대로 탈출하는 방법을 살펴 보겠습니다.마술 따옴표없이 사용자 데이터 이스케이프 처리

분명히 마술 따옴표 지시어가 php 5.3.0+에서 곧 비추천되고 php6에서 제거되면서, 이것은 레거시 코드를 유지하면서 업그레이드하고 새로운 언어 기능을 사용하고자하는 사람들에게 우리는 그것을 사랑하지 않습니다 ..).

그러나 내가 본 적이없는 한 가지 사실은 슬래시가 있거나없는 저장소와 같이 데이터를 보호하면 어떻게해야 할 지에 대한 이론/모범 사례에 대한 토론이 많습니다. 개인적으로 DB의 데이터가 나쁜 움직임이다 탈출,하지만 단지 참조를 위해 PHP 매뉴얼에서

일부 링크 .. 토론을 듣고 바람직 몇 가지 사례 연구를 읽고 싶어되어 유지 생각 :

PHP Manual - mysql_real_escape_string

PHP Manual - htmlspecialchars

등 등

모든 팁은?

+3

예를 들어, "슬래시가 있거나 없거나 저장할 때"라고 말한 사실로 인해 적절한 탈출 개념에 결함이 있다고 생각하게됩니다. 올바르게 이스케이프를 수행하는 경우 슬래시가 필요한 데이터베이스로 전송되는 문자열에는 해당 문자열이 있지만 실제로 데이터베이스에 저장되지는 ​​않습니다. 데이터베이스에 슬래시가 있으면 데이터가 부적절하게 이스케이프되었습니다. – longneck

+0

더 자세히 알려주십시오 longneck - 삽입하기 전에 mysql이 이스케이프를 제거하겠습니까? 이것에 대한 페이지가 있습니까? 그러나 당신은 옳았습니다. 나는 과거의 어느 시점에서 이것을 간과하고 지금은 따라 잡기 위해 노력하고 있다고 생각합니다. – dmp

+0

mysql_real_escape_string은 슬래시 등을 이스케이프하지 않으므로 SQL 쿼리에 안전합니다. – William

답변

6

준비된 문장을 살펴보십시오. mysql에서 이것이 잘 작동한다는 것을 알고 있으며 데이터베이스에 데이터를 저장하는 안전한 형식입니다. 그것도 몇 가지 성능 혜택이 있습니다. 당신이 관심이 있다면

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html

는 좀 더 많은 자원을 가지고있다.

희망 하시겠습니까? tc.

편집 : 내가 추가 할 수 있습니다

것은 준비된 명령문와 함께 필터를 사용합니다. 예를 들어 값이 FILTER_SANITIZE_STRING을 사용하는지 또는 FILTER_SANITIZE_EMAIL을 사용하는 이메일인지 확인하십시오.

이렇게하면 코드가 절약되어 잘 작동합니다. 나중에 나름의 방법을 사용하여 데이터를 확인할 수 있지만 사용할 수있는 필터가 많이 있습니다. 쿼리를 실행할 때 데이터를 탈출의

+0

감사합니다. – dmp

+0

나는 이것에 대해 조사 해왔다 - 당신은 기회가 있다면 몇 가지 더 많은 자료를 언급했다. 팁을 주셔서 다시 한번 감사드립니다. – dmp

+0

다음 두 링크를 확인하십시오 : http://net.tutsplus.com/tutorials/php/getting-clean-with-php/ 및 http://net.tutsplus.com/tutorials/other/top-20- mysql-best-practices/ 하나는 PHP 용이고 하나는 mysql 용이고 다른 하나는 모범 사례입니다! –

0

간단합니다. 들어오는 모든 데이터는 데이터베이스에 삽입하기 전에 mysql_real_escape_string()을 통해 실행해야합니다. 예를 들어 무언가가 정수가되어야한다는 것을 알고 있다면 그것을 삽입하기 전에 정수로 설정하십시오. 이것은 단지 SQL 주입을 중지하는 것임을 기억하십시오. XSS와 데이터 검증은 다릅니다.

전자 메일을 원한다면 분명히 데이터베이스에 삽입하기 전에 유효성을 검사해야합니다.

htmlentities()은 데이터를 sanitizes, 의미는 데이터를 수정합니다. 난 당신이 항상 원시 데이터를 데이터베이스에 저장해야한다고 생각하고 당신이 그 데이터를 잡을 때, 당신이 그것을 다음 sanitize 방법을 선택하십시오.

mysql_real_escape_string() 함수의 "래퍼"로 다음 함수를 사용하고 싶습니다. 값이 부동 소수점 또는 정수의 경우

function someFunction($value) 
{ 
    if (is_int($value) || is_float($value)) { 
     return $value; 
    } 
    return "'" . mysql_real_escape_string((string) $value) . "'"; 
} 

mysql_real_escape_string()을 실행하는 것은 아무런 도움이되지 않습니다. mysql_real_escape_string()으로 전달하기 전에 값을 문자열로 변환하는 이유는 때때로 값이 문자열이 아니기 때문입니다.

값이 문자열 없다는 예 : test.php 내부

http://localhost/test.php?hello[]=test

, 당신은 문자열로 안녕하세요 기대 [ '안녕하세요'] $ _GET에 mysql_real_escape_string()를 실행합니다. 사람이 값을 배열로 설정 한 이후로 hello는 문자열이 아니기 때문에 실제로는주의를 일으킬 것입니다.

+0

당신의 답은 완전히 분명하지 않습니다. 당신의 제안이 htmlentities를 사용하지 않는가? – markus

+0

그의 제안은 항상 DB 저장 전에 mysql_real_escape_string을 사용하는 것입니다. –

+0

데이터베이스에 저장할 때? 네, 제 제안은 htmlentities를 사용하지 않는 것입니다. 예를 들어 브라우저에 데이터를 출력하는 중이면 사용자 데이터가 그 다음에 htmlentities를 통해 실행됩니다. 때로는 특정 사례에 대해 원하지 않을 수도 있습니다. 요점은 해당 데이터에 액세스 할 때 옵션이 있다는 것입니다. – William

2
  • 를 사용하여 올바른 방법 인 mysql_real_escape_string 준비 쿼리 등 ... 변경되지 않은 데이터베이스 탈출의

  • 를 사용하여 올바른 방법

  • 데이터 저장 출력 데이터 : htmlspecialchars 등

+0

감사합니다. 데이터가 양면에서 여러 가지 이유로 이스케이프 처리되어야한다는 사실을 알지 못합니다. SQL 인젝션에 대한 관심이 줄어들었지만 많은 사람들이 이해하고있는 것처럼 보였습니다.하지만 XSS는 점차 보편화되었으며 갈렌 (Galen)과 같은 사람들이이를 방지하고 예방할 수있게되어 기쁩니다. –

1

데이터베이스 삽입의 경우 솔루션은 bind variables입니다.

일반적으로 쉘 명령, db 명령 조각, 사용자 제공 html 등의 인수를 벗어날 때마다 올바른 함수 호출을 사용하고 있지 않음을 나타냅니다 (예 : exec의 다중 인수 형식을 사용할 수있는 경우 system) 또는 프레임 워크에 결함이 있습니다. 결함있는 프레임 워크에서 작업하는 표준 접근 방식은 인용에 대해 생각하지 않는 상태로 돌아갈 수 있도록 향상시키는 것입니다.

탈출 수준과 인용 수준에 대해 생각하는 것은 재미있을 수 있지만, 실제로 즐기는 경우 여유 시간에 Tcl을 사용하십시오. 실제 작업에서는 다른 사람들이 사용할 라이브러리를 디자인하지 않는 한 인용에 대해 생각하지 않아야합니다.이 경우 제대로 인용해야하고 사용자가 인용을 생각하지 않도록해야합니다. (그리고 당신은 당신이하는 일과하지 말아야 할 일을 정확하게 신중하게 문서화해야합니다.)

2

데이터베이스 작업을 위해서는 매개 변수가있는 쿼리와 준비된 문을 확인하십시오. PDOmysqli이 좋습니다.

Htmlspecialchars은 HTML 문서에 일부 텍스트를 표시하는 데 적합한 도구입니다.

그리고 5.3 절에서 언급했듯이 사용자 데이터를 처리 할 때 반드시 사용해야하는 filter functions에 액세스 할 수 있습니다.

관련 문제