このチュートリアルは、Envato Tuts の「Build Your Startup with PHP」シリーズの一部です。このシリーズでは、私のミーティング プランナー アプリを実際の例として使用して、スタートアップの立ち上げをコンセプトから現実に至るまでガイドします。あらゆる段階で、Meeting Planner コードをオープンソースのサンプルとしてリリースし、そこから学ぶことができます。また、スタートアップ関連で発生するビジネス上の問題についても取り上げます。
前回のエピソードでは、主にWebサーバーのセキュリティとアクセス制御について紹介しました。今日のショーでは、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 の例です。
リーリーこれらをもっとうまく整理するには、おそらくもっと時間を費やすことができるでしょう。
アルファ版の場合は、アップデートをバッチで送信しました。また、Meeting Planner の初期の頃は、予想よりも悪質なメールが多かったです。 Mailgun を使用すると、バウンスと失敗を簡単に特定できます:
リーリーこれのほとんどは、おそらく、最初に発表されたとき、つまり脳腫瘍の治療と手術中に、会議プランナーが暇だったときに生じたものです。
最近、ソーシャル ログインを追加することで、Meeting Planner へのサインアップが非常に簡単になりましたが、スパム サインアップが依然として可能です。人々が不適切なメールでサインアップするのを困難にしたいと考えています。
幸いなことに、Yii はこの機能をサポートするいくつかの関数を提供しています。
###検証コード### フィールドが表示されます:
リーリー
次に、
モデルのルールとしてキャプチャ コンプライアンスを追加します。
リーリー
正しい CAPTCHA 応答を入力しないと、登録できません。このため、スパマーが登録を自動化することが困難になります。
DNSを確認する
検証は、実際には電子メール アドレスのドメインに基づいて有効な MX レコードを探します:
リーリー
たとえば、gmail.com を誤って gmal.com と入力した場合、
は false
を返します。 gmal.com には登録された MX レコードがありません。同様に、spambotolympics9922.com もそうではありません。
結局のところ、セキュリティは反復的なプロセスです。やるべきことは常にあります。
悪用を制限する
会議の作成
を作成しました。
リーリー
言い換えると、ユーザーが新しい会議を 1,700 回作成すると、最初に作成した空の会議が常に表示されます。
動作周波数の制限
また、アプリケーション全体で再利用するための共通構造の
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 中国語 Web サイトの他の関連記事を参照してください。