鍍金池/ 問答/PHP  數(shù)據(jù)庫/ php 表單數(shù)據(jù)邏輯驗證問題

php 表單數(shù)據(jù)邏輯驗證問題

假如
1 某用戶有刪除權(quán)限,但他修改 前端腳本發(fā)送本應(yīng)不屬于他的id,那么他就有刪除整個數(shù)據(jù)庫的能力。
2 假如某個用戶添加商品時選擇數(shù)據(jù)庫沒有的商品類型(就是構(gòu)建請求時修改參數(shù))
3 又或者本來只有 男女 的枚舉 field ,但用戶卻發(fā)送了除此之外的數(shù)據(jù),例如人妖

這些數(shù)據(jù)大多是int tinyint 類型的,能穿透常規(guī)的表單驗證,如是否數(shù)字啊,長度啊,是否為郵箱格式之類的

那么就要寫邏輯驗證,但操作一多,數(shù)據(jù)表字段的關(guān)聯(lián)性字段一多,便會增加 大量代碼,有沒有更好的辦法能解決,或者一些已經(jīng)做好的輪子參考呢?

回答
編輯回答
別傷我

一般php框架都有封裝好一套自己的表單驗證方法,比如yii2 laravel都有validate表單驗證功能,直接拿來用就行了。
如果框架沒有可以自己封裝一些常用的驗證方法,或者github找現(xiàn)成的validate輪子:
Validation
valitron

2017年10月12日 15:12
編輯回答
默念

一般驗證分兩種:
1、數(shù)據(jù)類型格式范圍驗證,這個比較簡單,一般放在邏輯處理的最前面驗證,mvc框架都有這個,輪子比較多。
2、邏輯、權(quán)限等的驗證,這些一般是摻雜在邏輯處理過程中,比如你說的刪除權(quán)限,不存在的商品類型,這是在邏輯處理中必須要做的,這種一般沒有輪子,但可以自己寫的多處復(fù)用。

2018年4月10日 23:50
編輯回答
淡墨

前端 有寫好的一些前端框架驗證, 比如 妹子UI 的 js 驗證, H-ui 的前端js驗證 都是對表單的數(shù)據(jù)進(jìn)行驗證, 后端框架 laravel 對 request寫好的 validate驗證 都有 或者你 也可以寫一個公共驗證類 注入進(jìn)來 就可以了

2018年3月30日 07:29
編輯回答
愛礙唉

樓主所說的問題,涉及兩個方面:

  1. 權(quán)限控制問題;

  2. 數(shù)據(jù)過濾問題;

1. 權(quán)限控制問題

不好的做法:根據(jù)前端發(fā)送的 id 來判斷。
建議做法:基于登陸狀態(tài)的用戶角色來做控制,比如:基于角色的權(quán)限訪問控制 (RBAC)
其中,登陸狀態(tài)應(yīng)該通過 cookie - session 機(jī)制來判斷。
參考:Cookie/Session機(jī)制詳解

2. PHP 數(shù)據(jù)過濾

可以使用 PHP 現(xiàn)有的函數(shù)擴(kuò)展完成,可以使用特定的過濾器過濾一個變量。
比如過濾郵箱:

<?php
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
var_dump(filter_var('http://example.com', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED));

// 輸出結(jié)果如下
string(15) "bob@example.com"
bool(false)

參考:

clipboard.png

具體的過濾器類型可以參考:Validate filters

但是,如果要判斷變量是否在一個指定范圍的集合內(nèi) (eg. in_array),就需要自行寫判斷方法,如果是多個地方類似的判斷,可以抽象成一個統(tǒng)一的方法,來降低代碼量。

2018年6月11日 15:20
編輯回答
北城荒

這種情況分兩步:
1.前端驗證,如果你只是做做后臺驗證也麻煩你的告訴一下前端,一些常規(guī)的驗證比如名字不能輸引號啊,過濾掉空格;手機(jī)必須是11位還對手機(jī)號的合法性做一下校驗。就是讓前端把力所能及的判斷做掉。
2.后端驗證
①數(shù)字的合法性以及合法范圍,比如你要求1-3那么他不可能出現(xiàn)4,比如你要求了男女、保密,那么出現(xiàn)人妖就是非法的,性別這個用tinyint會很好控制。
②你說的刪除問題,如果你的后端真的靠一個id就能執(zhí)行刪庫這種操作,那后端的安全性太讓人捉急了,最少搞個密碼驗證,token驗證啥的吧。
③商品添加問題,商品應(yīng)該是有分類的吧,只有選擇了分類才能添加商品,好像從沒有自己填寫商品的類型的。你也說了有數(shù)據(jù)庫商品類型,那為什么不顯示給他讓他選擇了。給客戶做一個選擇,就少了很多出錯的機(jī)會,如果給客戶自由發(fā)揮,那么各種奇怪的bug都可能有

反正,永遠(yuǎn)不要相信客戶的輸入,多少年來不變的真理

2017年2月15日 01:47