【问题标题】:Apache blocks request if URL is submitted as input param如果 URL 作为输入参数提交,Apache 会阻止请求
【发布时间】:2017-07-23 16:14:27
【问题描述】:

我一直在互联网上搜索,但令人惊讶的是,任何人都没有提出单一的答案或单一的查询,我是唯一一个面临这个问题的人吗?可能是因为当我们在表单中说 URL 时,谷歌给出了所有与表单的“属性”相关的结果。但在这里我根本不是在谈论动作 URL。所以我将从html代码开始。

 <form action="/something_that_does_not_matter" method=post>
    <input name="profile" type="text" placeholder="Enter name"/>
<input name="link" type="text" placeholder"="Enter URL"/>
</form>

如果用户在两个输入中都提交了一些字符串,则此表单可以正常工作。 什么时候成为问题? 当您在链接字段中输入任何网址时。因为那是应该做的。 请不要让我在这里告诉脚本,因为我 100% 确定服务器端没有问题,因为我什至尝试过使用最简单的 php,例如

<?php echo $_POST["link"]; ?>

它只发生在经过认证的主机服务器上,在我的本地它工作正常,一点点猜测和研究给了我一个原因,即 apache 有这个安全协议,如果启用它不会让你提交有害的东西。它阻止了我的任何网址,即使提交“http://hey”它也会被阻止,所以问题也不在于网址。

我的托管服务提供商已准备好为我禁用该规则,但风险自负。所以我显然不想那样。

所以现在我的问题是为什么那里有安全性,如果它真的是威胁,那么真正想要真正做到这一点的人会如何做到呢?

对于纯 html 表单提交,我根本找不到解决方案。但是对于基于 ajax 的请求,我找到了一些解决方案。 首先,我尝试编码/解码哪个不起作用,因为服务器首先尝试找到其中包含 http:// 的编码子字符串。所以没用

另一个解决方案是提交 ht$$p:// 然后在我的 php 脚本中修复它。但它的所有解决方法,并迫使我使用基于 Ajax。如果只是想以 HTML 形式进行,我的应用程序上不会有 JavaScript。

有人吗?

【问题讨论】:

  • 没有javascript这显然是不可能的,因为浏览器只有在被告知的情况下才能提交一些东西。你无法掩饰任何事情。问题是:为什么没有javascript?没有这些日子,任何网站都无法运行。

标签: php apache .htaccess http security


【解决方案1】:

不知道如何在没有 javascript 的情况下执行此操作,但您可以使用 javascript 从 url 中删除 'http:' 并提交它会起作用,而且众所周知,//无论如何都会告诉您 url 的开头。

@Aayaush 修改代码

<input type="text" placeholder="Enter URL" onkeyup="document.getElementById('link').value=(this.value).replace(/https?:/,'')" >

<form>
<input name="profile" type="text" placeholder="Enter name"/>
<input name="link" id='link' type="hidden">
<input type="submit">
</form>

也检查一下。 https://stackoverflow.com/a/39375297/3335776

【讨论】:

    【解决方案2】:

    您可以在通过表单发布之前通过 javascript 对输入进行编码,您可以使用以下内容:-

    <input name="link" type="text" placeholder="Enter URL" onkeyup="document.getElementById('link').value=btoa(this.value)" >
    
    <form>
    <input name="profile" type="text" placeholder="Enter name"/>
    <input name="link" id='link' type="hidden">
    <input type="submit">
    </form>
    

    通过这样做,URL 得到 base64 编码,Apache 不会将其检测为 URL,因此可以传递。由于链接输入标签是隐藏的,所以在 HTML 页面中会被隐藏,但 PHP 页面可以访问。

    在 PHP 脚本中,可以通过以下代码访问该链接:-

    <?php echo base64_decode($_POST["link"]); ?>
    

    【讨论】:

    • 请确保此用例容易出现 XSS,并且不会被任何 Web 应用程序防火墙检测到,因为它是 base64 编码的。
    • 请再看一遍问题,上面提到,编码输入不起作用,apache可以检测到64encoded。
    • 我们可以尝试双重编码,例如 hex 和 base64 或 base64 或 hex
    猜你喜欢
    • 2016-08-24
    • 2017-11-18
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多