PHP输入验证的正确顺序


Proper order of PHP input validation

显然,您应该在服务器端验证所有用户输入数据。我只是好奇什么是"正确的"输入验证,以及应该按照什么顺序进行。

截至目前(以及过去的最近项目),我是这样做的:

获取用户输入,实例化对象,并调用方法:

if(isset($_POST['addCat'])) {
    $db = new DBConnection;
    $categories = new Category($db);
    if($categories->insert_cat($_POST['name']) === TRUE) {
        echo "Category Inserted Successfully!";
    }
}

从实例化对象调用的方法,该对象为:
1。转义用户输入
2。初始化data_validation对象(请参阅下面的验证对象)

class Categories {
    public function insert_cat($catName) {
        $catName = $this->mysqli->real_escape_string($catName);
        $validate = new data_validation;
        if(!($validate->validate_string($catName))) {
            echo "Invalid characters found in category name";
            die();
        }
        $query = $this->mysqli->query("INSERT INTO categories(name) VALUES ('".$catName."')");
        if($query === false) {
            printf("Error: %s'n", $this->mysqli->error);
            die();
        } else {
            return true;
        }
    }
}

data_validation类,该类为:
1。修剪数据
2。将数据与正则表达式匹配
3。将数据返回到insert_cat方法以插入数据库

class data_validation {
    public function validate_string($data) {
        // Remove excess whitespace
        $data = trim($data);
        if ( preg_match("/^[0-9A-Za-z '.'-'''"]+$/", $data) ) {
            return true;
        } else {
            //return 'Not a valid string';
            return false;
        }
    }
}

因此,简而言之,我的问题是:首先对数据进行转义,然后对其进行修剪,然后将其与正则表达式进行比较,然后添加htmlentites()或诸如此类的内容以保留任何格式,这合适吗?还是应该以不同的顺序进行?

任何改善我安全习惯的建议都非常受欢迎!

在开放式Web应用程序安全项目中,您可以找到有关验证和安全性的大部分信息。