Yiiフレーム防止sql注入、xss攻撃とcsrf攻撃の方法


本論文の実例は、Yiiフレームがsql注入を防止し、xss攻撃とcsrf攻撃の方法を説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
PHPでよく使われる方法は以下の通りです。

/*  sql  ,xss   (1)*/
function actionClean($str)
{
    $str=trim($str);
    $str=strip_tags($str);
    $str=stripslashes($str);
    $str=addslashes($str);
    $str=rawurldecode($str);
    $str=quotemeta($str);
    $str=htmlspecialchars($str);
    //      
    $str=preg_replace("/\/|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\+|\{|\}|\:|\<|\>|\?|\[|\]|\,|\.|\/|\;|\'|\`|\-|\=|\\\|\|/", "" , $str);
    $str=preg_replace("/\s/", "", $str);//    、   、   
    return $str;
}
//  sql  。xss  (1)
public function actionFilterArr($arr)
{
    if(is_array($arr)){
      foreach($arr as $k => $v){
        $arr[$k] = $this->actionFilterWords($v);
      }
    }else{
      $arr = $this->actionFilterWords($arr);
    }
    return $arr;
}
//  xss  
public function actionFilterWords($str)
{
    $farr = array(
      "/<(\\/?)(script|i?frame|style|html|body|title|link|meta|object|\\?|\\%)([^>]*?)>/isU",
      "/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU",
      "/select|insert|update|delete|drop|\'|\/\*|\*|\+|\-|\"|\.\.\/|\.\/|union|into|load_file|outfile|dump/is"
    );
    $str = preg_replace($farr,'',$str);
    return $str;
}
//  sql  ,xss  (2)
public function post_check($post) {
   if(!get_magic_quotes_gpc()) {
     foreach($post as $key=>$val){
       $post[$key] = addslashes($val);
     }
    }
   foreach($post as $key=>$val){
    // "_"   
    $post[$key] = str_replace("_", "\_", $val);
    // "%"   
    $post[$key] = str_replace("%", "\%", $val); //sql  
    $post[$key] = nl2br($val);
    //  html
    $post[$key] = htmlspecialchars($val); //xss  
   }
   return $post;
}

呼び出し:

//  sql
$post=$this->post_check($_POST);
//var_dump($post);die;
$u_name=trim($post['u_name']);
$pwd=trim($post['pwd']);
if(empty($u_name)||empty($pwd))
{
  exit('      ');
}
$u_name=$this->actionFilterArr($u_name);
$pwd=$this->actionFilterArr($pwd);
//  sql  ,xss  
$u_name=$this->actionClean(Yii::$app->request->post('u_name'));
$pwd=$this->actionClean(Yii::$app->request->post('pwd'));
$email=$this->actionClean(Yii::$app->request->post('email'));
//  csrf  
$session=Yii::$app->session;
$csrf_token=md5(uniqid(rand(),TRUE));
$session->set('token',$csrf_token);
$session->set('token',time());
//    
if($_POST)
{
  if(empty($session->get('token')) && $session->get('token')!=Yii::$app->request->post('token') && (time()-$session->get('token_time'))>30){
    exit('csrf  ');
  }
  //  sql
  .....
(受信データ以外に置かなければならない)
注意:
フォーム提出値は、csrf攻撃を防ぐために、コントローラに追加する必要があります。

//  csrf
piblic $enableCsrfValidation = false;
より多くのYii関連コンテンツに興味がある読者は、本局のテーマを見ることができます。「Yiiフレーム入門及び常用テクニックまとめ」、「php優秀開発フレームまとめ」、「smartyテンプレート入門基礎教程」、「php対象プログラム設計入門教程」、「php文字列(string)使い方のまとめ」、「php+mysqlデータベース操作入門教程」および「phpよくあるデータベースの操作技巧のまとめ
ここで述べたいのですが、Yiiフレームに基づくPHPプログラムの設計に役立ちます。