Javascript变量使用撇号传递文本字符串,是否被截断?

时间:2018-12-02 06:45:31

标签: javascript php

我有一段代码,其中包含以下形式的行:

ValueError at /test
incomplete format

在接收端,我有一个文档可以像这样抓取数据:

<form>
<input type='hidden' name='title' value='"+val.sources[0].title+"'>
</form>

正在将其插入数据库中,但是包含单引号的任何“标题”都将在单引号处被截断-参见示例:

“我不要” ----->结果为“我不”

“戴维汽车” ----->产生“戴维”

我确实在运气方面尝试了几次php str_replace努力,例如:

$title = $_POST['title'];

似乎没有正确发送数据,但不确定“任何建议”

这是下面的完整块并插入:

$title = str_replace(''', '"', $_POST['title']);

插入

$.each(playlist, function(index, val) {
        playlistHtml  += "<li class='playlist-item "+((val.sources[0].title).substring(0, 1)).toUpperCase()+"'><span class='jp-list-title' style='border-bottom:1px dotted #d2d2d2'>"
        +
        "<table border='0' style='width:100%;margin:8px 0px'><tr>"
        +
        "<td style='width:45px;text-align:center'>";
        // -----
        // ---- ICONS that preceed track -- YouTube, Vimeo, Audio, Movie etc. -----
        // -----
        if (val.sources[0].media == "0"){ // youtube
            playlistHtml += "<span style='min-width:30px;text-align:center;color:#5fabec;font-size:20px'><i class='fab fa-youtube' aria-hidden='true'></i></span>"
        }
        if (val.sources[0].media == "1"){ // vimeo
            playlistHtml += "<span style='min-width:30px;text-align:center;color:#5fabec;font-size:20px'><i class='fab fa-vimeo-square' aria-hidden='true'></i></span>"
        }
        if (val.sources[0].media == "2"){ // soundcloud
            playlistHtml += "<span style='min-width:30px;text-align:center;color:#5fabec;font-size:20px'><i class='fab fa-soundcloud' aria-hidden='true'></i></span>"
        }
        if (val.sources[0].media == "3"){ // MP3 audio link
            playlistHtml += "<span style='min-width:30px;text-align:center;color:#5fabec;font-size:20px'><i class='fas fa-file-audio' aria-hidden='true'></i></span>"
        }
        if (val.sources[0].media == "4"){ // MP4 video link
            playlistHtml += "<span style='min-width:30px;text-align:center;color:#5fabec;font-size:20px'><i class='fas fa-film' aria-hidden='true'></i></span>"
        }
        if (val.sources[0].media == "5"){  // radio link
            playlistHtml += "<span style='min-width:30px;text-align:center;color:#5fabec;font-size:20px'><i class='fas fa-microphone' aria-hidden='true'></i></span>"
        }

        playlistHtml  += "</td><td style='font-size:<?php echo $fontsize; ?>';padding:13px'><div class='playlist_abbrev'><span onclick='executeParent()'>"+val.sources[0].title+"&nbsp;&nbsp;<span style='color:#d2d2d2'>|</span>&nbsp;&nbsp;<span style='font-size:<?php echo $fontsize_artist; ?>'>"+val.sources[0].artist+"</span></div></td>"
        + /* TITLE -- ADD TO FAV */
        "<td style='font-size:<?php echo $fontsize; ?>';padding:13px'><form id='add Favorite' action='process_fav_add.php' method='post'><input type='hidden' name='active' value='1'><input type='hidden' name='mediatype' value='"+val.sources[0].media+"'><input type='hidden' name='title' value='"+val.sources[0].title+"'><input type='hidden' name='artist' value='"+val.sources[0].artist+"'><input type='hidden' name='source_url' value='"+val.sources[0].src+"'><input type='hidden' name='playlists' value='My-Favorites'><input type='hidden' name='user' value='<?php echo $id; ?>'><input type='hidden' name='playlist' value='<?php echo $playlist; ?>'><button class='playlist-favorite' id='sub'><i class='far fa-heart'></i></button></form></td>"
        "</tr></table></span></li>"

2 个答案:

答案 0 :(得分:1)

您可以尝试使用Template Literals

<input type='hidden' name='title' value="${val.sources[0].title}">

答案 1 :(得分:1)

有几个问题。

  1. 首先是通过一些jQuery代码将标题放置在input元素中的直接问题。您目前正在构建一个由以下内容组成的字符串:

    "....<input value='" + val.sources[0].title + "'>...."
    

    您已经检测到,标题值中的引号会破坏内容。您可以使用以下功能对标题进行转义:

    function escapeHtmlAttribute(s) {
        return s.replace(/&/g, "&amp;").replace(/'/g, "&apos;");
    }
    

    这会使用适当的HTML实体对引号进行编码,并且转义与号,否则可能会误认为HTML实体的开头。

    因此,您的字符串将像这样构建:

    "....<input value='" + escapeHtmlAttribute(val.sources[0].title) + "'>...."
    
  2. 其次,您在PHP代码中遇到了类似的问题,您直接在SQL中注入了字符串。它不仅给标题中的引号带来了问题,而且还为恶意SQL injection打开了大门。在过去,建议您致电mysql_real_escape_string来规避这一点:

    "INSERT INTO ....... VALUES(......, '" + mysql_real_escape_string($title) + "', ....)"
    

    ...但是最好根本不插入任何字符串并使用准备好的语句。这使我想到以下几点:

  3. 您正在使用mysql_组函数,这些函数在PHP 5.0中已弃用,并且自PHP 7起不再受支持。您确实必须远离它们。今天就做。而是应使用MySQLiPDO_MySQL扩展名。此外,您应该使用prepared statements。这样,您就不再需要任何转义,也没有SQL注入的风险。请阅读How can I prevent SQL injection in PHP?