이 튜토리얼은 Envato Tuts+의 "PHP로 스타트업 구축" 시리즈의 일부입니다. 이 시리즈에서는 미팅 플래너 앱을 실제 사례로 사용하여 스타트업을 시작하는 과정을 컨셉부터 현실까지 안내해 드리겠습니다. 모든 단계에서 귀하가 배울 수 있는 오픈 소스 예제로 Meeting Planner 코드를 공개하겠습니다. 스타트업과 관련해 발생하는 비즈니스 이슈도 다루겠습니다.
지난편에서는 주로 웹서버 보안과 접근제어에 대해 소개했습니다. 오늘 쇼에서는 Meeting Planner에 추가한 추가 보호 기능에 대해 논의하겠습니다. 모든 코드가 PHP의 Yii2 프레임워크로 작성되었기 때문에 많은 강화를 위해 프레임워크를 활용할 수 있었습니다. Yii2에 대해 더 자세히 알고 싶으시면 "Yii2를 사용한 프로그래밍" 시리즈를 확인해 보세요.
지금 첫 번째 회의를 예약하여 회의 플래너를 사용해 볼 수 있습니다. 아래 댓글에 귀하의 경험에 대한 피드백을 자유롭게 게시해 주십시오. 또한 새로운 기능에 대한 아이디어와 향후 튜토리얼에 대한 주제 제안에도 열려 있습니다.
Meeting Planner에 대해 다양한 수준의 보안을 구현하는 데 몇 시간이 걸립니다. 이제 서버가 더욱 강력하게 구성되었으므로 애플리케이션 코드의 다른 보안 영역을 안내하고 싶습니다.
인증 키를 해커로부터 멀리하는 것이 중요하지만 GitHub에 게시하는 것도 쉽습니다. 서비스 비밀번호나 API 키를 사용하여 실수로 파일을 체크인했다는 보고가 있었습니다.
Yii에서 이런 일이 발생하지 않도록 코드 트리 외부에 외부 .ini 파일을 보관합니다. 이는 /frontend/config/main.php 상단에 로드되며 필요한 구성 요소 구성에 사용됩니다.
으아악위의 예에서는 초기화 파일에서 로드된 Facebook API 비밀을 볼 수 있습니다.
초기화 파일의 형식은 매우 간단합니다.
으아악Yii2는 특히 개발과 프로덕션 간에 설정이 다른 경우 이러한 설정 중 일부를 /environments 디렉터리에 넣을 것을 권장합니다.
따라서 .gitignore 파일이 다음 파일의 로컬 버전을 제외하는 것이 중요합니다.
으아악다음은 내 로컬 매개변수 파일 중 하나인 /frontend/config/params-local.php의 예입니다.
으아악이것들을 더 잘 정리하는 데 더 많은 시간을 할애할 수 있을 것 같아요.
알파 버전의 경우 일괄 업데이트를 보내드렸습니다. 그리고 미팅플래너 초창기에는 불량 메일이 생각보다 많았습니다. Mailgun을 사용하면 반송 및 실패를 쉽게 식별할 수 있습니다.
으아악이런 일은 아마도 처음 나왔을 때 미팅 플래너가 한가했을 때, 즉 뇌종양 치료와 수술 중에 발생했을 것입니다.
최근에는 소셜로그인을 추가해서 미팅플래너 가입을 아주 쉽게 만들었는데, 스팸등록이 여전히 가능하네요. 사람들이 잘못된 이메일로 가입하는 것을 더 어렵게 만들고 싶습니다.
다행히 Yii는 이 기능을 지원하는 몇 가지 기능을 제공합니다.
Yii2는 이제 내장된 인증 코드를 제공합니다. 따라서 이전 이메일 및 비밀번호 방법을 사용하여 등록하는 사람은 누구나 인증 코드를 입력해야 합니다. 아래에서 captcha
필드를 볼 수 있습니다.
그런 다음 SignupForm
모델에 대한 규칙으로 CAPTCHA 준수를 추가하세요.
올바른 보안문자 응답을 입력하지 않으면 등록할 수 없습니다. 이로 인해 스패머가 등록을 자동화하기가 어렵습니다.
저도 가입 시 가짜 이메일 주소 사용을 최소화하고 싶습니다. Yii의 checkDNS
유효성 검사는 실제로 이메일 주소의 도메인을 기반으로 유효한 MX 레코드를 찾습니다.
예를 들어 gmail.com을 gmal.com으로 잘못 입력하면 checkDNS
将返回 false
는 false
를 반환합니다. gmal.com에는 등록된 MX 레코드가 없습니다. 마찬가지로 spabotolympics9922.com은 그렇지 않습니다.
결국 보안은 반복적인 프로세스입니다. 항상 할 일이 더 많습니다.
다음으로 남용을 제한하고 앱이 다루기 어려워지는 것을 방지하기 위해 사람들이 수행할 수 있는 작업 수에 대한 공통 제한을 추가하고 싶습니다.
사람들이 빈 회의를 많이 만드는 것을 방지하기 위해 누군가가 새 회의를 만들려고 할 때마다 빈 회의를 찾아서 재사용하는 findEmptyMeeting
를 만들었습니다.
으아악
즉, 사용자가 새 회의를 1,700번 생성하면 항상 자신이 만든 첫 번째 빈 회의가 표시됩니다.
또한 애플리케이션 주변에서 재사용할 수 있는 공통 구조의 withinLimit
메서드를 만들었습니다. 이렇게 하면 짧은 시간 내에 너무 많은 작업이 수행되는 것을 방지할 수 있습니다. 다음 예에서는 지난 시간과 마지막 날에 생성된 회의 수가 n을 초과하지 않는지 확인합니다.
public static function withinLimit($user_id,$minutes_ago = 180) { // how many meetings created by this user in past $minutes_ago $cnt = Meeting::find() ->where(['owner_id'=>$user_id]) ->andWhere('created_at>'.(time()-($minutes_ago*60))) ->count(); if ($cnt >= Meeting::NEAR_LIMIT ) { return false; } // check in last DAY_LIMIT $cnt = Meeting::find() ->where(['owner_id'=>$user_id]) ->andWhere('created_at>'.(time()-(24*3600))) ->count(); if ($cnt >= Meeting::DAY_LIMIT ) { return false; } return true; }
每当有人尝试创建会议时,我们都会检查 withinLimit
以查看他们是否可以。如果没有,我们会显示 flash
错误消息:
public function actionCreate() { if (!Meeting::withinLimit(Yii::$app->user->getId())) { Yii::$app->getSession()->setFlash('error', Yii::t('frontend','Sorry, there are limits on how quickly you can create meetings. Visit support if you need assistance.')); return $this->redirect(['index']); }
我还想限制操作的总数。例如,每个会议参与者只能为每次会议添加七个会议日期时间。在 MeetingTime.php 中,我设置了 MEETING_LIMIT
,以便稍后可以更改:
const MEETING_LIMIT = 7;
然后,MeetingTime::withinLimit()
检查以确保任何用户的建议次数不超过七次:
public static function withinLimit($meeting_id) { // how many meetingtimes added to this meeting $cnt = MeetingTime::find() ->where(['meeting_id'=>$meeting_id]) ->count(); // per user limit option: ->where(['suggested_by'=>$user_id]) if ($cnt >= MeetingTime::MEETING_LIMIT ) { return false; } return true; }
当他们去创建 MeetingTime
时,控制器创建方法会检查限制:
public function actionCreate($meeting_id) { if (!MeetingTime::withinLimit($meeting_id)) { Yii::$app->getSession()->setFlash('error', Yii::t('frontend','Sorry, you have reached the maximum number of date times per meeting. Contact support if you need additional help or want to offer feedback.')); return $this->redirect(['/meeting/view', 'id' => $meeting_id]); }
今天最后,我想确保对远程 cron 作业的访问安全。互联网上描述了一些有趣的方法。目前,我正在检查 $_SERVER['REMOTE_ADDR']
(请求 IP 地址)是否与托管 $_SERVER['SERVER_ADDR' 是同一服务器]
,本地IP地址。 $_SERVER['REMOTE_ADDR']
可以安全使用,换句话说,我已经了解到它无法被欺骗。
// only cron jobs and admins can run this controller's actions public function beforeAction($action) { // your custom code here, if you want the code to run before action filters, // which are triggered on the [[EVENT_BEFORE_ACTION]] event, e.g. PageCache or AccessControl if (!parent::beforeAction($action)) { return false; } // other custom code here if (( $_SERVER['REMOTE_ADDR'] == $_SERVER['SERVER_ADDR'] ) || (!\Yii::$app->user->isGuest && \common\models\User::findOne(Yii::$app->user->getId())->isAdmin())) { return true; } return false; // or false to not run the action }
对于我自己的测试,我还允许登录的管理员运行 cron 作业。
最终,我还可以为我的 cron 作业添加密码,并将它们移至命令行操作。
在过去的两集中,我已经完成了许多安全改进,但仍有更多工作要做。我的候选清单上包括对访问安全性的更深入审查,特别是通过 AJAX、IP 地址跟踪和阻止,以及仔细过滤所有用户输入。
再说一遍,你还在等什么?安排您的第一次会议,并在评论中分享您的反馈。我也非常感谢您对安全问题的评论。
与往常一样,您可以观看“使用 PHP 构建您的初创公司”系列中即将推出的教程,或关注我 @reifman。还有更多重要功能即将推出。
위 내용은 스타트업을 위한 보안 조치 강화: 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!