PHP $ _GET验证
可能是一个愚蠢的问题仍然:
我玩弄下面的代码:
$a='a';
if ($_GET['a'] == $a)
echo 'true';
else
echo 'false';
现在,有没有什么办法将数据发送到打破验证?很明显,它可能已经在SQL注入中完成的方式不会进行。
只是想知道这种验证方式有多安全。
在此先感谢。
编辑:
我的问题是,有没有什么可以thorugh $ _GET可能“破”的比较,始终输出“真”被传递。
如果您正在寻找验证$_GET['a']
真正面临的问题等于"a"
而没有别的,比是的,那就是代码。
但是,如果您期望"a"
且只有"a"
它可能不应该是用户输入。
验证(或卫生),意味着采取任何可能向您发送的字符串,并确保它适用于任何您想要的目的。如果它发送到数据库,则通过mysql_escape_string()
或使用预准备语句。如果要以HTML格式显示,请确保使用html_entities()
或strip_tags()
没有任何有害标签。
除了说用户输入了"a"
之外,您的验证对于其他任何内容都不是很好。 但是,没有什么比"a"
能够通过。
我的问题是,有什么可以通过$ _GET,可以'打破'比较,总是输出'真' 。我完全知道如何清理和验证用户输入数据。只是想知道是否有什么可以打破比较 – michaeltintiuc 2012-04-03 21:01:47
不,没有什么可以打破比较。在PHP中只有“a”将等于“a”。 – 2012-04-03 21:02:27
伟大的,这就是我想知道的,你是否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)."'";
这是关于数据库的大惊小怪? 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
}
考虑没有设置$ _GET ['a']的情况。也许一个永远不会传给你。 – Murtnowski 2012-04-03 20:52:13
您试图验证数据的目的是什么?没有任何人可以做到从你的脚本中获得“真”或“假”以外的任何东西。如果没有设置'$ _GET ['a']',它只会在您的日志中弹出警告。 – Crontab 2012-04-03 20:52:22
有趣的问题。我想知道是否传入奇怪的Unicode,或ASCII或任何东西会抛出它。它对我来说很安全...... – kevingreen 2012-04-03 20:53:03