php - 这段代码容易受到黑客攻击吗?

标签 php security url variables

我真的是在线网络应用程序的新手。我正在使用 php,我得到了这段代码:

if(isset($_GET['return']) && !empty($_GET['return'])){
return = $_GET['return'];
header("Location: ./index.php?" . $return);    
} else {
header("Location: ./index.php");    

$return 变量是 URL 变量,很容易被黑客更改。

例如,我从这里得到 $return 变量:www.web.com/verify.php?return=profile.php

有什么需要注意的吗?我应该在这一行中使用 htmlentities 吗:

header("Location: ./index.php?" . htmlentities($return));    

是否容易受到黑客攻击?

我应该怎么做才能防止黑客攻击?

最佳答案

除了第 2 行的错字(应该是 $return = $_GET['return'];)你应该做 $return = urlencode($return)确保 $return 是一个有效的 QueryString,因为它作为参数传递给 index.php。

index.php 然后应验证返回的是用户有权访问的有效 URL。我不知道你的 index.php 是如何工作的,但如果它只是显示一个页面,那么你最终可能会得到类似 index.php?/etc/passwd 或类似的东西,这确实可能是一个安全问题。

编辑:您发现了什么安全漏洞?根据 index.php 如何使用返回值,我可以看到两个可能的问题:

  • 如果 index.php 将用户重定向到目标页面,那么我可以使用您的站点作为中继,将用户重定向到我控制的站点。这可以用于网络钓鱼(我制作了一个与您的网站完全一样的网站并要求用户提供用户名/密码)或仅用于广告。
  • 如果 index.php 显示来自返回参数的文件,我可以尝试传入一些系统文件的名称,如/etc/passwd 并获得所有用户的列表。或者我可以传递类似 ../config.php 的内容并获取您的数据库连接
    • 我不认为这里是这种情况,但这是一个非常常见的安全漏洞,我仍然想指出它。

如前所述,您要确保通过查询字符串传入的 URL 有效。一些方法可以做到这一点:

  • $newurl = "http://yoursite/ ". $返回;
    • 这可以确保您始终只在自己的域中,永远不会重定向到任何其他域
  • $有效= file_exists ($返回)
    • 如果 $return 始终是硬盘驱动器上存在的页面,则此方法有效。通过检查返回确实指向一个有效文件,您可以过滤掉虚假条目
    • 如果 return 接受查询字符串(即 return=profile.php?step=2),那么您需要解析“profile.php”路径
  • 有 $return 的有效值列表并与它进行比较
    • 这通常是不切实际的,除非您真的设计了您的应用程序以便 index.php 只能返回给定的一组页面

有很多方法可以给这只猫蒙皮,但通常您希望以某种方式验证 $return 是否指向有效目标。这些有效目标是什么取决于您的规范。

关于php - 这段代码容易受到黑客攻击吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1211236/

相关文章:

php - 较旧的 php 版本的password_compat

Angular/Spring Boot/Azure Ingress - URL 重写

php - PHP 中的简单并发?

Java 7 update 25 不允许在安装安全管理器的情况下进行类加载?

php - 如何设置YII2多数据库可配置?

security - 隐藏 oauth secret

php - 如何使用 nginx 和 php-fpm 将请求 url 子文件夹路径路由到特定 php 页面

ruby-on-rails-3 - 导轨 : method for 'standardizing' url input from users?

php - Symfony2 在使用 twig 呈现文本时使用 css 删除部分文本

php - 警告 : stream_socket_enable_crypto(): SSL operation failed with code 1