本文实例讲述了Yii框架防止sql注入,xss攻击与csrf攻击的方法。分享给大家供大家参考,具体如下:
PHP中常用到的方法有:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
/* 防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 ;
}
|
调用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
//防止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攻击,控制器中需要加上:
1
2
|
//关闭csrf
piblic $enableCsrfValidation = false;
|
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。