スタートアップ向けセキュリティ対策強化ガイド

WBOY
リリース: 2023-09-03 10:46:01
オリジナル
1387 人が閲覧しました

スタートアップ向けセキュリティ対策強化ガイド

このチュートリアルは、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 はこの機能をサポートするいくつかの関数を提供しています。

###検証コード###

Yii2 は組み込みの検証コードを提供するようになりました。したがって、古い電子メールとパスワードの方法を使用して登録する場合は、確認コードを入力する必要があります。以下の

captcha

フィールドが表示されます: リーリー 次に、

SignupForm

モデルのルールとしてキャプチャ コンプライアンスを追加します。 リーリー 正しい CAPTCHA 応答を入力しないと、登録できません。このため、スパマーが登録を自動化することが困難になります。

DNSを確認する

また、登録時に偽の電子メール アドレスを使用することも最小限に抑えたいと考えています。 Yii の

checkDNS

検証は、実際には電子メール アドレスのドメインに基づいて有効な MX レコードを探します: リーリー たとえば、gmail.com を誤って gmal.com と入力した場合、

checkDNS

false を返します。 gmal.com には登録された MX レコードがありません。同様に、spambotolympics9922.com もそうではありません。 結局のところ、セキュリティは反復的なプロセスです。やるべきことは常にあります。

悪用を制限する

次に、悪用を制限し、アプリケーションが扱いにくくなるのを防ぐために、ユーザーが実行できるアクションの数に一般的な制限を追加したいと思います。

会議の作成

人々が空の会議を大量に作成するのを防ぐために、誰かが新しい会議を作成しようとしたときに空の会議を見つけて再利用する

findEmptyMeeting

を作成しました。 リーリー 言い換えると、ユーザーが新しい会議を 1,700 回作成すると、最初に作成した空の会議が常に表示されます。 動作周波数の制限

また、アプリケーション全体で再利用するための共通構造の

withinLimit

メソッドも作成しました。これにより、短期間にあまりにも多くの操作が実行されるのを防ぎます。次の例では、過去 1 時間以内と過去 1 日以内に作成された会議の数が 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 作业

今天最后,我想确保对远程 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。还有更多重要功能即将推出。

相关链接

  • 会议策划
  • 关注会议策划者的资金概况
  • 建立您的初创公司:基本安全性 (Envato Tuts+)
  • 使用 Yii2 编程:安全性 (Envato Tuts+)
  • Yii2 开发者交流会

以上がスタートアップ向けセキュリティ対策強化ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!