gpt4 book ai didi

javascript - javascript ajax post 上的 Http 406 错误。接受 header 设置为接受所有

转载 作者:行者123 更新时间:2023-11-30 12:38:00 26 4
gpt4 key购买 nike

当我尝试发出一个我无法理解的 AJAX 请求时,我从服务器收到一个错误。这是一个 HTTP 406 错误。据我了解,这意味着服务器无法以 Accept header 指示的格式发送响应。但据我所知,我是Accept荷兰国际集团*/* (通配符)。

您可以在这张图片中看到我的 HTTP 请求的详细信息。 http://i.stack.imgur.com/fTfBf.png My HTTP Request

这是我的页面 PHP 代码:

<body>
<div id="container">

(snip - menu and header)

<div id="notify-saved">
<div class="width">
<span>Saved!</span>
</div>
</div>
<div id="confirm-delete">
<div id="confirm-delete-content" class="width">
</div>
</div>
<div id="nav-separator">
</div>
<div id="body" class="width">

<section id="content">
<br />
<form method="POST" id='template-form' action="post-actions.php" >
<input type='hidden' name='id' value="15" />
<input type='text' name='name' value="default-scripting" placeholder='Name' />
<br />
<br />
<input type='checkbox' name='major' id="majorminor" />
<textarea name='value' style="width:100%;">&lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&quot;&gt;&lt;/script&gt;</textarea>
<br />
<br />

<button name='action' value="Update Template" id='update-button' >Update</button>



</form>
</section>
</div>
</div>
</body>

Javascript:

// Attach a submit handler to the form
$( "#update-button" ).click( function( event ) {
// Stop form from submitting normally
event.preventDefault();

// Get some values from elements on the page:
var $form = $('#template-form');
var template_id = $form.find( "input[name='id']" ).val();
var template_name = $form.find( "input[name='name']" ).val();
var template_value = $form.find( "textarea[name='value']" ).val();

var template_is_major = 'minor';
if( $( "input[name='major']" ).prop('checked') ){
template_is_major = "major";
}

var url = $form.attr( "action" );

// Send the data using post
var posting = $.post( url, { id: template_id, name: template_name, value: template_value, major: template_is_major, action: "Update Template" } );

// Show that the request has completed successfully
posting.done(function( data ) {
$('#notify-saved').slideDown(200).delay(500).slideUp(500);
});
});

.

另外一个相关的事实是这个错误只在某些时候发生,例如如果提交的模板值是

&lt;script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&quot;&gt;&lt;/script&gt;

那么就会报错,但是如果前导<被省略,则不会报错:

script src=&quot;http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js&quot;&gt;&lt;/script&gt;

接收 php 看起来像这样 (post-actions.php):

<?php 

// ugly-@$$ anti-magicquotes hackk
if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_REQUEST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}


require_once('database.php');
$dbo = new Database();

if( isset( $_REQUEST['action'] ) ){

switch( $_REQUEST['action'] ){

(snip - many irrelevant cases)

case "Update Template":
$dbo->UpdateTemplate( $_REQUEST[DB_TEMPLATES_ID], $_REQUEST[DB_TEMPLATES_NAME],
$_REQUEST[DB_TEMPLATES_VALUE], $_REQUEST[DB_TEMPLATES_MAJOR] );
break;



}

}

和数据库类:

<?php 

require_once ("config.php");
require_once ("database-contract.php");

class Database {

protected $db;
protected $pdo;

function __construct(){
$this->db = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
if($this->db->connect_errno > 0){
die('Unable to connect to database [' . $this->db->connect_error . ']');
}

$this->pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PASS );
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}

function __destruct(){
$this->db->close();
$this->pdo = null;
}


$query = 'INSERT INTO `'.DB_TEMPLATES.'` ( `'.DB_TEMPLATES_NAME.'` ) VALUES ( :name )';

$stmt = $this->pdo->prepare($query);
$stmt->bindValue(":name", $name, PDO::PARAM_INT);
$stmt->execute();

}

function updateTemplate($id, $name, $value, $major ){

if( $major == "major" ){ $major = 1; }
else{ $major = 0; }

$query = 'UPDATE `'.DB_TEMPLATES.'`
SET
`'.DB_TEMPLATES_NAME.'`=:name,
`'.DB_TEMPLATES_VALUE.'`=:value,
`'.DB_TEMPLATES_MAJOR.'`=:major
WHERE
`'.DB_TEMPLATES_ID.'`=:id';

$stmt = $this->pdo->prepare($query);
$stmt->bindValue(":name", $name, PDO::PARAM_STR );
$stmt->bindValue(":value", $value, PDO::PARAM_STR );
$stmt->bindValue(":major", $major, PDO::PARAM_INT );
$stmt->bindValue(":id", $id, PDO::PARAM_INT );

$stmt->execute();

}


$query = ' DELETE FROM '.DB_TEMPLATES.'
WHERE
'.DB_TEMPLATES_ID.'=:id';

$stmt = $this->pdo->prepare($query);
$stmt->bindValue(":id", $id, PDO::PARAM_INT);

$stmt->execute();


}

(snip - irrelevant functions)

}

在此过程中的某些时候,我曾认为这可能是字符编码问题,但我不再这么认为了。也许这是一些奇怪的字符转义问题? SO 上的其他帖子似乎表明这是 apache 的 mod_security 的配置问题/(功能?)。我尝试禁用一些不同的东西,但没有用,现在我不知道该想些什么。

感谢您的帮助。

最佳答案

您有 406 的事实,以及这是基于 < 的存在这一事实在 script 一词之前,直接导致安全过滤器起作用。所以mod_securityapache 配置文件会比js/php 代码更有用找到root 阻止规则。

这看起来像一个反 xss 过滤器。也许是一个非常简单的例子:

SecFilter "<( |\n)*script"

如果你可以改变这个 mod_security 配置,那么就去做吧……或者不做。这是关于安全的。也许您应该保留这些过滤器以保护您的应用程序免受真正不需要的脚本注入(inject)。也许真正的解决方案是您的官方应用程序表单应该管理与服务器的通信,而不是 怀疑 mod_security。在这里你的 POST 太像一个工具的跨站点脚本攻击,它只读取流并检测内部的 javascript 调用。

例如,您可以在 POSTed 值(来自 js)上添加 base64 编码并在 PHP 端解码结果,github 上提供了一些 base64 编码 js 库。

您实际上可以对您的数据应用任何转换,使该数据无 HTML(无 Javascript),至少对于 HTTP 过滤工具而言。 Base64 通常是解决方案,但请检查使用的库如何管理 utf-8 字符的编码,真正的 base64 仅是 ascii。

关于javascript - javascript ajax post 上的 Http 406 错误。接受 header 设置为接受所有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25452586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com