iframe 嵌入代码抛出 403 错误

Posted

技术标签:

【中文标题】iframe 嵌入代码抛出 403 错误【英文标题】:iframe embed code throws 403 error 【发布时间】:2017-03-27 11:46:31 【问题描述】:

我正在尝试设计一个内容管理系统(用于博客)。一切正常,但我对更新部分有一个奇怪的问题。更新部分适用于 jquery-ajax 和 php。 jquery 函数检查输入,如果一切正常(不为空等),则通过 AJAX(POST 方法)将所有数据发送到 addpostup.php。问题是,

当我在 textarea 上添加代码 iframe(用于 youtube 链接)时,它会抛出

jquery-3.0.0.min.js:4 POST addpostup.php 403 (Forbidden)

在本地主机上运行良好。当我添加没有属性的 iframe 代码时

<iframe></iframe>

它会抛出同样的错误 403。

已授予 addpostup.php 的许可 0755。 仍然存在相同的错误。另外我没有添加代码 iframe,一切正常(其他 html 标签也不会引起问题)。我的 addpostup.php 文件是:

<?php
session_start();
require('checklogin.php');
require('../fn/db.php');

    $id = $_POST['addid'];
    $title = $_POST['title'];
    $image = $_POST['image'];
    $brief = $_POST['addta'];
    $text = $_POST['addta2'];
    $radio = $_POST['addradio'];
    $video = $_POST['addvideo'];
    $sample = $_POST['addsample'];
    $keyword = $_POST['addkeyword'];
    $descr = $_POST['adddesc'];
    $gdate = date('d.m.Y');

    try 
        $data = 'UPDATE tbl_cnt SET title = :title, img = :img, brief = :brief, textt = :textt, classt = :classt, videot = :videot, udate = :udate, surl = :surl, kword = :kword, descr = :descr WHERE id = :id
        ';

        $sql = $db->prepare($data);

        $sql->bindParam(':title',$title);
        $sql->bindParam(':img',$image);
        $sql->bindParam(':brief',$brief);
        $sql->bindParam(':ttext',$text);
        $sql->bindParam(':classt',$radio);
        $sql->bindParam(':videot',$video);
        $sql->bindParam(':udate',$gdate);
        $sql->bindParam(':surl',$sample);
        $sql->bindParam(':kword',$keyword);
        $sql->bindParam(':descr',$descr);
        $sql->bindParam(':id',$id);

        $sql->execute();

         echo('Success...');
     catch (Exception $e) 
         echo 'Error: ' . $e->getMessage();
    

    $db = null;

?>

数据库连接位于 db.php(包含)中。我的控制器功能(jquery-ajax)是;

function check_form2()
    valid = true;

    $(".statusaddpost").html('');
    $(".addpost").css("border","1px solid #ccc");
    $("#addta").css("border","1px solid #ccc");

    if (!$("#addtitle").val())
        $("#addtitle").css("border","1px solid red");
        $(".statusaddpost").append('<li><i class="fa fa-times-circle" aria-hidden="true"></i> Empty title !!.</li>');
        valid=false;
    

    if ($("#addtitle").val().length > 50)
        $("#addtitle").css("border","1px solid red");
        $(".statusaddpost").append('<li><i class="fa fa-times-circle" aria-hidden="true"></i> Max title length is 50. At the moment : '+$("#addtitle").val().length+' </li>');
        valid=false;
    

    if (!$("#addimage").val() || $("#addimage").val()=='disab')
        $("#addimage").css("border","1px solid red");
        $(".statusaddpost").append('<li><i class="fa fa-times-circle" aria-hidden="true"></i> Empty image!!</li>');
        valid=false;
    else if ($("#addimage").val().length > 20)
        $("#addimage").css("border","1px solid red");
        $(".statusaddpost").append('<li><i class="fa fa-times-circle" aria-hidden="true"></i> Max img length is 20. At the moment : '+$("#addimage").val().length+' </li>');
        valid=false;
    

    if(valid==true)
        if ($("#addvideo").is(":checked"))
            video="1";
        else
            video="0";
        
        serdata = 'addid='+$("#addid").val()+'&title='+$("#addtitle").val()+'&image='+$("#addimage").val()+'&addta='+$("#addta").val()+'&addta2='+$("#addta2").val()+'&addradio='+$('input[name=addradio]:checked', '#addpost').val()+'&addvideo='+video+'&addsample='+$("#addsample").val()+'&addkeyword='+$("#addkeyword").val()+'&adddesc='+$("#adddesc").val();
        $.ajax(
            type:"POST",
            url:"../addpostup.php",
            data:serdata,
            cache:false,
            success:function(result)
                $(".statusaddpost").html('');
                $(".previewpic").slideUp(300);
                $(".addpost").val('');
                $("#addta").val('');
                $("#addta2").val('');
                $(".previewpic").html('');
                $(".addpost").css("border","1px solid #ccc");
                $("#addta").css("border","1px solid #ccc");
                $(".statusaddpost").html('<li class="addpostsuccess">'+result+'</li>');
            ,
            error:function(error,e2,e3)
                $(".statusaddpost").html('<li>Error :</li>');
                $(".statusaddpost").append('<li>'+error+'--'+e2+'--'+e3+'</li>');

            

        );
    


添加部分与更新部分完全相同(HTML 结构和流程)。只是 SQL 部分不同。添加部分不会引发任何错误。

.htaccess 文件也包含压缩和杠杆代码。

我在等你的想法!感谢您阅读...

【问题讨论】:

【参考方案1】:

我不明白问题是什么,但我解决了我的问题。首先,我停用了 Apache mod_security(如服务器防火墙)但没有工作。然后我做了一个简单的编码和解码系统。在 AJAX 之前,我将其替换为普通字符串。 JQuery replace()

<iframe src="https://www.youtube.com/embed/randomnumbers"></iframe>

to

youtubevideo/randomnumbers

然后 AJAX 将数据发送到 addpostup.php 没有错误。在更新记录之前,我将其替换为原始字符串。 PHP str_replace()

youtubevideo/randomnumbers

to

<iframe src="https://www.youtube.com/embed/randomnumbers"></iframe>

就是这样。

【讨论】:

以上是关于iframe 嵌入代码抛出 403 错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试重新加载嵌入式 iframe 时出现 CORS 错误

尝试发送嵌入时抛出错误

HTML,VUE,嵌入iframe,实现iframe的100%高度和宽度,代码分享

Cakephp 3.4 AJAX 请求抛出 403 禁止错误

如何处理不抛出 catch 的 API 请求? (403 错误)

JSoup.connect 抛出 403 错误,而 apache.httpclient 能够获取内容