Skip to content

Commit ade1e2d

Browse files
rjd22jaapmarcus
authored andcommitted
Improve validation of IPv4 and IPv6 by using php filter
1 parent 3bd7c9c commit ade1e2d

File tree

2 files changed

+19
-108
lines changed

2 files changed

+19
-108
lines changed

func/main.sh

Lines changed: 14 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -791,117 +791,27 @@ is_alias_format_valid() {
791791

792792
# IP format validator
793793
is_ip_format_valid() {
794-
object_name=${2-ip}
795-
ip_regex='([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])'
796-
ip_clean=$(echo "${1%/*}")
797-
if ! [[ $ip_clean =~ ^$ip_regex\.$ip_regex\.$ip_regex\.$ip_regex$ ]]; then
798-
check_result "$E_INVALID" "invalid $object_name format :: $1"
799-
fi
800-
if [ $1 != "$ip_clean" ]; then
801-
ip_cidr="$ip_clean/"
802-
ip_cidr=$(echo "${1#$ip_cidr}")
803-
if [[ "$ip_cidr" -gt 32 ]] || [[ "$ip_cidr" =~ [:alnum:] ]]; then
804-
check_result "$E_INVALID" "invalid $object_name format :: $1"
805-
fi
806-
fi
794+
object_name=${2-ip}
795+
valid=$($HESTIA_PHP -r '$ip="$argv[1]"; echo (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ? 0 : 1);' $1);
796+
if [ "$valid" -ne 0 ]; then
797+
check_result "$E_INVALID" "invalid $object_name :: $1"
798+
fi
807799
}
808800

809801
# IPv6 format validator
810802
is_ipv6_format_valid() {
811-
object_name=${2-ipv6}
812-
ip_regex='([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])'
813-
t_ip=$(echo $1 | awk -F / '{print $1}')
814-
t_cidr=$(echo $1 | awk -F / '{print $2}')
815-
valid_cidr=1
816-
817-
WORD="[0-9A-Fa-f]\{1,4\}"
818-
# flat address, no compressed words
819-
FLAT="^${WORD}\(:${WORD}\)\{7\}$"
820-
821-
COMP2="^\(${WORD}:\)\{1,1\}\(:${WORD}\)\{1,6\}$"
822-
COMP3="^\(${WORD}:\)\{1,2\}\(:${WORD}\)\{1,5\}$"
823-
COMP4="^\(${WORD}:\)\{1,3\}\(:${WORD}\)\{1,4\}$"
824-
COMP5="^\(${WORD}:\)\{1,4\}\(:${WORD}\)\{1,3\}$"
825-
COMP6="^\(${WORD}:\)\{1,5\}\(:${WORD}\)\{1,2\}$"
826-
COMP7="^\(${WORD}:\)\{1,6\}\(:${WORD}\)\{1,1\}$"
827-
# trailing :: edge case, includes case of only :: (all 0's)
828-
EDGE_TAIL="^\(\(${WORD}:\)\{1,7\}\|:\):$"
829-
# leading :: edge case
830-
EDGE_LEAD="^:\(:${WORD}\)\{1,7\}$"
831-
832-
echo $t_ip | grep --silent "\(${FLAT}\)\|\(${COMP2}\)\|\(${COMP3}\)\|\(${COMP4}\)\|\(${COMP5}\)\|\(${COMP6}\)\|\(${COMP7}\)\|\(${EDGE_TAIL}\)\|\(${EDGE_LEAD}\)"
833-
if [ $? -ne 0 ]; then
834-
check_result "$E_INVALID" "invalid $object_name format :: $1"
835-
fi
836-
837-
if [ -n "$(echo $1 | grep '/')" ]; then
838-
if [[ "$t_cidr" -lt 0 ]] || [[ "$t_cidr" -gt 128 ]]; then
839-
valid_cidr=0
840-
fi
841-
if ! [[ "$t_cidr" =~ ^[0-9]+$ ]]; then
842-
valid_cidr=0
843-
fi
844-
fi
845-
if [ "$valid_cidr" -eq 0 ]; then
846-
check_result "$E_INVALID" "invalid $object_name format :: $1"
847-
fi
803+
object_name=${2-ipv6}
804+
valid=$($HESTIA_PHP -r '$ip="$argv[1]"; echo (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) ? 0 : 1);' $1);
805+
if [ "$valid" -ne 0 ]; then
806+
check_result "$E_INVALID" "invalid $object_name :: $1"
807+
fi
848808
}
849809

850810
is_ip46_format_valid() {
851-
t_ip=$(echo $1 | awk -F / '{print $1}')
852-
t_cidr=$(echo $1 | awk -F / '{print $2}')
853-
valid_octets=0
854-
valid_cidr=1
855-
for octet in ${t_ip//./ }; do
856-
if [[ $octet =~ ^[0-9]{1,3}$ ]] && [[ $octet -le 255 ]]; then
857-
((++valid_octets))
858-
fi
859-
done
860-
861-
if [ -n "$(echo $1 | grep '/')" ]; then
862-
if [[ "$t_cidr" -lt 0 ]] || [[ "$t_cidr" -gt 32 ]]; then
863-
valid_cidr=0
864-
fi
865-
if ! [[ "$t_cidr" =~ ^[0-9]+$ ]]; then
866-
valid_cidr=0
867-
fi
868-
fi
869-
if [ "$valid_octets" -lt 4 ] || [ "$valid_cidr" -eq 0 ]; then
870-
#Check IPV6
871-
ipv6_valid=""
872-
WORD="[0-9A-Fa-f]\{1,4\}"
873-
# flat address, no compressed words
874-
FLAT="^${WORD}\(:${WORD}\)\{7\}$"
875-
876-
COMP2="^\(${WORD}:\)\{1,1\}\(:${WORD}\)\{1,6\}$"
877-
COMP3="^\(${WORD}:\)\{1,2\}\(:${WORD}\)\{1,5\}$"
878-
COMP4="^\(${WORD}:\)\{1,3\}\(:${WORD}\)\{1,4\}$"
879-
COMP5="^\(${WORD}:\)\{1,4\}\(:${WORD}\)\{1,3\}$"
880-
COMP6="^\(${WORD}:\)\{1,5\}\(:${WORD}\)\{1,2\}$"
881-
COMP7="^\(${WORD}:\)\{1,6\}\(:${WORD}\)\{1,1\}$"
882-
# trailing :: edge case, includes case of only :: (all 0's)
883-
EDGE_TAIL="^\(\(${WORD}:\)\{1,7\}\|:\):$"
884-
# leading :: edge case
885-
EDGE_LEAD="^:\(:${WORD}\)\{1,7\}$"
886-
887-
echo $t_ip | grep --silent "\(${FLAT}\)\|\(${COMP2}\)\|\(${COMP3}\)\|\(${COMP4}\)\|\(${COMP5}\)\|\(${COMP6}\)\|\(${COMP7}\)\|\(${EDGE_TAIL}\)\|\(${EDGE_LEAD}\)"
888-
if [ $? -ne 0 ]; then
889-
ipv6_valid="INVALID"
890-
fi
891-
892-
if [ -n "$(echo $1 | grep '/')" ]; then
893-
if [[ "$t_cidr" -lt 0 ]] || [[ "$t_cidr" -gt 128 ]]; then
894-
valid_cidr=0
895-
fi
896-
if ! [[ "$t_cidr" =~ ^[0-9]+$ ]]; then
897-
valid_cidr=0
898-
fi
899-
fi
900-
901-
if [ -n "$ipv6_valid" ] || [ "$valid_cidr" -eq 0 ]; then
902-
check_result "$E_INVALID" "invalid IP format :: $1"
903-
fi
904-
fi
811+
valid=$($HESTIA_PHP -r '$ip="$argv[1]"; echo (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6) ? 0 : 1);' $1);
812+
if [ "$valid" -ne 0 ]; then
813+
check_result "$E_INVALID" "invalid IP format :: $1"
814+
fi
905815
}
906816

907817
# Proxy extention format validator

web/login/index.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,11 @@ function authenticate_user($user, $password, $twofa = "") {
115115
$v_user = quoteshellarg($user);
116116
$ip = $_SERVER["REMOTE_ADDR"];
117117
$user_agent = $_SERVER["HTTP_USER_AGENT"];
118-
if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
119-
if (!empty($_SERVER["HTTP_CF_CONNECTING_IP"])) {
120-
$ip = $_SERVER["HTTP_CF_CONNECTING_IP"];
121-
}
118+
119+
if (!empty($_SERVER["HTTP_CF_CONNECTING_IP"]) &&
120+
filter_var($_SERVER["HTTP_CF_CONNECTING_IP"], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6)
121+
) {
122+
$ip = $_SERVER["HTTP_CF_CONNECTING_IP"];
122123
}
123124

124125
// Handling IPv4-mapped IPv6 address

0 commit comments

Comments
 (0)