PHP $ _GET验证

问题描述:

可能是一个愚蠢的问题仍然:

我玩弄下面的代码:

$a='a'; 

if ($_GET['a'] == $a) 
    echo 'true'; 
else 
    echo 'false'; 

现在,有没有什么办法将数据发送到打破验证?很明显,它可能已经在SQL注入中完成的方式不会进行。

只是想知道这种验证方式有多安全。

在此先感谢。

编辑:

我的问题是,有没有什么可以thorugh $ _GET可能“破”的比较,始终输出“真”被传递。

+2

考虑没有设置$ _GET ['a']的情况。也许一个永远不会传给你。 – Murtnowski 2012-04-03 20:52:13

+3

您试图验证数据的目的是什么?没有任何人可以做到从你的脚本中获得“真”或“假”以外的任何东西。如果没有设置'$ _GET ['a']',它只会在您的日志中弹出警告。 – Crontab 2012-04-03 20:52:22

+0

有趣的问题。我想知道是否传入奇怪的Unicode,或ASCII或任何东西会抛出它。它对我来说很安全...... – kevingreen 2012-04-03 20:53:03

如果您正在寻找验证$_GET['a']真正面临的问题等于"a"而没有别的,比是的,那就是代码。

但是,如果您期望"a"且只有"a"它可能不应该是用户输入。

验证(或卫生),意味着采取任何可能向您发送的字符串,并确保它适用于任何您想要的目的。如果它发送到数据库,则通过mysql_escape_string()或使用预准备语句。如果要以HTML格式显示,请确保使用html_entities()strip_tags()没有任何有害标签。

除了说用户输入了"a"之外,您的验证对于其他任何内容都不是很好。 但是,没有什么比"a"能够通过。

+0

我的问题是,有什么可以通过$ _GET,可以'打破'比较,总是输出'真' 。我完全知道如何清理和验证用户输入数据。只是想知道是否有什么可以打破比较 – michaeltintiuc 2012-04-03 21:01:47

+1

不,没有什么可以打破比较。在PHP中只有“a”将等于“a”。 – 2012-04-03 21:02:27

+0

伟大的,这就是我想知道的,你是否100%确定现在奇怪的ASCII或编码数据可以通过? – michaeltintiuc 2012-04-03 21:04:16

您可以使用mysqli扩展中的Prepared-Statements,这已经可以防止每个可能的注入。

如果你不想使用这种mysql和mysqli的也有“real_escape_string”,你可以在你的查询中使用 - 方法在Userinput时,把

$sql = "SELECT `name` FROM `example` WHERE `id` = '".mysql_real_escape_string($YOURVAR)."'"; 

real_escape_string method from standart mysql extension

mysqli real_escape_string

+1

这是关于数据库的大惊小怪? OP没有提到这一点 – 2012-04-03 20:58:16

那么,如果你确切知道什么是进来,你可以比较没有类型的强制和检查一个空的参数:

$a = 'a'; 

if(!empty($_GET['a']) && $_GET['a'] === $a ) 
{ 
    //do more validation using your data model 
} 
else 
{ 
    //output error msg 
}