我正在尝试保护我的$_GET
输入,确保一切正常,问题是$_GET['action']
无法通过preg_match()
并始终导致:
“操作无效”
我不知道为什么会发生这种情况,该动作只能有两个值,例如like或hate,都用小写字母表示,但仍然无法传递。
if(isset($_GET['username']) && isset($_GET['action']))
{
$username = $_GET['username'];
$action = $_GET['action'];
$user_filter_a = mysqli_real_escape_string($username);
$user_filter_b = mysqli_real_escape_string($user_filter_a);
$user_filter_c = strip_tags($user_filter_b);
$action_filter_a = mysqli_real_escape_string($action);
$action_filter_b = mysqli_real_escape_string($action_filter_a);
$action_filter_c = strip_tags($action_filter_b);
$action_filter_c_lower = strip_tags($action_filter_b);
if(preg_match('%^[a-z0-9\.]{4,69}$%',$user_filter_c))
{
if(preg_match('%^[a-z]$%',$action_filter_c_lower))
{
if($action_filter_c_lower=='like')
{
echo 'you have liked this post';
}elseif(action_filter_c_lower=='hate')
{
echo 'you have hated this post';
}
}else
{
echo 'action is not valid';
}
}else
{
echo 'username is not valid';
}
答案 0 :(得分:3)
当您需要验证字符串完全由字母组成时,可以使用ctype_alpha()
。
代码:(Demo)
$string = 'asdgadsfg';
if (ctype_alpha($string)) {
echo "all alphabetical";
} else {
echo "not entirely alphabetical";
}
输出:
all alphabetical
如果您需要检查提交的值是like
,hate
还是[其他];创建一个“白名单”数组以查找值。
代码:(Demo)
$string = 'like';
$whitelist = ['like', 'hate'];
if (in_array($string, $whitelist)) {
echo "valid: $string";
} else {
echo "invalid: $string";
}
输出:
valid: like
其他提示:
if(isset($_GET['username']) && isset($_GET['action']))
可以更简单地写为:
if (isset($_GET['username'], $_GET['action'])) {
只有在将数据应用于查询之前,您才应该执行转义操作,这样就不会意外破坏数据或使自己困惑。老实说,我总是使用准备好的语句来构建用户提交的数据的查询,因此,我建议您研究该主题。
在正则表达式中,不需要在字符类中转义一个点,因此字符类可以如下所示:[a-z0-9.]
如果还希望使用大写字母,则可以添加{{ 1}}在结束模式定界符(i
)之后,使其看起来像%
或%^[a-z0-9.]{4,69}$%i
。
%^[a-z\d.]{4,69}$%i
附加到变量名很奇怪,因为您没有调用任何使字符串小写的函数。
答案 1 :(得分:0)
操作总数有限。完全不使用用户输入更为安全。而是使用带有默认操作的switch语句:
$userAction = strtolower($_GET['action']);
switch($userAction) {
case "like":
$action = "like";
break;
case "hate":
$action = "hate";
break;
default:
$action = "default-action";
}
或者,您可以在数组中包含有效操作的列表:
$validAction = ["like","hate","other"];
$action = "";
if (in_array($_GET["action"],$validAction)){
$action = $_GET["action"];
}
这里您可以确保该操作有效。