这段代码是否容易受到黑客攻击?

bbt*_*ang 2 php security variables url

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

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

}

$return变量是URL变量可以由黑客容易地改变.

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

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

header("Location: ./index.php?" . htmlentities($return));    
Run Code Online (Sandbox Code Playgroud)

它是否容易受到黑客的攻击?

我该怎么做才能防止黑客入侵?

Mic*_*tum 5

除了第2行的拼写错误(应该是$ return = $ _GET ['return'];)你应该执行$ return = urlencode($ return)以确保$ return是一个有效的QueryString,因为它作为参数传递给索引.PHP.

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

编辑:你得到什么安全漏洞?我可以看到两个可能的问题,具体取决于index.php如何使用返回值:

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

如上所述,您希望确保通过查询字符串传入的URL有效.一些方法可以是:

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

有很多方法可以为这只猫提供皮肤,但通常你想要以某种方式验证$ return指向一个有效的目标.这些有效目标取决于您的规格.