اعتبار سنجی
اطلاعات ارسال شده از سمت کاربر می بایست قبل از هرگونه عملیات، اعتبار سنجی شوند . بررسی رشته های دریافتی برای اطمینان از عدم وجود کد و یا کد های مخرب برنامه نویسی یکی از مهم ترین کارهایی است که در این بخش باید کنترل شوند .
فقط فیلد هایی که باید دریافت کنید را مشخص کنید تا مابقی فیلد ها ( که ممکن است توسط افراد مخرب در مقدار های ارسالی گنجانده شده اند ) نادیده گرفته شوند . میتوانید نوع و یا مقداری که انتطار دارید توسط کاربر از هر فیلد دریافت کنید را مشخص کنید . اعتبار سنج به صورت خودکار هر مقدار و یا نوعی به غیر از آنچه مشخص شده دریافت کنید ، با پرتاب یک استثناء از جنس package\base\inputValidation
از ادامه عملیات جلوگیری خواهد کرد .
برای این موضوع میتوانید از متد checkinputs
کلاس package\base\controller
استفاده کنید . این متد در پارامتر خود یک آرایه دریافت میکند . کلید های این آرایه ، نام فیلد ها و در هر ایندکس، نوع، مقدار پیشفرض، مقدار های مورد انتظار، اختیاری بودن و مجاز به خالی بودن برای هر فیلد به صورت جداگانه مشخص می شود .
مثال 1
<?php
namespace packages\packagename\controllers;
use \packages\base\{controller, response};
use \packages\packagename\user;
class Main extends controller {
public function register(): response {
$response = new response();
$view = view::byName(views\register::class);
$inputRules = array(
"firstname" => array(
"type" => "string",
),
"lastname" => array(
"type" => "string",
"optional" => true,
"empty" => true,
),
"email" => array(
"type" => "email",
),
"cellphone" => array(
"type" => "cellphone",
),
"state" => array(
"values" => array("Tehran", "Esfahan")
),
"publish_email" => array(
"type" => "bool",
),
"password" => array(),
"password_again" => array()
);
try {
$response->setStatus(false);
$inputs = $this->checkinputs($inputRules);
if ($inputs["password"] != $inputs["password_again"]) {
throw new inputValidation("password_again");
}
$user = new user();
$user->firstname = $inputs["firstname"];
if (isset($inputs["lastname"]) {
$user->lastname = $inputs["lastname"];
}
$user->email = $inputs["email"];
$user->cellphone = $inputs["cellphone"];
$user->password = md5($inputs["password"]);
$user->publish_email = $inputs["publish_email"];
$user->save();
$response->setStatus(true);
$response->Go(base\url("userpanel"));
} catch(inputValidation $error) {
$view->setFormError(FormError::fromException($error));
}
$response->setView($view);
return $response;
}
}
مثال 2
<?php
namespace packages\packagename\controllers;
use \packages\base\{controller, response};
use \packages\packagename\user;
class Main extends controller {
public function login(): response {
$response = new response();
$view = view::byName(views\login::class);
$inputRules = array(
"username" => array(
"type" => "email",
),
"password" => array()
);
try {
$response->setStatus(false);
$inputs = $this->checkinputs($inputRules);
$user = new user();
$user->where("email", $inputs["username"]);
$user->where("password", md5($inputs["password"]));
if (!$user = $user->getOne()) {
throw new inputValidation("username");
}
$response->setStatus(true);
$response->Go(base\url("userpanel"));
} catch(inputValidation $error) {
$view->setFormError(FormError::fromException($error));
}
$response->setView($view);
return $response;
}
}