尽管如此,这可能是一个愚蠢的问题:
我正在玩以下代码:
$a='a';
if ($_GET['a'] == $a)
echo 'true';
else
echo 'false';
现在,有什么方法可以发送数据来破坏验证吗?显然,它本可以在 SQL 注入中完成的方式不会发生。
只是想知道这种验证方式有多安全。
提前致谢。
编辑:
我的问题是,是否有任何可以通过 $_GET 传递的东西可以“破坏”比较并始终输出“真”。
尽管如此,这可能是一个愚蠢的问题:
我正在玩以下代码:
$a='a';
if ($_GET['a'] == $a)
echo 'true';
else
echo 'false';
现在,有什么方法可以发送数据来破坏验证吗?显然,它本可以在 SQL 注入中完成的方式不会发生。
只是想知道这种验证方式有多安全。
提前致谢。
编辑:
我的问题是,是否有任何可以通过 $_GET 传递的东西可以“破坏”比较并始终输出“真”。
如果您正在寻找验证$_GET['a']
真正的表面等于"a"
而不是别的,那么是的,这就是代码。
但是,如果您期待"a"
并且只有"a"
它可能不应该是用户输入。
验证(或卫生)意味着接受他们可能扔给你的任何字符串,并确保它对于你想要的任何目的都是有效的。如果将其发送到数据库,请将其传递mysql_escape_string()
或使用准备好的语句。html_entities()
如果要显示为 HTML,请使用或确保没有任何有害标签strip_tags()
。
除了说用户已经输入之外,您的验证对其他任何事情都不是很好"a"
。但是,是的,除了能够通过之外,别无他法。"a"
好吧,如果你确切地知道发生了什么,你可以在没有类型强制的情况下进行比较并检查一个空参数:
$a = 'a';
if( !empty( $_GET['a'] ) && $_GET['a'] === $a )
{
//do more validation using your data model
}
else
{
//output error msg
}
您可以使用 mysqli 扩展中的 Prepared-Statements,这已经防止了所有可能的注入。
如果您不想使用这样的 mysql 和 mysqli 也有“real_escape_string” - 方法,您可以在输入 Userinput 时在查询中使用
例子
$sql = "SELECT `name` FROM `example` WHERE `id` = '".mysql_real_escape_string($YOURVAR)."'";