Javascript / PHP / Ajax / Json:安全:在输出到浏览器之前逃脱用户提交的字符串

时间:2012-09-26 18:19:24

标签: jquery escaping

我的头脑正在爆炸,我正在寻找一个简洁的步骤,以便在输出到其他用户的浏览器之前转发用户提交的数据。

过程: 1)用户1提交带有文本字段的ajax表单(jquery),作为JSON发送。 2)PHP使用mysqli_real_escape_string()转义字符串并将其放入数据库中。 3)用户2加载一个页面,该页面通过jquery ajax请求请求数据,作为JSON接收。该字符串在表单的选择框中显示为选项。

我想确保用户1无法提交恶意javascript或html - 换句话说,我希望所有字符都能正确转义。我想了解实现这一目标的步骤,需要在下面的代码中进行哪些更改?

提交表格时:(没有逃脱)

$.ajax({
    url: '/ajax/insert.php', dataType: 'json',
    data: {str: $("input").val()}, success: function(){}
)};

PHP插入DB :(转义)

mysqli_query(
    "insert into tbl (str) values ('"
        .mysqli_real_escape_string($link, $_REQUEST['str'])
    ."')");

JQuery获取字符串,放入下拉(简化)(放在这里转义?):

$.ajax({
    url: '/ajax/get.php', dataType: 'json',
    data: {}, 
    success: function(json){
        $("select").html("<option>" + json.str + "</option>");
    }
});

用于从DB中检索的PHP(放在这里转义?):

$res = mysqli_query($link, "select str from tbl where X");
echo json_encode(mysqli_fetch_assoc($res));

由于

2 个答案:

答案 0 :(得分:2)

我决定这样做:

$.ajax({
    url: '/ajax/get.php', dataType: 'json',
    data: {}, 
    success: function(json){
        var options = $("select");
        options.html("");
        $.each(json, function(i, v){
            options.append($("<option />").val(v.item_id).text(v.str));
        });
    }
});

答案 1 :(得分:1)

另一种选择:

将新数据插入数据库时​​,请使用过滤,例如:

    /**
     * "Clean" posted vars from special characters with ENT_QUOTES
     */
function filter_spec($str_filter_value)
{
        if(!is_array($str_filter_value))
        {
        $str_filter_value = htmlspecialchars($str_filter_value, ENT_QUOTES);
        $str_filter_value = addslashes($str_filter_value);
        return $str_filter_value;
        }
}


    /**
     * Decode special characters in string encoded with filter_spec() (htmlspecialchars())
     * WARNING: If $safe = false This will decode all special characters to normal state
     * THE SAFE WAY: $safe = true will return the output in safe way. Default option is $safe=true.
     */
function filter_spec_decode($str_filter_value, $safe=true)
{
    if(!is_array($str_filter_value))
    {
        if($safe == true)
        {$str_filter_value = str_replace('&amp;', '&', $str_filter_value);}
        elseif ($safe == false)
        {$str_filter_value = htmlspecialchars_decode($str_filter_value, ENT_QUOTES);}
        $str_filter_value = stripslashes($str_filter_value);
        return stripslashes($str_filter_value);
    }
}

您的INSERT字符串更新应为:

$strToInsert = filter_spec($_REQUEST['str']);

您的数据库输出代码应为:

$strFromDB = filter_spec_decode($res['str']); // This is with safe enabled

希望这有帮助!