在JS中从php文件执行字符串,setTimeout vs eval()

Execute string in JS from php file, setTimeout vs eval()

本文关键字:vs setTimeout eval 字符串 中从 JS php 文件 执行      更新时间:2023-09-26

我有一个Javascript代码,使用ajax从.php文件获得响应。我使用"eval()"进行测试,一切都很好(有点慢),但我发现了一个很好的技巧,我可以使用setTimeut。我仍然是一个初学者,但是每个人都说eval很危险,我应该避免它,这就是为什么我在寻找一个替代品。setTimeut工作得比eval(速度)好得多,但它安全吗?

所以使用setTimeout(结果,0)来执行我从php文件(作为字符串)收到的代码是安全的吗?还是它比eval()更安全?请帮忙,提前感谢。

My code Javascript:

    function sendAjax(vData) {
    $.ajax({
        method: 'GET',
        url: '_process.php',
        data: vData,
        success : function (result) {
            setTimeout(result, 0);
            //old method eval(result);
        }
    });
}
$('.button1, .button2, .button3').click(function () {
    sendAjax($(this).attr('class'));
});

和.php文件

if (isset($_GET['button1'])) {
echo    " $('.button1').hide(500, function () {
                console.log('some1clickedbutton1');
            });";

}

这样行吗?我从来没有尝试过Eval()或setTimeout来运行ajax返回的函数。但是对我来说,在javascript中已经有了函数,并根据返回的值简单地调用它更有意义。

php文件:

if (isset($_GET['button1'])) {
    echo "true";
}else{
    echo "false";
}

然后是javascript:

 function sendAjax(vData) {
    $.ajax({
        method: 'GET',
        url: '_process.php',
        data: vData,
        success : function (result) {
            if(result == "true"){
                hideButton1();
            }
        }
    });
}
function hideButton1(){
    $('.button1').hide(500, function () {
                console.log('some1clickedbutton1');
            });
}
$('.button1, .button2, .button3').click(function () {
    sendAjax($(this).attr('class'));
});

玫瑰的另一个名字…

eval的大多数问题都是将字符串作为代码执行的一般问题。避免将字符串传递给setTimeoutsetInterval, new Function()以及其他任何沿着这些行的内容。

一般情况下,您最好使用实际的JavaScript编写代码,然后从服务器发送纯数据(其中没有逻辑)。

对你的代码要做的事情做很多假设,你可以这样做:

if (isset($_GET['button1'])) {
    $clicked = "button1";
}
$response = array( clicked => $clicked );
header("Content-Type: application/json");
echo encode_json($response);

success : function (result) {
    $("." + result.clicked).hide(500, function () {
        console.log("some1clicked" + result.clicked);
    });
}