You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
4.8 KiB
191 lines
4.8 KiB
<?php
|
|
|
|
/*
|
|
|
|
Copyright (c) 2009-2019 F3::Factory/Bong Cosca, All rights reserved.
|
|
|
|
This file is part of the Fat-Free Framework (http://fatfreeframework.com).
|
|
|
|
This is free software: you can redistribute it and/or modify it under the
|
|
terms of the GNU General Public License as published by the Free Software
|
|
Foundation, either version 3 of the License, or later.
|
|
|
|
Fat-Free Framework is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with Fat-Free Framework. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
//! Data validator
|
|
class Audit extends Prefab {
|
|
|
|
//@{ User agents
|
|
const
|
|
UA_Mobile='android|blackberry|phone|ipod|palm|windows\s+ce',
|
|
UA_Desktop='bsd|linux|os\s+[x9]|solaris|windows',
|
|
UA_Bot='bot|crawl|slurp|spider';
|
|
//@}
|
|
|
|
/**
|
|
* Return TRUE if string is a valid URL
|
|
* @return bool
|
|
* @param $str string
|
|
**/
|
|
function url($str) {
|
|
return is_string(filter_var($str,FILTER_VALIDATE_URL));
|
|
}
|
|
|
|
/**
|
|
* Return TRUE if string is a valid e-mail address;
|
|
* Check DNS MX records if specified
|
|
* @return bool
|
|
* @param $str string
|
|
* @param $mx boolean
|
|
**/
|
|
function email($str,$mx=TRUE) {
|
|
$hosts=[];
|
|
return is_string(filter_var($str,FILTER_VALIDATE_EMAIL)) &&
|
|
(!$mx || getmxrr(substr($str,strrpos($str,'@')+1),$hosts));
|
|
}
|
|
|
|
/**
|
|
* Return TRUE if string is a valid IPV4 address
|
|
* @return bool
|
|
* @param $addr string
|
|
**/
|
|
function ipv4($addr) {
|
|
return (bool)filter_var($addr,FILTER_VALIDATE_IP,FILTER_FLAG_IPV4);
|
|
}
|
|
|
|
/**
|
|
* Return TRUE if string is a valid IPV6 address
|
|
* @return bool
|
|
* @param $addr string
|
|
**/
|
|
function ipv6($addr) {
|
|
return (bool)filter_var($addr,FILTER_VALIDATE_IP,FILTER_FLAG_IPV6);
|
|
}
|
|
|
|
/**
|
|
* Return TRUE if IP address is within private range
|
|
* @return bool
|
|
* @param $addr string
|
|
**/
|
|
function isprivate($addr) {
|
|
return !(bool)filter_var($addr,FILTER_VALIDATE_IP,
|
|
FILTER_FLAG_IPV4|FILTER_FLAG_IPV6|FILTER_FLAG_NO_PRIV_RANGE);
|
|
}
|
|
|
|
/**
|
|
* Return TRUE if IP address is within reserved range
|
|
* @return bool
|
|
* @param $addr string
|
|
**/
|
|
function isreserved($addr) {
|
|
return !(bool)filter_var($addr,FILTER_VALIDATE_IP,
|
|
FILTER_FLAG_IPV4|FILTER_FLAG_IPV6|FILTER_FLAG_NO_RES_RANGE);
|
|
}
|
|
|
|
/**
|
|
* Return TRUE if IP address is neither private nor reserved
|
|
* @return bool
|
|
* @param $addr string
|
|
**/
|
|
function ispublic($addr) {
|
|
return (bool)filter_var($addr,FILTER_VALIDATE_IP,
|
|
FILTER_FLAG_IPV4|FILTER_FLAG_IPV6|
|
|
FILTER_FLAG_NO_PRIV_RANGE|FILTER_FLAG_NO_RES_RANGE);
|
|
}
|
|
|
|
/**
|
|
* Return TRUE if user agent is a desktop browser
|
|
* @return bool
|
|
* @param $agent string
|
|
**/
|
|
function isdesktop($agent=NULL) {
|
|
if (!isset($agent))
|
|
$agent=Base::instance()->AGENT;
|
|
return (bool)preg_match('/('.self::UA_Desktop.')/i',$agent) &&
|
|
!$this->ismobile($agent);
|
|
}
|
|
|
|
/**
|
|
* Return TRUE if user agent is a mobile device
|
|
* @return bool
|
|
* @param $agent string
|
|
**/
|
|
function ismobile($agent=NULL) {
|
|
if (!isset($agent))
|
|
$agent=Base::instance()->AGENT;
|
|
return (bool)preg_match('/('.self::UA_Mobile.')/i',$agent);
|
|
}
|
|
|
|
/**
|
|
* Return TRUE if user agent is a Web bot
|
|
* @return bool
|
|
* @param $agent string
|
|
**/
|
|
function isbot($agent=NULL) {
|
|
if (!isset($agent))
|
|
$agent=Base::instance()->AGENT;
|
|
return (bool)preg_match('/('.self::UA_Bot.')/i',$agent);
|
|
}
|
|
|
|
/**
|
|
* Return TRUE if specified ID has a valid (Luhn) Mod-10 check digit
|
|
* @return bool
|
|
* @param $id string
|
|
**/
|
|
function mod10($id) {
|
|
if (!ctype_digit($id))
|
|
return FALSE;
|
|
$id=strrev($id);
|
|
$sum=0;
|
|
for ($i=0,$l=strlen($id);$i<$l;$i++)
|
|
$sum+=$id[$i]+$i%2*(($id[$i]>4)*-4+$id[$i]%5);
|
|
return !($sum%10);
|
|
}
|
|
|
|
/**
|
|
* Return credit card type if number is valid
|
|
* @return string|FALSE
|
|
* @param $id string
|
|
**/
|
|
function card($id) {
|
|
$id=preg_replace('/[^\d]/','',$id);
|
|
if ($this->mod10($id)) {
|
|
if (preg_match('/^3[47][0-9]{13}$/',$id))
|
|
return 'American Express';
|
|
if (preg_match('/^3(?:0[0-5]|[68][0-9])[0-9]{11}$/',$id))
|
|
return 'Diners Club';
|
|
if (preg_match('/^6(?:011|5[0-9][0-9])[0-9]{12}$/',$id))
|
|
return 'Discover';
|
|
if (preg_match('/^(?:2131|1800|35\d{3})\d{11}$/',$id))
|
|
return 'JCB';
|
|
if (preg_match('/^5[1-5][0-9]{14}$|'.
|
|
'^(222[1-9]|2[3-6]\d{2}|27[0-1]\d|2720)\d{12}$/',$id))
|
|
return 'MasterCard';
|
|
if (preg_match('/^4[0-9]{12}(?:[0-9]{3})?$/',$id))
|
|
return 'Visa';
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/**
|
|
* Return entropy estimate of a password (NIST 800-63)
|
|
* @return int|float
|
|
* @param $str string
|
|
**/
|
|
function entropy($str) {
|
|
$len=strlen($str);
|
|
return 4*min($len,1)+($len>1?(2*(min($len,8)-1)):0)+
|
|
($len>8?(1.5*(min($len,20)-8)):0)+($len>20?($len-20):0)+
|
|
6*(bool)(preg_match(
|
|
'/[A-Z].*?[0-9[:punct:]]|[0-9[:punct:]].*?[A-Z]/',$str));
|
|
}
|
|
|
|
}
|
|
|