我有一段代码,其中包含以下形式的行:
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+" <span style='color:#d2d2d2'>|</span> <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>"
答案 0 :(得分:1)
您可以尝试使用Template Literals:
<input type='hidden' name='title' value="${val.sources[0].title}">
答案 1 :(得分:1)
有几个问题。
首先是通过一些jQuery代码将标题放置在input
元素中的直接问题。您目前正在构建一个由以下内容组成的字符串:
"....<input value='" + val.sources[0].title + "'>...."
您已经检测到,标题值中的引号会破坏内容。您可以使用以下功能对标题进行转义:
function escapeHtmlAttribute(s) {
return s.replace(/&/g, "&").replace(/'/g, "'");
}
这会使用适当的HTML实体对引号进行编码,并且转义与号,否则可能会误认为HTML实体的开头。
因此,您的字符串将像这样构建:
"....<input value='" + escapeHtmlAttribute(val.sources[0].title) + "'>...."
其次,您在PHP代码中遇到了类似的问题,您直接在SQL中注入了字符串。它不仅给标题中的引号带来了问题,而且还为恶意SQL injection打开了大门。在过去,建议您致电mysql_real_escape_string
来规避这一点:
"INSERT INTO ....... VALUES(......, '" + mysql_real_escape_string($title) + "', ....)"
...但是最好根本不插入任何字符串并使用准备好的语句。这使我想到以下几点:
您正在使用mysql_
组函数,这些函数在PHP 5.0中已弃用,并且自PHP 7起不再受支持。您确实必须远离它们。今天就做。而是应使用MySQLi或PDO_MySQL扩展名。此外,您应该使用prepared statements。这样,您就不再需要任何转义,也没有SQL注入的风险。请阅读How can I prevent SQL injection in PHP?