문제

사용자가 붙여 넣기를 허용하고 싶습니다 <embed> 그리고 <object> HTML 양식을 통한 HTML 조각 (비디오 플레이어). 서버 측 코드는 PHP입니다. 악의적 인 붙여 넣은 코드, JavaScript 등으로부터 어떻게 보호 할 수 있습니까? 붙여 넣은 코드를 구문 분석 할 수는 있지만 모든 변형을 설명 할 수는 없습니다. 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

어떤 매개 변수가 있는지 잘 모르겠습니다 EMBED 그리고 OBJECT 내가 페이지에 미디어를 넣는 것을 실제로 다루지 않았기 때문에 (실제로 생각하기에 충격적입니다) BB 코드 접근 방식을 취하고 같은 일을 할 것입니다. [embed url="http://www.whatever.com/myvideo.whatever" ...] 그런 다음 URL과 다른 것을 구문 분석하고 합법적인지 확인하고 직접 만들 수 있습니다. <EMBED> 꼬리표.

편집하다: 좋아, 이와 같은 것이 괜찮을 것입니다.

$youtube = '<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"></param> </param><embed src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>';

$blip = '<embed src="http://blip.tv/play/AZ_iEoaIfA" type="application/x-shockwave-flash" width="640" height="510" allowscriptaccess="always" allowfullscreen="true"></embed>';

preg_match_all("/([A-Za-z]*)\=\"(.+?)\"/", $youtube, $matches1);
preg_match_all("/([A-Za-z]*)\=\"(.+?)\"/", $blip, $matches2);
print '<pre>' . print_r($matches1, true). '</pre>';
print '<pre>' . print_r($matches2, true). '</pre>';

이것은 출력됩니다 :

Array
(
[0] => Array
    (
        [0] => width="425"
        [1] => height="344"
        [2] => name="movie"
        [3] => value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
        [4] => src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
        [5] => type="application/x-shockwave-flash"
        [6] => allowfullscreen="true"
        [7] => width="425"
        [8] => height="344"
    )

[1] => Array
    (
        [0] => width
        [1] => height
        [2] => name
        [3] => value
        [4] => src
        [5] => type
        [6] => allowfullscreen
        [7] => width
        [8] => height
    )

[2] => Array
    (
        [0] => 425
        [1] => 344
        [2] => movie
        [3] => http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1
        [4] => http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1
        [5] => application/x-shockwave-flash
        [6] => true
        [7] => 425
        [8] => 344
    )
)

Array
(
[0] => Array
    (
        [0] => src="http://blip.tv/play/AZ_iEoaIfA"
        [1] => type="application/x-shockwave-flash"
        [2] => width="640"
        [3] => height="510"
        [4] => allowscriptaccess="always"
        [5] => allowfullscreen="true"
    )

[1] => Array
    (
        [0] => src
        [1] => type
        [2] => width
        [3] => height
        [4] => allowscriptaccess
        [5] => allowfullscreen
    )

[2] => Array
    (
        [0] => http://blip.tv/play/AZ_iEoaIfA
        [1] => application/x-shockwave-flash
        [2] => 640
        [3] => 510
        [4] => always
        [5] => true
    )
)

그때부터 그것은 매우 간단합니다. 너비/높이와 같은 경우 is_numeric 그리고 나머지는 htmlentities 그리고 자신을 건설하십시오 <embed> 정보에서 태그. 나는 이것이 안전 할 것이라고 확신합니다. 당신은 심지어 본격적인 것을 만들 수도 있습니다 <object> 필요한 모든 데이터가 있기 때문에 Blip.tv의 링크가있는 YouTube와 같은 것 (더 많은 장소에서 작동한다고 가정합니다).

나는 당신이 다른 비디오 공유 웹 사이트의 링크와 함께 약간의 단점을 볼 수 있다고 확신하지만, 이것은 당신을 시작하게 될 것입니다. 행운을 빕니다.

다른 팁

입력 된 HTML을 스캔하여 악성 코드를 안정적으로 감지 할 가능성은 NIL에 관한 것입니다. 스크립트를 주입하는 방법은 너무나 많으며 (브라우저 별 오염 된 HTML 포함) 모든 것을 선택할 수는 없습니다. 큰 웹 메일 공급 업체가 몇 년이 지난 후에도 새로운 익스플로잇을 찾은 후에도 그렇게 할 수있는 기회는 없습니다.

화이트리스트는 블랙리스트보다 낫습니다. 대신 입력을 XHTML이어야하고 표준 XML 파서를 사용하여 구문 분석해야 할 수 있습니다. 그런 다음 DOM을 걸어 가서 각 요소와 속성이 잘 알려져 있는지 확인하고 모든 것이 괜찮다면 XHTML로 다시 세리어링하십시오. 유니 코드 지지대가있는 적절한 XML 파서는 또한 불쾌한 '오버 런던 UTF-8 시퀀스'(IE6 및 구형 오페라에 영향을 미치는 보안 구멍)를 무료로 필터링해야합니다.

그러나 ... 모든 도메인에서 내용/객체를 허용하는 경우 이미 외부 도메인에서 페이지에 전체 스크립트 액세스를 허용하므로 HTML 주입은 최소한의 걱정입니다. 플래시와 같은 플러그인은 어떤 종류의 속임수가 필요하지 않고 JavaScript를 실행할 수 있습니다.

따라서 객체 소스를 미리 결정된 알려진 영역으로 제한해야합니다. 이미 그렇게하고 있다면 사용자가 비디오 제공 업체와 클립 ID를 선택한 다음 해당 제공 업체의 적절한 알려진 임베딩 코드로 변환하는 것이 더 쉽습니다. 예를 들어 BBCode와 같은 마크 업을 사용하는 경우 사용자가 YouTube 클립을 포함시키는 기존의 방법은 [YouTube] DTZS7DSH [/YouTube]가 될 것입니다.

다음은 blip.tv의 붙여 넣은 코드의 예입니다.

<embed src="http://blip.tv/play/AZ_iEoaIfA" type="application/x-shockwave-flash"    
  width="640" height="510" allowscriptaccess="always" allowfullscreen="true"></embed>

YouTube에서 얻을 수있는 예는 다음과 같습니다.

<object width="425" height="344">
  <param name="movie" value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"></param>
  <param name="allowFullScreen" value="true"></param>
    <embed src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
      type="application/x-shockwave-flash" allowfullscreen="true"
      width="425" height="344"></embed>
</object>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top