第13章 安全性方法

2018-03-03 15:22:13 《PHP与MySQL动态网站开发》笔记 阅读: 247

使用类型验证数据

PHP对于每一种类型都有特定的类型验证函数:
is_bool(), is_array(), is_numeric(), isfloat(), is_int(), is_null(), is_resource(), is_scalar(), is_string(), is_nan()

强制类型转换:$var = (type)$var

验证上传文件类型

方法:

$fileinfo = finfo_open(FILEINFO_MIME_TYPE);  //创建Fileinfo
if(finfo_file($fileinfo, $_FILES['input_name']['tmp_name']) != MIME类型){  //验证文件的MIME类型
    unlink($_FILES['input_name']['tmp_name']);  //删除文件
    //other code
}else{
    //code
}
finfo_close($fileinfo);  //释放fileinfo(同一个Fileinfo资源可以使用多次)

参考:文件MIME类型大全

预防XSS攻击

XSS攻击:web页面的输入框,可以输入HTML、css、JavaScript代码,攻击者通过输入恶意代码来窃取cookie、重定向、窃取资料等。

验证用户输入:

  • htmlspecialchars():把&、'、"、<、>转换成HTML实体字符
  • htmlentities(): 把所有适用的字符转换为HTML实体字符
  • strip_tags(): 删除所有的HTML和PHP标签

nl2br()函数可以将回车符转换成HTML的br标签

使用过滤器扩展

PHP5.2提供了过滤器扩展,功能是验证数据和清理数据

过滤变量:

fileter_var($var, filter [, options]);

filter为使用的过滤器类型,有验证过滤器和清理过滤器,options为附加条件

预防SQL注入攻击

SQL注入攻击:将恶意SQL代码插入SQL查询中,从而改变、破坏、盗取数据。

预防措施:

  1. 验证查询中使用的所有数据(类型转换、过滤器扩展)
  2. 使用mysqli_real_escape_string()进行合法性验证
  3. 关闭错误报告,防止泄露信息

预处理语句

预处理查询:先使用占位符代替数据的原始串发送到MySQL解析,确保语法有效,之后再单独发送数据,MySQL再使用这些数据进行查询。

优点:

  1. 安全性高,可以很好的预防SQL注入
  2. 速度更快,多次使用相同的SQL语法并发送不同的值比直接进行SQL查询更快

例子:

$link = mysqli_connect("localhost", "my_user", "my_password", "world");  //连接到MySQL

/* 检查连接错误 */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}

//第一种:无返回数据的查询

mysqli_query($link, "CREATE TABLE myCity LIKE City");

/* 准备插入数据的声明 */
$query = "INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)";
$stmt = mysqli_prepare($link, $query);

mysqli_stmt_bind_param($stmt, "sss", $val1, $val2, $val3);

$val1 = 'Stuttgart';
$val2 = 'DEU';
$val3 = 'Baden-Wuerttemberg';

/* 执行查询 */
mysqli_stmt_execute($stmt);

$val1 = 'Bordeaux';
$val2 = 'FRA';
$val3 = 'Aquitaine';

/* 执行查询 */
mysqli_stmt_execute($stmt);

/* 关闭声明 */
mysqli_stmt_close($stmt);

//第二种:有返回数据的查询
$query = "SELECT Name, CountryCode, District FROM myCity";
if ($result = mysqli_query($link, $query)) {
    while ($row = mysqli_fetch_row($result)) {
        printf("%s (%s,%s)\n", $row[0], $row[1], $row[2]);
    }
    mysqli_free_result($result);
}

/* 关闭MySQL连接 */
mysqli_close($link);

mysqli_stmt_execute()第二个参数用于格式化字符(类似printf第一参数):

  • d: 浮点数Decimal
  • i: 整数Integer
  • b: 二进制数据binary data
  • s: 其他类型

预防暴力攻击

预防暴力破解登录的方法:

  1. 让用户注册安全性高的密码:包含数字、字母、符号,长度至少8位等
  2. 设置动态登录验证码,并用图片形式给出
  3. 不要给出登录失败的具体原因:可以只说明用户名和密码的组合不正确,而不用说明用户名或密码不正确
  4. 限制某个ip的登录次数,或者登录失败多次屏蔽ip,或者同ip每次失败登录延迟响应(sleep()函数)等

版权声明:本文为博主原创文章,转载需注明来自: 洛洛の空间


功能
最新评论