【问题标题】:PHP Security - GET Variables, URL safe?PHP 安全性 - 获取变量、URL 安全吗?
【发布时间】:2011-09-13 14:29:04
【问题描述】:

我正在创建一个非常基本的 iPhone 模拟器,我想做的只是将它放在一个位置,然后我们拥有并想要放置它的任何站点,我们只需使用以下命令调用它:http://www.example.com/iphone-test.php?url=http://www.example.com/mobile/

有什么我需要注意的可能不安全的地方吗?不涉及数据库或其他任何东西,但以防万一有人想乱七八糟并在 URL 中放一些东西,我可以做些什么来帮助使它更安全一点?

这是我的代码:

<?php
    if(isset($_GET['url'])) {
        $url = $_GET['url'];
        ?>

        <!doctype html>
        <html lang="en">
            <head>
                <meta charset="utf-8">
                <title>iPhone Test</title>
                <style type="text/css">
                #iphone { 
                    background:url(iPhone.png) no-repeat; 
                    width:368px; height:706px; 
                    position:relative; 
                    overflow:hidden;  
                }
                #iphone iframe {
                    position:absolute; 
                    left:30px; 
                    top:143px; 
                    border:0;overflow:hidden; 
                }
                </style>
            </head>
            <body>
                <div id="iphone">
                <iframe src="<?=$url;?>" width="307" height="443"><p>Your Browser does not support iFrames.</p></iframe>
                </div>
            </body>
        </html>
        <?php
    }
?>

编辑:感谢您的所有帮助。我做了一些研究,这是我目前所拥有的:

<?php
include_once 'filter.php';
$filter = new InputFilter();   

if(isset($_GET['url'])) {
if (filter_var($_GET['url'], FILTER_VALIDATE_URL)) {
    $url = $filter->process($_GET['url']);
?>

来源:http://oozman.com/php-tutorials/avoid-cross-site-scripting-attacks-in-php/

班级:http://www.phpclasses.org/browse/file/8941.html

你怎么看?

【问题讨论】:

  • 首先,请确保 URL 不以 javascript:... 开头... 并确保在将 URL 传递到脚本之前在客户端对 URL 进行了 URL 编码。
  • 不要相信客户端对数据进行编码以使服务器可以安全地插入到文档中。

标签: php security variables get


【解决方案1】:

您应该使用 PHP 的 filter_var 来检查它是否有效...

    if (isset($_GET['url'])) {
        if (filter_var($_GET['url'], FILTER_VALIDATE_URL)) {
            $url = $_GET['url'];
        }
    }

【讨论】:

  • 太棒了,谢谢!这是额外的一步。我将其添加到我最近的编辑中。
【解决方案2】:

如果任何人都可以访问此页面,那么您就是在向 XSS 和网络钓鱼重定向开放。例如,尝试将其添加到您的 URL 参数中:

?url="></iframe><script>alert(123)</script>

在 Firefox 6.02 中触发警报。这意味着任何 JS 都可以被触发并用于重定向那些认为他们正在访问您的网站的用户。或者它可以用来窃取未标记为 HTTPOnly 的 cookie。

这可以通过对 HTML 属性进行编码来缓解。 OWASP 对此进行了描述:

除了字母数字字符,使用 HH; 转义所有 ASCII 值小于 256 的字符。格式(或命名实体,如果可用)以防止切换出属性。这条规则如此广泛的原因是开发人员经常不引用属性。正确引用的属性只能使用相应的引号进行转义。不带引号的属性可以用许多字符分开,包括 [space] % * + , - / ; ^ 和 |。

参考:https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.232_-_Attribute_Escape_Before_Inserting_Untrusted_Data_into_HTML_Common_Attributes

现在,对于您上面将要解决的其他问题。如果您只允许输入任意 URL,那么没有什么可以阻止某人执行以下操作:

?url=http://myevilsite.com/redirect.php

并让该页面重定向用户:

window.top.location.href = "http://www.site.com"; 

对此,您唯一能做的就是使用可接受 URL 的白名单。

【讨论】:

  • 非常感谢。刚刚更新了我的答案,那是怎么回事?它可以防止您提到的那个 url 参数。
  • 看起来那个库只是一个黑名单过滤器。黑名单很少足够好。几乎不可能过滤掉所有可能给您带来麻烦的东西。您最好对 HTML 属性进行适当的编码。此外,这仍然没有解决 iframe 父重定向或仅加载可用于网络钓鱼的 iframe 的问题。你真的应该建立一个允许 URL 的白名单
  • 是否可以检查该站点是否在我的服务器上?如果站点的 IP = _____ 那么可以去吗?
  • 通常我认为我们会检查主机/域名。很难根据域的字符串确定站点的 IP。你必须想办法 ping 它。通常只检查主机/域是可以接受的。是的,我认为这种白名单结合适当的编码(用于 XSS 保护)会起作用。
  • 实际上 gethostbyname 是为我做的! php.net/manual/en/function.gethostbyname.php 获取特定域的 IP。
【解决方案3】:

The request method does not provide any securiy features, please see this answer

您需要 100% 确定您的代码不会使用 javascript 劫持该框架或将人引导至恶意域,或导致您页面上的请求表单执行他们不想要的操作。

You can see some examples out here of that:

<IFRAME SRC="javascript:alert('XSS');"></IFRAME>

<iframe src=http://ha.ckers.org/scriptlet.html"></IFRAME>

You could have the person lead to post something as well...

无论如何,我可以窃取你所有的 cookie,或者诱使用户认为他们仍在你的网站上,但实际上在我的网站上,在那里我可以获得他们所有的宝贵信息。

停下来,在你走得更远之前,你需要知道你在做什么,and you start by reading this

【讨论】:

  • 谢谢!请检查我更新的答案,让我知道你的想法。
  • 不要过于自信,它并不特定于你正在做的事情。在你做任何事情之前去学习。 google-gruyere.appspot.com
【解决方案4】:

你很容易受到cross site scripting的攻击。

只需在 URL 中包含 "&gt;&lt;/iframe&gt;&lt;script&gt;EEEEVVvvvillll!!!!,或使用非 HTTP/HTTPS URI。

【讨论】:

  • 谢谢。只要有机会,我就会更新我的答案,这看起来是一个好的解决方案吗?
【解决方案5】:

这里列出了此处涉及的安全问题..

IFrames 安全摘要

2007 年 10 月 24 日,星期三 我决定收集各种证明 我已经完成的概念并总结了为什么 iframe 存在安全风险。 以下是主要原因:-

  1. 浏览器跨域攻击

描述:- 因为你可以在你的页面中嵌入另一个网站, 您可以利用该页面并以该用户的身份执行操作并执行 所选网站上的任何内容。

概念证明:- Safari beta 3.03 zero day

  1. XSS/CSRF 反射攻击

描述:- 使用嵌入受感染网站的 iframe 攻击者然后可以将攻击反射到其他服务器,从而使 攻击难以追踪并且有一个焦点进行 攻击。

概念证明:- 没有可用于这种类型的攻击,因为它会 很难在没有实际进行攻击的情况下展示方法。

  1. CSS 和 iframe 可以从 Internet 扫描您的 LAN!

描述:- 通过利用 CSS 中的功能并使用 iframe 来检查 如果存在默认 IP 地址,则可以获取您的网络 地址范围很容易提供网络设备使用 默认开箱即用 IP 地址。

概念证明:- CSS LAN 扫描仪

  1. 使用 Javascript 和 iframe 进行 LAN 扫描

说明:- 使用与上述类似的方法可以获得 使用 Javascript 的 LAN 信息。

概念证明:- Javascript LAN 扫描器

  1. CSS iframe 叠加层

说明:- iframe 可以在 Firefox 中相互嵌入,并且 您可以更改它们的外观以创建无缝覆盖 地点。这将使用户很难知道哪个站点 他们正在与他们互动并欺骗他们执行某项操作。

概念证明:- Verisign OpenID 漏洞利用(现已修复)

  1. 网址重定向

说明:- iframe 还允许您执行重定向,因此您可以 可以访问通常无法访问的 URL。在里面 美味的例子,POC 从美味/家重定向到您的 帐户书签,然后使用 CSS 覆盖显示您的第一个 书签。 POC 需要 Firefox 和美味的帐户。

概念证明:- 美味的 CSS 覆盖/重定向

Original here

您可以通过充当代理来使其更安全,在 PHP 中加载请求的 URL,从 HTML(javascript 等)中删除所有内容,然后将其显示在指向您服务器上网页的 iframe 中

【讨论】:

    【解决方案6】:

    只需使用strip_tags(),即可取消任何恶意脚本条目:

    $url = strip_tags($_GET['url'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-20
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 2011-04-02
      • 2019-07-25
      相关资源
      最近更新 更多