Yiiフレーム防止sql注入、xss攻撃とcsrf攻撃の方法
本論文の実例は、Yiiフレームがsql注入を防止し、xss攻撃とcsrf攻撃の方法を説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
PHPでよく使われる方法は以下の通りです。
注意:
フォーム提出値は、csrf攻撃を防ぐために、コントローラに追加する必要があります。
ここで述べたいのですが、Yiiフレームに基づくPHPプログラムの設計に役立ちます。
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プログラムの設計に役立ちます。