IT이야기

PHP에서 코드 삽입 공격을 방지하는 방법

cyworld 2021. 4. 25. 12:40
반응형

PHP에서 코드 삽입 공격을 방지하는 방법은 무엇입니까?


나는 약간 혼란스럽고 PHP에는 너무 많은 기능이 있으며 일부는 이것을 사용하고 일부는 사용합니다. 어떤 사람들은 사용 : htmlspecialchars(), htmlentities(), strip_tags()

어느 것이 옳고 당신들은 보통 무엇을 사용합니까?

이것이 맞습니까 (있는 경우 더 나은 것을 조언하십시오) :

$var = mysql_real_escape_string(htmlentities($_POST['username']));

이 라인은 MySQL 주입 및 XSS 공격을 방지 할 수 있습니까 ??

Btw, XSS 공격 및 MySQL 주입 외에주의해야 할 다른 사항이 있습니까?

편집하다

결론적으로:

나는 데이터베이스에 문자열을 삽입 할 경우, 내가 사용하지 않아도 htmlentities단지를 사용합니다 mysql_real_escape_string. 데이터를 표시 할 때를 사용하십시오 htmlentities(). 이것이 의미하는 바입니까 ??

요약하다:

  • mysql_real_escape_string 데이터베이스에 삽입 할 때 사용
  • htmlentities() 웹 페이지에 데이터를 출력 할 때 사용
  • htmlspecialchars() 언제 사용합니까?
  • strip_tags() 언제 사용합니까?
  • addslashes() 언제 사용합니까?

누군가 물음표를 채울 수 있습니까?


  • mysql_real_escape_string 데이터베이스에 삽입 할 때 사용
  • htmlentities() 웹 페이지에 데이터를 출력 할 때 사용
  • htmlspecialchars() 언제 사용합니까?
  • strip_tags() 언제 사용합니까?
  • addslashes() 언제 사용합니까?

htmlspecialchars () 언제 사용됩니까?

htmlspecialchars과 거의 같습니다 htmlentities. 차이점 : 문자 인코딩.

두 인코딩 제어 문자 좋아 <, >, &등 오프닝 태그 등을 사용 htmlentities움라우트, 유로 기호와 같은 같은 다른 언어에서 또한 인코딩 문자. 웹 사이트가 UTF이면을 사용 htmlspecialchars()하고 그렇지 않으면 htmlentities().

strip_tags ()는 언제 사용됩니까?

htmlspecialchars/ entities특수 문자를 인코딩하므로 표시되지만 해석되지는 않습니다 . strip_tags그들을 제거합니다.

실제로는 수행해야하는 작업에 따라 다릅니다.

예 : 포럼을 코딩하고 사용자가 항목을 게시 할 수 있도록 텍스트 필드를 제공했습니다. 악의적 인 사람들은 다음을 시도합니다.

pictures of <a href="javascript:void(window.setInterval(function () {window.open('http://evil.com');}, 1000));">kittens</a> here

아무것도하지 않으면 링크가 표시되고 링크를 클릭 한 피해자에게 많은 팝업이 표시됩니다.

htmlentity / htmlspecialchar 출력하면 텍스트가있는 그대로 있습니다. strip_tag하면 태그를 제거하고 표시합니다.

pictures of kittens here

가끔은 당신이 혼합물을 할 수 있습니다, 거기에 몇 가지 태그를 떠나 <b>( strip_tags거기에 특정 태그를 남길 수 있습니다). 이것도 안전하지 않으므로 XSS에 대해 완전한 라이브러리를 사용하는 것이 좋습니다.

속눈썹

PHP 매뉴얼이전 버전 을 인용하려면 :

데이터베이스 쿼리 등에서 인용해야하는 문자 앞에 백 슬래시가있는 문자열을 반환합니다. 이러한 문자는 작은 따옴표 ( '), 큰 따옴표 ( "), 백 슬래시 () 및 NUL ( NULL 바이트)입니다.

addlashes () 사용의 예 는 데이터베이스에 데이터를 입력 할 때입니다. 예를 들어, 데이터베이스에 O'reilly 라는 이름을 삽입하려면 이스케이프해야합니다. DBMS 전용 이스케이프 함수 (예 : MySQL의 경우 mysqli_real_escape_string () 또는 PostgreSQL의 경우 pg_escape_string ())를 사용하는 것이 좋습니다. 그러나 사용중인 DBMS에 이스케이프 기능이없고 DBMS가 \를 사용하여 특수 문자를 이스케이프하는 경우 이 기능을 사용할 수 있습니다.

현재 버전은 다르게 표시된다.


이 빠른 체크리스트를 생각했습니다.

  • HTTPS가 없으면 항상 HTTPS를 사용하세요. 사이트는 완전히 암호화되지 않습니다 . 그리고 클라이언트 측 암호화 및 전송은 작동하지 않습니다. 생각해보십시오. 유효하지 않은 HTTPS 인증서는 또한 MITM 공격에 취약하게 만듭니다 . 인증서를 감당할 수 없다면 Let 's Encrypt를 사용하십시오.
  • htmlspecialchars()PHP 코드의 모든 출력, 즉 사용자 입력을 포함하는 경우 항상 사용 합니다 . 대부분의 템플릿 엔진은이를 쉽게 수행 할 수 있도록 도와줍니다.
  • HTTP 전용 플래그를 사용하여 php.ini스크립트가 쿠키에 액세스하지 못하도록합니다.
  • 세션 관련 문제 방지
    • 사용자 PHPSESSID(세션 ID)를 쿠키 외부에 노출하지 마십시오. 누군가 다른 사람의 세션 ID를 알게되면 단순히이를 사용하여 계정에 로그인 할 수 있습니다.
    • Remember me기능에 매우 조심 하고 약간의 경고를 표시하십시오.
    • 사용자가 로그인 할 때 세션 ID를 새로 고칩니다 (또는 적절한 항목).
    • 시간 초과 비활성 세션
  • 쿠키를 신뢰 하지 마십시오 . 언제든지 스크립트 / 사용자에 의해 변경, 제거, 수정 및 생성 될 수 있습니다.
  • SQL 관련 문제 방지
    • 항상 준비된 진술을 사용하십시오 . 준비된 명령문으로 인해 사용자 입력이 별도로 전달되고 SQL 주입이 방지됩니다.
    • 코드가 실패하면 예외가 발생하도록합니다. 때로는 SQL 서버가 어떤 이유로 다운 될 수 있으며 라이브러리와 같은 라이브러리 PDO는 기본적으로 해당 오류를 무시하고 로그에 경고를 기록합니다. 이로 인해 코드에 따라 DB에서 가져온 변수가 null이되어 보안 문제가 발생할 수 있습니다.
    • 준비된 문을 PDO 에뮬레이트하는 것과 같은 일부 라이브러리 . 끄세요.
    • 사용 UTF-8하여 데이터베이스의 인코딩은, 당신이 거의 모든 성격과 피할 인코딩 관련 공격을 저장할 수 있습니다
    • 쿼리에 어떤 것도 연결하지 마십시오 . $myquery = "INSERT INTO mydb.mytable (title) VALUES(" . $user_input . ")"거의 비슷한 상황 은 SQL 주입의 보안 위험이 크다는 것을 의미합니다.
  • 확장자가없는 임의의 파일 이름으로 업로드 된 파일을 저장합니다. 사용자가 .php파일 확장자가 있는 파일을 업로드하면 코드가 해당 파일을로드 할 때마다 파일을 실행하고 사용자가 일부 백엔드 코드를 실행할 수 있도록합니다.
  • CSRF 공격에 취약하지 않은지 확인하십시오 .
  • 최신 보안 패치 및 성능 향상을 위해 항상 PHP 사본을 업데이트하십시오.

인코딩해야하는 시스템으로 들어가는 지점에서만 데이터를 인코딩하십시오. 그렇지 않으면 실제 데이터를 조작하려는 상황에 처하게됩니다.

SQL 주입의 경우-PHP에서 SQL 주입을 방지하려면 어떻게해야합니까?에 설명 된대로 바인딩 된 변수를 사용하십시오 . (준비된 진술에 대해 이야기하지만 준비가 아닌 보호를 제공하는 것은 구속력이 있습니다).

XSS의 경우-HTML 또는 텍스트가 지정된 지점에서 HTML에 쓰는 경우. 문서를 생성하는 지점에서 htmlentities를 사용하십시오. 데이터를 데이터베이스에 해당 형식으로 저장하는 것을 피할 것입니다 (CPU 성능 / 디스크 액세스 시간이 늘어나고 문제가 발생하는 쓰기 드물게 읽기가 자주 발생하는 시스템에서 가능한 경우를 제외하고는 열의 raw_ 및 html_ 버전을 갖게됩니다) … 또는 그냥 memcached 또는 유사 사용).

사용자가 URL을 입력하도록 허용 javascript:do_evil()하는 경우 실행될 유효한 URI (예 : 클릭 된 링크에 대한 href 또는 (일부 브라우저에서) 방금로드 된 이미지의 src) 와 같이 더주의해야합니다 .


htmlspecialchars()교대로 &, ', ", <, 및 >는 HTML 형식으로 엔티티 ( &amp;, &quot;등)

htmlentities() 적용 가능한 모든 문자를 HTML 엔티티 형식으로 바꿉니다.

strip_tags() 모든 HTML 및 PHP 태그를 제거합니다.

둘 다 htmlspecialchars()htmlentities()따옴표 처리 방법을 나타내는 선택적 매개 변수를 사용합니다. 자세한 내용은 PHP 매뉴얼을 참조하십시오.

strip_tags()함수는 제거하지 않아야하는 태그를 나타내는 선택적 매개 변수를 사용합니다.

 $var = strip_tags ($var, '<p><br />');

strip_tags()함수는 문제를 일으킬 수있는 잘못된 HTML 태그도 제거합니다. 예를 들어, strip_tags()HTML 태그라고 생각하는 모든 코드를 잡아 당깁니다.

<b I forgot to close the tag.

데이터베이스에 삽입 할 때 mysql_escape_string ()을 사용하고 HTML을 표시 할 때 htmlentites 만 사용하면됩니다. 단순한 인젝션 공격을 방지하려는 경우 충분하지만 웹 앱을 개발할 때 알아야 할 다른 많은 보안 문제는 의심 할 여지가 없습니다. 또 다른 주요 문제는 교차 사이트 요청 위조입니다.


데이터베이스에 데이터를 삽입하거나 데이터베이스를 쿼리 할 때 htmlentities ()를 사용하지 않습니다. 데이터베이스의 데이터가 엔티티로 저장된 경우 해당 데이터는 html 엔티티를 이해하는 데에만 유용합니다.

다른 유형의 출력에 대해 다른 이스케이프 메커니즘을 사용해야합니다 (예 : SQL- mysql_real_escape_string () , HTML- htmlentities () 또는 htmlspecialchars () , shell- escapeshellarg ()) . 이는 '위험한'문자가 각각 다르기 때문입니다. 출력 매체에 대해 데이터를 안전하게 만들 수있는 마법의 방법은 없습니다.


이 사이트 PHP Security Consortium을 살펴보십시오 . PHP 보안 (SQL 인젝션 및 XSS 포함)에 대한 전반적인 개요를 볼 수있는 좋은 사이트라는 것을 알았습니다.


나는 그것이 오래된 질문이라는 것을 알고 있지만 요즘에는 가장 많이 투표 한 답변이 초보자에게 오해의 소지가 있습니다.

2017 년 기준

  1. You should never ever use mysql_real_escape_string. Even mysqli_real_escape_string is too weak to protect your database from the SQL injections. Instead of this, you should use PDO, and similar techniques. (see that guide)

  2. XSS (here I mean: strip_tags(), addslashes(), htmlspecialchars(), htmlentities()) - here the most voted answer is still correct, but I would suggest reading this article

ReferenceURL : https://stackoverflow.com/questions/1205889/how-to-prevent-code-injection-attacks-in-php

반응형