ホームページ >バックエンド開発 >PHPチュートリアル >PHP 検証コードにより、外部ネットワークからの直接アクセスが防止されます

PHP 検証コードにより、外部ネットワークからの直接アクセスが防止されます

WBOY
WBOYオリジナル
2016-06-23 13:36:12807ブラウズ

2015-04-23 12:16:58
今日、saeにデプロイされているプロジェクトをチェックしていて、ふとsaeのログを見たら、検証コードを要求する異常なリンクがいくつかあったので、ふと検証を防ぐ方法を考えてみました。コードが捕捉されないようにします。この機能により、認証コードの盗難やクラッキングを防止し、不必要な悪意のある攻撃やクラッキングを防ぐことができます。
考え方は次のとおりです:
検証コード生成クラスを呼び出す前にアクセス リンクを検証します
1. アクセス元のページ番号を検証します
2. 次にアクセス アドレスを検証します
解決策の手順:
1. 以下の関数を使用します。 PHPには認証コードを判定する機能が付属していますが、特定のページ番号からのアクセスかどうかを判定するのは基本的に非現実的です。PHPにはそのような機能はないようです(見つけられませんでした)ので、PHPを使用するしかありません。ここでは、セッションを使用してページ番号からのものであるかどうかを確認します。確認コードが必要なページはほとんどないため、セッションを設定する場所はそれほど多くなく、比較的許容範囲です。

2. アクセスアドレスを確認します。これは、php が提供する $_SERVER 関数を使用して、アクセスアドレスを取得することができます。

3. 認証コード生成後、次回認証できないようにセッション内で認証値を設定します。


具体的なコード (必要に応じて変更できますが、ここでは 1 つのアイデアのみを示します):

たとえば
1. 検証コードをロードする必要があるページに $_SESSION['check'] を設定します(またはコントローラー層関数内) =true; 2. 検証コードを呼び出す前に検証を呼び出します
<?php/** * Created by PhpStorm. * User: wangyaofeng * Date: 15-4-23 * Time: 上午9:36 *//** * 检测访问的ip是否为规定的允许的ip * Enter description here ... *///ip地址的验证用户根据自己的需求改变function check_ip(){    $ALLOWED_IP=array('127.0.0.1');    $IP=getIP();    $check_ip_arr= explode('.',$IP);//要检测的ip拆分成数组    #限制IP    if(!in_array($IP,$ALLOWED_IP)) {        foreach ($ALLOWED_IP as $val){            if(strpos($val,'*')!==false){//发现有*号替代符                $arr=array();//                $arr=explode('.', $val);                $bl=true;//用于记录循环检测中是否有匹配成功的                for($i=0;$i<4;$i++){                    if($arr[$i]!='*'){//不等于*  就要进来检测,如果为*符号替代符就不检查                        if($arr[$i]!=$check_ip_arr[$i]){                            $bl=false;                            break;//终止检查本个ip 继续检查下一个ip                        }                    }                }//end for                if($bl){//如果是true则找到有一个匹配成功的就返回                    return;                    die('success');                }            }        }//end foreach        header('HTTP/1.1 403 Forbidden');        echo "Access forbidden";        die;    }}function getIP() {    return isset($_SERVER["HTTP_X_FORWARDED_FOR"])?$_SERVER["HTTP_X_FORWARDED_FOR"]        :(isset($_SERVER["HTTP_CLIENT_IP"])?$_SERVER["HTTP_CLIENT_IP"]            :$_SERVER["REMOTE_ADDR"]);}if(!$_SESSION['check']){    check_ip();}//重新设置验证码的值$_SESSION['check'] = false;


基本的にはこの 2 つの手順で検証コードを制限することができます。通常、外部ネットワーク経由で Web サイトにアクセスする場合は拒否されますが、外部ネットワーク経由で認証コードに直接アクセスまたは取得する場合は、ローカルで認証コードにアクセスする場合はすべて正常です。

図に示すように:

ローカル アクセス

外部ネットワーク アクセス

外部ネットワーク アクセス ログイン





声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。