我可以禁止跨域PHP执行吗?

问题描述 投票:-1回答:1

((Env:Linux和Windows Apache)当前的标准允许任何人都可以执行PHP文件,甚至可以在远程计算机上执行(例如,使用带有URL的PHP​​ Include,或使用浏览器的地址栏,或使用cURL等)。它们可以被.htaccess或httpd.config文件阻止,但不能以这种方式可靠地阻止跨域访问。看来Apache无法确定何时代表同一域中的另一个文件访问文件!不,“引荐来源网址”值不可靠。

是否有任何一种vious回的方式来阻止文件A.php的跨域PHP执行,同时仍然允许同域Ajax进行访问?例如,如果调用PHP文件B.php(在同一域中)将包含秘密密码的arg作为GET或POST arg传递给A.php,该怎么办?恶意用户无法查看任何PHP文件的内容,也无法拦截HTTPS PHP Include访问,因此,他们必须在不实际进入服务器帐户的情况下才能学习秘密。这样行吗?如果没有,还有其他方法吗?还是更简单或更安全的方式?

(如果从远程计算机隐藏A.php对您来说似乎毫无意义,请想象A.php返回公司机密或磁盘上任何文件的内容。)

((我还使用JavaScript Ajax从同一域中的HTML文件调用的JavaScript文件访问JavaScript文件A.php,这阻止了我上面编写的简单密码设计;否则,Ajax访问不是问题,因为这样的访问默认已被浏览器内置的跨域Ajax保护远程禁止。阻止我的密码设计的原因是JavaScript文件可以作为文本远程下载,因此,与CSS文件一样,它们也不安全。)

这里有一个重复的问题,指出这种保护无法完成。我想相信这不是真的,现代安全性并不是那么僵硬。

添加3/28/20:

这个问题的核心是A.php通过使用“ echo”生成响应文本将其数据返回给Ajax。由于A.php可以被任何人调用(必须是公共的才能被Ajax调用),因此它的响应数据始终是公共的,如果数据是私有的,则很危险。通过使A.php将其响应写入受保护目录中的文件,可以确保Ajax的安全。然后其输出是私有的(仅PHP可以访问)。问题仍然存在:由于JavaScript无法读取文件,因此如何将文件内容路由到Ajax响应。

我们确实需要一个基于标准的解决方案,该解决方案应允许Ajax在同一域中调用时访问PHP文件的输出,但不允许任何人在其他域中访问该PHP文件的输出。换句话说,可以选择禁止跨域访问PHP文件输出。 (“输出”表示执行输出,而不是特殊的PHP括号内的文本!)

包括一个随机数作为参数(Rasclatt解决方案)是一个好的开始。必须将随机数安全地传递到Ajax代码中,也就是在PHP内部,并通过PHP分别发送给A.php。我不确定这项簿记工作的细节。我什至不能确定设计本身是否可行,因为恶意用户仍然可以拦截HTML或JS来查找当前的随机数,并使用自己的参数成功调用A.php并捕获响应。

php cross-domain execution restriction
1个回答
0
投票

我不确定要如何描述我要传达的内容。我将给出一个基于现实生活的示例:

您是一家银行的出纳员,我是刚来做一些银行业务的客户。我要求您提供银行帐户信息,然后请您提供我的帐号和ID。您对我说的我很满意,因此您可以向我提供我的帐户详细信息。然后,我要求您将我的好友的帐户信息提供给我,因为我知道他也在这里开户。作为柜员,您告诉我,我不允许查看该信息。现在,我回家,给您回电话,并再次询问有关我朋友帐户的相同问题,答案将是相同的。没有!我通过电话询问您有关我的帐户的信息,您询问帐户号以及我社交圈的后4位数字和我的地址-我告诉您,所有操作都将结帐,您会给我我的帐户信息。

这里有两点:

  1. Ajax就像我打电话一样。我的交流方式与面对面交流的方式有所不同,但结果是相同的。仅仅因为我打电话并不意味着我应该得到我想要的任何信息。

  2. 关于中间人攻击的要点,如果通信连接不安全(也就是窃听银行电话),那么是的,您必须为此担心。那就是正确使用SSL / TLS。如果您的服务器未使用这些工具,则无论您使用哪种方法与服务器通信,都将不安全并且容易受到攻击。

与您的最后评论有关的要点:

一旦恶意用户下载了Ajax代码,他们就可以对其进行修改(MiTM)并将其发送到A.php

一个人可以下载它并对其进行修改(或者甚至不关心您的JS,而是使用cURL或其他方法)并尝试点击A.php,但是如果该端点是安全的,则没什么大不了的。它不应以不允许请求者查看的任何信息作为响应。

您的JS不应包含任何具有密钥之类的秘密,例如API密钥或秘密静态令牌等。未经身份验证,您的后端不应盲目地驱动或由前端服务。

我什至不确定设计本身是否有效,因为恶意用户仍然可以拦截HTML或JS来找出当前的随机数,并使用自己的参数成功调用A.php并捕获响应。

同样,如果您不使用数据TLS / SSL的安全传输,则用户只能拦截通信。

请求令牌是一种确定请求是否来自服务器的方法,因为服务器将生成SESSION令牌或nonce,然后在以某种形式或其他数据传输方式提供时匹配它们。最重要的是,除非允许所请求的用户查看,否则A.phpB.php或任何其他页面均不应使用有用的信息进行响应。

© www.soinside.com 2019 - 2024. All rights reserved.