문제
사용자가 붙여 넣기를 허용하고 싶습니다 <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>