2011-02-04 6 views
10

저는 현재 매우 바쁜 인터넷 웹 사이트 용 API를 구축 중입니다. MySQL과 함께 PHP로 작성되었습니다. 이제 사람들이 자신의 계정에 원격으로 액세스 할 수있게 해주는 필자가 작성한 첫 번째 API입니다. API가 온라인 상태가되면 개발자는 자신의 도구를 작성할 수 있습니다.PHP/MYSQL을 사용하여 보안 공용 API 작성하기

이제 API가 작동하지만 완전히 안전한지 확실하지 않습니다. 일하는 것이

URL의 예는 다음과 같습니다 http://domain.com/api.php?api_option=list&api_user_name=USERNAME&api_user_password=PASSWORD

USERNAME는 : 실제 이름

PASSWORD 사용자 것 : 자신의 실제 암호의 MD5 인코딩 된 문자열이 될 것입니다.

세부 정보가 일치하면 결과가 반환되고 그렇지 않으면 오류가 반환됩니다.

모든 외부 $_GET 입력은 mysql_real_escape_string() 처리를받습니다.

간단하게 유지하고 싶었지만이 방법이 사용자 계정 데이터를 직접 누르는 공개 API를 사용하는 안전한 방법인지 확실하지 않습니다.

아이디어와 제안을 많이 듣습니다.

+0

URL에 암호 해시가있는 것은 좋은 생각이 아닙니다. 더 좋은 방법은 사용자와 API 사이에 어떤 형태의 인증을 호출하는 API 키를 갖는 것입니다. – diagonalbatman

+0

모든 의견을 주셔서 감사합니다, OAuth, 내가 필요로하는 것에 대해 조금 복잡해 보입니다. 그래서 나 자신의 API 키 설정을 만들고 있습니다. auth 키가 연결된 user_id를 사용하여 데이터베이스에 저장된 키가있는 부분이 있습니다. 이 설정은 작동하지만 사용자는이 키를 가져와야합니다. 다른 사용자가이 API에서 도구를 작성하는 경우 사용자는 등록 된 사용자 이름/패스로 로그인 할 수 있어야합니다.그래서 저는 여전히 원격으로 API 키를 생성하기 위해 사용자 이름과 암호를 모두받을 수있는 초기 $ _GET url을 얻는 방법을 알지 못합니다. –

답변

4

HMAC_SHA1과 사용자의 비밀번호를 사용하여 서명 요청을하는 방법은 어떻습니까? 예를 들어, URL : http://domain.com/api.php?api_option=list&api_user_name=USERNAME&api_user_password=PASSWORD

는 타임 스탬프 및/또는 임의의 문자열 (비표)을 추가하고 표준화 된 base_string 구축 :

$base_string = "api_option=list&api_user_name=USERNAME&timestamp=1296875073&nonce=hgg65JHFj"; 
$signature = hmac_sha1($base_string, PASSWORD); 

는 새로운 URL은 다음과 같습니다 http://domain.com/api.php?api_option=list&api_user_name=USERNAME&timestamp=1296875073&nonce=hgg65JHFj&signature=kfvyhgfytgyr6576yfgu

무엇 서버가하는 일은 서명을 제외한 모든 옵션을 얻은 다음 동일한 방법을 사용하여 서명을 생성하고 클라이언트가 보낸 서명과 비교하는 것입니다.

+0

안녕하세요, 아빈, 답변 해 주셔서 감사합니다. 나는 일반적인 생각을 갖기 시작했다. 다음 설정에 대해 의견을 제시해주십시오. 1. 웹 마스터가 고유 한 webmaster_api_key 을 사용하기 위해 가입합니다. 2. 'username', 'password', 'webmaster_api_key', 'timestamp'가 포함 된 https를 통해서만 $ _POST 요청을 apilogin.php에 보낼 수 있습니다. 3. apilogin.php는 $ base_string = "username + timestamp + webmaster_api_key"를 실행합니다. $ signature = hash_hmac ('sha512', $ base_string, $ password); 로그인 정보가 유효한 경우 $ signature를 반환합니다. 이 $ 서명은 user_id가 연결된 세션 데이터베이스에 기록됩니다. –

+0

또한 세션의 만료 시간을 100 % 확신하는 방법이 아닙니다. 나는 사용자가 특정 시나리오에서 오랫동안 로그인하고 싶어한다고 생각한다. 또한 사용자는 다양한 도구를 사용하여 로그인 상태를 유지하려고 할 수 있습니다. 이는 1 명의 사용자 만 db에 저장된 다양한 세션을 의미합니다. 세션을 만료 시키려면 누가 로그 아웃을 클릭 했습니까? –

13

인터넷을 사랑한다면, Do not do this. I 당신은 당신의 API를위한 OAuth를 구현하는데 시간을 할애해야합니다. 부디. 제발 제발 제발.

이것 좀 봐 :

+0

OAuth를 사용해야합니까? 나는 그것을 좋아하지 않는다 ... (위의 방법이 좋지 않거나 안전하지 않다는 것에 동의 함) – o1iver

+0

@ o1iver : OAuth가 상당히 보편적이며, 특히 OP 이후 명확하게 그것에 대해 많이 쓰여졌 기 때문에 OAuth를 추천하고있다. 자신의 보안 구현을 생각해 낼 수 없다. 어떤 토큰 기반 인증 시스템이라도 현재 그가하고있는 것보다 낫습니다. –

+0

오케이, 토큰 기반 인증에 대해 동의합니다. OAuth가 마음에 들지 않습니다 .-) – o1iver

4

http://toys.lerdorf.com/archives/55-Writing-an-OAuth-Provider-Service.html 그것이 MD5로 인코딩 특히,이 인코딩 된 경우에도, API 통관에 대한 암호를 사용하지 마십시오. 또한 사용자 이름을 사용하지 않을 것입니다. 사용자가 키를 생성하도록하십시오. 누군가가 사용자의 계정에 액세스하기 위해 알아야 할 것의 50 %를 알 수있는 능력을 부여하고 있으며 MD5에는이를 되돌릴 수 있고 암호 일치를 찾을 수있는 많은 사이트가 있습니다. 개발자가 보안상의 목적으로 개발할 수있는 핵심은 열쇠입니다. 항상 보안을 생각하십시오.