0

尽管如此,这可能是一个愚蠢的问题:

我正在玩以下代码:

$a='a';

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

现在,有什么方法可以发送数据来破坏验证吗?显然,它本可以在 SQL 注入中完成的方式不会发生。

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

提前致谢。

编辑:

我的问题是,是否有任何可以通过 $_GET 传递的东西可以“破坏”比较并始终输出“真”。

4

3 回答 3

2

如果您正在寻找验证$_GET['a']真正的表面等于"a"而不是别的,那么是的,这就是代码。

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

验证(或卫生)意味着接受他们可能扔给你的任何字符串,并确保它对于你想要的任何目的都是有效的。如果将其发送到数据库,请将其传递mysql_escape_string()或使用准备好的语句。html_entities()如果要显示为 HTML,请使用或确保没有任何有害标签strip_tags()

除了说用户已经输入之外,您的验证对其他任何事情都不是很好"a"但是,是的,除了能够通过之外,别无他法。"a"

于 2012-04-03T20:55:23.327 回答
0

好吧,如果你确切地知道发生了什么,你可以在没有类型强制的情况下进行比较并检查一个空参数:

$a = 'a';

if( !empty( $_GET['a'] ) && $_GET['a'] === $a  )
{
  //do more validation using your data model
}
else
{
  //output error msg
}
于 2012-04-03T20:56:24.403 回答
-2

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

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

例子

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

来自标准 mysql 扩展的 real_escape_string 方法

mysqli real_escape_string

于 2012-04-03T20:56:00.787 回答