PHP和AJAX安全问题
我目前正在构建一个web应用程序,其中使用jQuery的$.ajax函数将PHP文件加载到主文件中。然而,PHP文件显然仍然可以在应用程序之外访问,只需在地址栏中键入文件名即可 所以我的问题是,最好的方法是什么,这样被“AJAX”嵌入的PHP文件就知道它包含在正确的页面中,并且可以正常工作,但是如果它是以任何其他方式访问的(即使有人在我的PHP文件中创建了自己的网站和AJAX),那么该文件应该说“拒绝访问”之类的话 提前感谢引用类似的 正如其他人所说,Ajax请求可以 被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿,被模仿 标题。如果你想有一个基本的 检查请求是否是Ajax 请求您可以使用:PHP和AJAX安全问题,php,ajax,security,Php,Ajax,Security,我目前正在构建一个web应用程序,其中使用jQuery的$.ajax函数将PHP文件加载到主文件中。然而,PHP文件显然仍然可以在应用程序之外访问,只需在地址栏中键入文件名即可 所以我的问题是,最好的方法是什么,这样被“AJAX”嵌入的PHP文件就知道它包含在正确的页面中,并且可以正常工作,但是如果它是以任何其他方式访问的(即使有人在我的PHP文件中创建了自己的网站和AJAX),那么该文件应该说“拒绝访问”之类的话 提前感谢引用类似的 正如其他人所说,Ajax请求可以 被模仿,被模仿,被模仿,被
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
//Request identified as ajax request
}
然而,你永远不应该以你的
这张支票的安全性。会的
消除对页面的直接访问
如果这是你需要的
请将此答案也考虑在内:
没有办法保证这一点
他们通过AJAX访问它。
直接访问和AJAX访问
来自客户,因此可以轻松
是假的
你为什么要这么做
如果是因为PHP代码不是
非常安全,使PHP代码更安全
保护(例如,如果您的AJAX
将用户id传递给PHP文件,
在PHP文件中编写代码以使
确保这是正确的用户id。)
以上链接的讨论中有更多聪明的想法。这并不简单,很可能根本没有办法做到这一点。您可以要求在php文件中输入一些POST变量,并在AJAX请求中发送它们。这将保护您不受只在浏览器中粘贴URL的人的攻击 没有人可以从其他域(安全问题)AJAX您的站点,但始终可以连接并直接发送http请求,例如通过cURL
您可以在cookie中创建一些令牌,这也可以从jquery请求中看到,但该解决方案也可能被黑客攻击。如果您担心其他人可能未经您的批准就访问您的内容,您还可以阻止热链接 见:
在另一个域上运行的JavaScript无法访问域上的任何页面,因为这违反了。攻击者需要利用XSS漏洞进行攻击才能实现此目的。简言之,您不需要担心这种特定的攻击,只需要担心影响每个web应用程序的旧攻击 安全连接ajax和php需要某种方式。 你可以用
if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/ajaxurl")
{
//Request identified as ajax request
}
别忘了保护php文件,因为使用cURL可以伪造文件头。在谷歌搜索了很多次后得出结论 步骤1:为所有Web服务生成令牌系统:
var form_data = {
data: $("#data").val(), //your data being sent with ajax
token:'<?php echo $token; ?>', //used token here.
is_ajax: 1
};
$.ajax({
type: "POST",
url: 'yourajax_url_here',
data: form_data,
success: function(response)
{
//do further
}
});
正在生成令牌:
注意:很抱歉嵌套IF..ELSE,但它增加了可理解性。
如果需要,您可以将所有三个功能简化为一个功能。增强了85%的安全性
只需在应用程序中设置会话,并检查会话是否已设置
session_start();
if(!isset($_SESSION['gebruikersnaam'])) {
header('Location: path/to/app/home');
}
//Do stuff
您还可以使用以下选项:
if(!$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
header('Location: path/to/app/home');
}
但并非所有浏览器都支持HTTP\u X\u请求的\u
为了获得额外的安全性,您可以检查ajax调用是否正在从应用程序中提交
if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/path/to/ajax/file") {
header('Location: path/to/app/home');
}
那么,应该如何使用XMLHttpRequest访问此页面呢?你知道同一原产地政策吗?我知道同一原产地政策。可以对XMLHttpRequest进行检查,以确定脚本是否已通过AJAX(即您自己的脚本)调用,或者是否有人将其浏览器指向此位置。不过,从自己网站的Firbug控制台调用脚本是另一回事;line让我的本地PHP用20秒重新加载页面。这将如何防止有人通过控制台发送调用?会有相同的HTTP\U引用器吗?在这种情况下,令牌是无用的,因为用户可以读取JS脚本(步骤2)。@zeuf:token由服务器在页面加载时“每次(每个请求)”生成。因此,这并不重要。@HardikThaker@zeuf如果您担心javascript中的令牌,您可以在服务器端使用salt。例如:
$randomNumber=rand(10009999)$browserToken=hash(“sha256”,$randomNumber)$saltValue=“abc123456”$serverToken=$browserToken$盐值$serverToken=hash(“sha256”,$serverToken)$_会话[“令牌”]=$serverToken验证时,只需重新创建serverToken并验证它是否匹配。
if(!$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
header('Location: path/to/app/home');
}
if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/path/to/ajax/file") {
header('Location: path/to/app/home');
}