2012-04-04 4 views
1

사용자가 과거 주문을 볼 수 있도록 사이트에 간단한 정수가 생성됩니다. url의 매개 변수를 모호하게 만드는 방법

http://site.com/order_id/145323

문제

는 그냥 그 번호를 변경 한 다음 다른 사람의 주문을 확인하는 것이 매우 쉽다는 점이다. 나는 URL에서이 숫자를 인 코드하고 PHP를 디코드하여 컨트롤러를 실행할 수있는 쉬운 방법이 무엇인지 궁금하다. 수퍼 보안이 필요하지 않습니다. 누군가 데이터를보기 위해 번호를 변경하는 것이 그렇게 쉽지는 않습니다. 내가 좋아하는 일을 시도 :

order_id/<?php echo base64_encode($theOrder); ?>

다음 컨트롤러 액션에 내가 시도 :

if($orderId = (int) $this->getRequest()->getParam('order_id') && Mage::getSingleton('customer/session')->isLoggedIn()){   
     $orderId = (int) $this->getRequest()->getParam('order_id'); 
     $orderId = base64_decode($orderId); 
     $order = Mage::getModel('sales/order')->load($orderId); 
     Mage::register('current_order', $order); 
     $this->loadLayout(); 
     $this->renderLayout(); 
    } 

하지만이 나던 작품. URL에서이 매개 변수를 모호하게 만드는 좋은 방법은 무엇입니까?

+0

PeeHaa와 동의하고, 또한 base64를 추가하기를 원했지만 그다지 모호하지 않았습니다. 대부분의 세미 테크니컬 사람들은 base64 문자열을 인식 할 수 있습니다 (2/3의 경우 끝에 '='패딩이 보통 줄 것입니다). –

+0

나는 이것이 훌륭한 해결책이 아니며 해킹하기 쉽다는 것을 이해하지만, 지금있는 것보다 낫다. 나는 PeeHaas 솔루션을 어떻게 할 것인지 알았지 만, 그런 식으로 체크를 어디에서 시작해야하는지 알지 못해서 임시 픽스를 빨리 얻어야합니다. – Zac

+0

높은 수준의 잘못이 아닌 다른 방법을 사용하면 원하는대로 성취 할 수있는 것처럼 보입니다. 왜 작동하지 않습니까? –

답변

6

너는 잘못하고있다.. id을 모호하게하려고하는 대신 id이 사용자에게 속해 있는지 확인해야합니다 (백엔드에서 확인).

그리고 id가 해당 사용자의 것이 아니면 403 Forbidden 또는 간단히 404 Not Found의 상태 코드를 반환하십시오.

+0

예, 사이트를 업그레이드하기 전까지는 좋겠지 만 반창고 수정을 찾고 있습니다. ID가 고객에게 속하는지 어떻게 확인할 지 확신하지 못합니다. – Zac

+1

IMHO 귀하의 반창고 솔루션은 해결책이 아니라 오히려 문제입니다. 당신은 이미 주문에 속한 주문을 추적하고 있습니다. "사용자가 과거 주문을 볼 수있게 해주는 간단한 정수로 URL을 생성했습니다." 따라서 두 쿼리를 일치시키는 간단한 쿼리로 문제를 해결할 수 있습니다. – PeeHaa

0

랜덤 URL을 구문 분석 할 때 해당 사용자 및 주문에 대해 사용자 테이블이나 데이터 저장소가있는 경우 해당 주문 번호가 현재 로그인 한 사용자에게 속하는지 확인합니다. 하지 ...

편집 난 당신이 시스템이 수반하는지 모르겠지만, 순수 가정에서 실행 아니에요

, 이것은 유용 할 수있다 '승인되지 않은, 로그인 해주세요'

I를 반환 사용자가 주문한다고 가정합니다. 그래서 나는 또한 모든 주문이 저장되고 가져 오는 ORDERS 테이블이 있다고 가정합니다. ORDERS 테이블에서

, 당신이 순서를 한 사용자를 저장해야합니다,

USERS table 
---------- 
user_id, username, password, full name, dob, etc 

ORDERS table 
---------- 
order_id, order_type, quantity, date_ordered, user_id 

따라서 당신이 주문과 연관된 사용자를 얻기 위해 SQL 쿼리를 사용할 수 있습니다 말한다. SELECT username FROM users JOIN orders ON users.user_id = orders.uder_id

같은

뭔가는 현재 로그인 한 사용자에 대해 반환 된 사용자 이름을 확인합니다.

당신의 지능을 모욕하는 것이 유감이지만, 당신이 뭘하고 있는지 확실하지 않습니다.

+0

물론 해킹 된 인코딩 작업을 만드는 방법을 알았지 만, 나는 당신이 제안한대로이 작업을 수행하는 더 좋은 방법을 찾고 싶습니다. 내가 읽을 수있는 링크 나 예를 들어 주시면 감사하겠습니다. – Zac

0

다른 사람들도 말했듯이이 문제를 해결하는 가장 좋은 방법은 데이터에 액세스하는 방식을 수정하고 요청의 주문 번호가 액세스하려는 사용자와 연결되어 있는지 확인하는 것입니다.

그러나 매우 빨리 수정해야하는 경우 요청의 HTTP_REFERER가 설정되어 있는지 확인할 수 있습니다. 설정되어 있고 사이트의 페이지를 다시 가리킨다면 이것이 합법적 인 요청이라는 것을 합리적으로 확신 할 수 있습니다.사용자가 주문 번호를 수정하여 URL을 수정 한 경우 HTTP_REFERER는 비어 있습니다.

완벽한 솔루션은 아니지만 사람들이하지 말아야 할 주문을 찾아 볼 수 없게 만듭니다.

관련 문제