现在的位置: 首页 > 综合 > 正文

注册表单:服务器端的数据有效性验证

2013年12月02日 ⁄ 综合 ⁄ 共 1466字 ⁄ 字号 评论关闭

1.trim()函数截去头尾的空白字符

2.empty()函数判断变量内容是否为空

3.判断用户名、密码长度是否在规定范围内

4.判断两次密码是否一致

5.用正则表达式判断Email格式是否正确

6.判断用户名是否已存在

7.小心sql注入漏洞

小心SQL注入漏洞

前面对客户端提交的数据进行了截去头尾空格然后判断是否为空,判断密码长度是否在有效范围,判断Email的格式是否有效,以及判断用户名是否重复等数据的有效性验证,是否这就足够了呢?其实还有一个SQL注入漏洞的问题值得重视。

客户端提交上来的数据往往被用于构造SQL语句,使用这些构造出来的SQL语句访问数据库时会发生SQL注入攻击。所谓SQL注入,即客户端提交的数据用于构成了非法访问数据库的SQL语句。

为防止SQL注入漏洞,一是要遵循最小权限的原则,即赋予连接数据库的用户尽可能小(仅能执行预期的操作)的权限,严禁使用特权用户(如root);二是要尽可能地过滤由客户端提交上来的可疑的非法数据。

假设在服务器端将执行如下SQL语句:

$sql = "DELETE FROM t_user WHERE f_username='$username'";

这条SQL语句的本意是根据客户端的要求删除特定用户,但是如果一个不怀好意的访问者知道服务器端的数据库的用户信息表的名称,而且提交了一个用户名为“1' OR 1 --”的数据,即$username = "1' OR 1 – –"。此时将上面这条SQL语句中的$username替换成提交上来的实际值后成为:

$sql = "DELETE FROM t_user WHERE f_username='1' OR 1 –- '";

由于删除条件中的“OR 1”,结果表t_user中的记录将被全部删除。

要防范SQL注入漏洞,实际上只要屏蔽一些SQL命令及关键字即可。在进行服务器端的数据有效性验证之前,调用以下函数即可防止SQL注入漏洞:

<?php

function checkIllegalWord ()

{

    // 定义不允许提交的SQL命令及关键字

    $words = array();

    $words[]    = " add ";

    $words[]    = " count ";

    $words[]    = " create ";

    $words[]    = " delete ";

    $words[]    = " drop ";

    $words[]    = " from ";

    $words[]    = " grant ";

    $words[]    = " insert ";

    $words[]    = " select ";

    $words[]    = " truncate ";

    $words[]    = " update ";

    $words[]    = " use ";

    $words[]    = "-- ";

  

    // 判断提交的数据中是否存在以上关键字, $_REQUEST中含有所有提交数据

    foreach($_REQUEST as $strGot) {

        $strGot = strtolower($strGot); // 转为小写

        foreach($words as $word) {

            if (strstr($strGot, $word)) {

                echo "您输入的内容含有非法字符!";

                exit; // 退出运行

            }

        }

    }// foreach

}

checkIllegalWord(); // 在本文件被包含时即自动调用

?>

抱歉!评论已关闭.