2012-07-02 2 views
0

str_replace의 안전한 사용에 대한 우려가 있습니다. E.G. 이 멀티 바이트 문자 집합 또는 예를 들어, 널 문자로 - PHP str_replace bypass

$var = "abcdeefghij"; 
$var = str_replace("ee", "", $var); // Should be "abcdfghij" 

은 (2 'E'문자로 "abcdeefghij"를 얻을) 우회 할 수 있습니까?

편집 : 나는 이런 식으로 뭔가에 대해 생각했다 : ABCD % 6565fghij % 6565는 EE로 대체 될 수 있지만 멀티 바이트 문자열 (mb_str_replace)이 있기 때문에 str_replace 작업을 wouldnt.

+0

"ee"및 "ff"와 같이이 방법을 사용하여 둘 이상의 문자열을 제거 하시겠습니까? – DPlusV

+0

아니, 하나만 .. (당신은 "abcdeeeffeeefghij"에 대해 생각하고 있었습니까?) – l00k

+0

나는 이것이 무엇인지에 대해 명확히 할 필요가 있다고 생각합니다. –

답변

2

실제로 ee 문자열이 호환되는 인코딩 및 추가 보이지 않는 문자가없는 문자열과 정확히 일치하지 않으면 일치하지 않습니다. 호환되는 인코딩까지는 소스 코드의 ee이 ASCII이므로 ASCII 호환 인코딩 (Latin-1, UTF-8 및 대부분의 싱글 바이트 인코딩 포함)이 가능합니다. 그 사이에 다른 문자/바이트가있는 경우에는 분명히 동일한 문자열이 아니므로 일치하지 않습니다. 다른 유사 문자도 분명히 일치하지 않습니다.

+0

나는 이런 식으로 생각했다. abcd % 6565fghij % 6565가 될 것이다. (mb_str_replace) – l00k

+1

@non 글쎄, 그건 분명히 일치하지 않을 아주 다른 문자열입니다. 그리고 그 문자열은 어떤 식 으로든'abcdeefghij'와 같지 않습니다, * 당신의'str_replace' 다음에 * URL 디코딩을한다면 * 예외입니다. 분명히 그렇게하지 마십시오. 먼저 인코딩 된 형식의 문자열을 디코딩 한 다음 최종 형식의 결과를 대체합니다. 다중 바이트의 경우, '% 6565'는 처음부터 유효하지 않으므로 '% 65 % 65'만 가능합니다. 당신이 생각하는 다른 무엇이든지 당신은 아마 오해하고 있습니다. – deceze

3

¿ sıɥʇ ǝʞı ן uɐǝɯ no⅄

가 예, e 같은 보이지만 다른 하나임 유니 코드 문자를 입력하여 "E"문자 "주입"하는 것이 가능할 수있다. 그 위험은 항상 존재합니다. 어떤 문자도 "e"와 유사한 문자을 감지 할 수 없습니다.

당신이하려는 일을 모른 채 실제 문제인지 여부는 알 수 없습니다. 일반적으로 이는 보안과 관련이 없어야합니다. 좀 더 배경을 제공할까요?

+0

때로는 다른 방식으로 작동하는 몇 가지 기능이 있으므로 – l00k

+0

과 같은 하나의 문자를 추가해야합니다. deceze는 'ee'에 보이지 않거나 길이가 0 인 문자를 추가하면 더 이상 일치하지 않습니다. 그러나 이것은 의도적으로 설계된 것입니다. 당신이해야 할 일에 대한 조언을하기 위해서, 우리는 당신이하고있는 일에 대해 더 많이 알아야합니다. –

+0

나는 이것이 내가 모호한 것임을 알고 있지만 더 이상 말하지 못한다.이 함수에 함정이 있다는 것을 알고 싶다. – l00k