url.com?somephpcode是否容易受到我的代码中的任何攻击?

时间:2015-07-01 10:19:20

标签: php

我从来不知道如何在网址“?”后使用php代码,我甚至不知道它的名称是什么......但是,当用户登录失败时,我做了类似这样的事情

//Failed login
header('Location: login?error_login');

然后登录页面是:

if($_SERVER['REQUEST_URI'] == "/login?error_login"{
echo "you have submitted invalid login information";
}

我之所以这样做,是因为我在索引中有登录表单,所以用户可以从索引页面登录而不必去登录页面,这很有效,但这有点容易受到攻击在我的PHP?或者更好的问题所以我不会得到太多的downvotes:执行这样的事情的更好方法是什么?感谢。

我没有在网址中使用.php,因为我从.htaccess中删除它...写它以防万一你试图纠正我的“登录?error_login”到“login.php?error_login”。 ..

3 个答案:

答案 0 :(得分:1)

?之后的网址部分是查询字符串。传递与所请求资源相关的其他信息非常有用。它可以通过PHP全局数组$_GET

访问

请参阅此处的手册页:http://php.net/manual/en/reserved.variables.get.php

如果您希望在不在网址中的情况下发送信息,请查看$_POST

这是手册页:http://php.net/manual/en/reserved.variables.post.php

请记住,任何请求特定资源的内容(例如,获取有关专辑6的信息)都应该以某种形式存在于网址中。像error_login这样的东西也可以,虽然它更容易实现为url的一部分。

答案 1 :(得分:1)

(我将此作为未来读者的答案)

在此特定示例中使用查询字符串并不安全。 对于许多其他例子,它可能是。
查询字符串可以是用户输入,因此必须被视为不值得信任。

在您的情况下,可能发生的最糟糕的情况是,用户弄乱查询字符串会得到奇怪的结果。这是他们自己的问题,并且不需要太多关注(这是我的意见)。

在任何情况下,您可以在代码中的任何其他地方使用查询字符串的内容,例如数据库查询或任何更有趣的逻辑,您至少必须对其进行清理并验证其合理性。

另一方面,您也可以在会话中传输此信息。这样可以提供更强大的功能,并且不会向潜在的攻击者泄露有关您的代码的信息。

答案 2 :(得分:-1)

?之后的字符串是可以使用$_SERVER['QUERY_STRING']获取的查询字符串。

  

执行此类操作的更好方法是什么?

没有更好的方法,这只取决于个人选择,对我来说,我将尝试以模型 - 视图 - 控制器(MVC)的方式实现它。

  

但是当我没有从网址传递任何内容时,它仍然是个坏主意吗?

客户端可以从URL传递任何有效的查询字符串,但这样做仍然没有坏主意,只需确保脚本上没有带有查询字符串的漏洞,如下所示:

...
$conn = new mysqli($servername, $username, $password, $dbname);
$unsafe_query = $_SERVER['QUERY_STRING'];

// Vulnerable
$sql = "SELECT $unsafe_query";
$result = $conn->query($sql);

...
$conn->close();

摆脱这种情况的最简单方法之一是使用mysqli_real_escape_string()

...
$unsafe_query = $_SERVER['QUERY_STRING'];
$safe_query = mysqli_real_escape_string($unsafe_query);

// Safe
$sql = "SELECT $safe_query";
$result = $conn->query($sql);
...