PHP에서 양식을 사용하여 객체를 지속하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/617793

  •  03-07-2019
  •  | 
  •  

문제

특정 객체가 다음과 같은 방식으로 지속되기를 원하는 PHP 응용 프로그램이 있습니다.

  1. 객체는 $ _session에 존재하지 않아야합니다. 별도의 웹 브라우저 Windows는 객체의 별도 인스턴스를 제어해야합니다.
  2. 최종 사용자는 $ _request 변수의 내용을 직접 변경하여 객체를 수정할 수 없어야합니다 (이 경우 요청이 손상된 것으로 취급되어야 함).

이 작업을 수행 할 수있는 최고의 실습 / 적절한 방법이 있습니까? PHP가 점점 더 많은 객체 지향적이되면서, 나는 바퀴를 재창조 할까봐 두려운다.

이 코드의 웅장한 목적은 데이터베이스가 커밋 될 때까지 데이터베이스를 사용하지 않고 복잡한 객체의 생성 및 조작을 허용하는 것입니다. 그러면 적절한 트랜잭션을 사용하여 데이터베이스에 전체적으로 커밋 할 것입니다. 내 데이터베이스에 완전한 송장 만 포함되거나 송장이 전혀 포함되지 않도록 만들고 싶습니다.

내 현재 방법은 다음과 같습니다.

<?php

include('encrypt.php');
include('invoice.class.php');

if(isset($_REQUEST['invoice']))
{
    $invoice = unserialize(decrypt(base64_decode($_REQUEST['invoice'])));
    if(!($invoice instanceOf invoice)) throw new exception('Something bad happened');
}
else
{
    // Some pages throw an exception if the $_REQUEST doesn't exist.
    $invoice = new invoice();
}

if(isset($_REQUEST['action']) && $_REQUEST['action'] == 'addLine')
{
    $invoice->addLine(new invoiceLine($_REQUEST['description'], $_REQUEST['qty'], $_REQUEST['unitprice']);
}

?>
<form action="index.php" method="post">
<input type="text" name="qty" />
...
<input type="hidden" name="invoice" value="<?php echo(base64_encode(encrypt(serialize($invoice)))); ?>" />
</form>
도움이 되었습니까?

해결책

간단한 숨겨진 양식 입력을 사용하여 쿠키없이 클라이언트의 상태를 저장할 수도 있습니다. 데이터 (아마도 직렬화 된 블로브)가 암호화되어 서명 된 한 사용자는 세션을 중단하지 않고 수정할 수 없습니다.

Steve Gibson은이 방법을 사용자 정의 전자 상거래 시스템에 사용합니다. 그의 코드는 오픈 소스가 아니지만 서버에 민감한 데이터를 저장하지 않고 쿠키 지원을 요구하지 않고 상태를 저장하는 방법을 철저히 설명합니다. 보안 지금 에피소드 #109, "GRC의 전자 상거래 시스템".

다른 팁

여기 트릭이 있습니다 : 쿠키에 넣으십시오!

깔끔한 알고리즘 :

$ data = serialize ($ 객체); $ time = time (); $ signature = sha1 ($ serversideseCret. $ time. $ data); $ 쿠키 = base64 ( "$ signature- $ time- $ data");

이점은 당신입니다

a) 서명 해시의 일부로 타임 스탬프를 사용하고 있기 때문에 원하는 경우 쿠키를 만료 할 수 있습니다.

b) 쿠키의 데이터 세그먼트에서 해시를 재현 할 수 있기 때문에 클라이언트 측에서 데이터가 수정되지 않았는지 확인할 수 있습니다.

또한 쿠키가 너무 크면 쿠키에 전체 객체를 저장할 필요가 없습니다. 서버에 필요한 데이터를 저장하고 쿠키의 데이터를 키로 사용하십시오.

나는 알고리즘에 대한 신용을 얻을 수 없으며, Flickr 명성의 Cal Henderson에게서 배웠습니다.

편집 : 쿠키를 너무 복잡하게 사용하는 경우 쿠키를 잊고 쿠키에 들어간 데이터를 숨겨진 형태의 필드에 저장하십시오.

내가 할 일은 암호를 저장하는 것입니다 열쇠 숨겨진 양식 변수로 (예와 같이 전체 구조가 아님). 이 키는 a에 대한 색인입니다 uncreated_invoices 불완전한 송장을 저장하는 테이블.

페이지간에 데이터를 Uncreated_Invoices 테이블에서 업데이트하고 완료되면 꺼내어 커밋합니다. 사용자 이름을 uncreate_invoices 테이블에 넣으면 중단 된 곳으로도 선택할 수 있습니다 (유효한 유스 케이스인지 확실하지 않음). 어쨌든 사람들이 다른 사람들의 송장을 납치하려고 할 수 없도록 사용자 이름을 어쨌든 넣는 것이 좋습니다.

원하는 경우 Uncreated_Invoices 테이블에 직렬화 된 데이터를 저장할 수 있습니다. 개인적으로, 나는 그것을 약간 정상화하여 (스키마에 얼마나 의존하는지) 개별 조각을 쉽게 추가/제거 할 수 있습니다.

편집 : 나는 당신이 청소해야한다고 언급하는 것을 잊었습니다. uncreated_invoices 테이블은 주기적으로 오래된 송장으로 채워지지 않습니다.

데이터를 $ _session 내의 배열에 저장 한 다음 각 창에 고유 한 ID를 가질 수 없습니다. 각 창에 고유 한 ID가있는 경우 양식의 일부로 ID를 전달할 수 있습니다. 창 ID를 기반으로 세션이나 데이터베이스에서 데이터를 저장/검색합니다.

그래서 이렇게? $ _session [ 'data'] [$ windowid]-> $ ObjectName

세션을 사용할 수 없다면 데이터를 직접 유지해야합니다. 데이터베이스 또는 다른 파일과 같이 지속되는 어딘가에 데이터를 배치해야합니다. 데이터를 세력하는 세션 외에 유일한 방법입니다.

나는 그것을 다시 가져 가고, 각 HTML 페이지에서 데이터를 보내고 로컬로 사용할 수 있습니다. 데이터를 수락하는 모든 페이지는 데이터 시퀀스를 계속하는 html/javaScript를 만들어야합니다.

클라이언트쪽에 물건을 저장하면 수정할 수 있습니다. 세션에 객체를 저장하고 싶지 않은 특정 이유가 있습니까? 객체를 저장하는 것이 실제로 실행 가능하지 않으면 서버의 다른 곳에서 유지해야합니다.

괜찮습니다. 원하는 모든 항목을 추가 할 수 있습니다. 코드의 문제점은 요청에서 품목 설명 자, 수량 및 가격을 가져 오는 것입니다. 가격은 실제로 백그라운드에서 찾아야합니다. 그렇지 않으면 사용자가 가격을 손으로 만들 수 있습니다. 도대체, 부정적인 가치 항목, 당신은 무료로 물건을 얻습니다.

당신은 무언가를 저장하고 싶습니다. 일반적으로 데이터베이스에서 수행됩니다. 데이터베이스에서 찾지 않고 무언가의 가격을 어떻게 알 수 있습니까? 따라서 동일한 데이터베이스를 사용하여 현재 사용자/세션에 대한 정보를 저장하십시오.

당신은 사용할 수 있습니다 마법 방법 __sleep() 그리고 __wakeup()

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top