使用哈希标记保存文本(Javascript-PHP-MySQL)
我正在编写简单的AJAX函数,将注释发送到服务器,并使用php将它们保存在mySQL数据库中 下面的代码对我来说似乎工作得很好,basic完成了他的工作,直到我试图在注释中添加一个散列符号(#)。 将其插入文本会“崩溃”我的函数,而不会将写入的文本保存在数据库中并返回空div 这是ajax调用:使用哈希标记保存文本(Javascript-PHP-MySQL),javascript,php,mysql,ajax,Javascript,Php,Mysql,Ajax,我正在编写简单的AJAX函数,将注释发送到服务器,并使用php将它们保存在mySQL数据库中 下面的代码对我来说似乎工作得很好,basic完成了他的工作,直到我试图在注释中添加一个散列符号(#)。 将其插入文本会“崩溃”我的函数,而不会将写入的文本保存在数据库中并返回空div 这是ajax调用: function sendComment(n){ var xmlhttp = createAjax(); var text = document.getElementById("f
function sendComment(n){
var xmlhttp = createAjax();
var text = document.getElementById("f"+n).value;
if (!validation(text))
return false;
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState==4 && xmlhttp.status==200){
appendComment(n, xmlhttp.responseText);
}
}
...
url = "comments.php?news="+n+"&text="+text;
xmlhttp.open("GET", url, true);
xmlhttp.send();
...
}
createAjax只是将每个浏览器的xmlhttp对象作为标准创建,而validation是一个使用正则表达式检查许多符号的函数,如,=、(、)、|
这是php部分:
function insertComment($text, $news){
$conn = dbConnect();
$user = $_SESSION["user"];
$text = nl2br(htmlentities($text));
$date = date("Y-m-d H:i:s");
$sql = "INSERT INTO comments(user, news, date, text) VALUES ('".$user."','".$news."','".$date."', '".$text."')";
mysql_query($sql) or die ("Errore in inserimento: ".sql_error());
echo writeSingleComment($user, $date, $text);
mysql_close(conn);
}
它只是连接、保存注释并返回带有echo的html代码,以便javascript函数可以打印它
这显然适用于任何文本,但我无法让它与哈希一起工作,我是否遗漏了什么?
旁注,我可以简单地将符号添加到验证正则表达式中,但我的目的是“打印”它,而不仅仅是排除它。提前谢谢!
旁注2,javascript将注释附加到静态元素。许多字符(如#)不是SQL安全的,需要转义
至少你需要使用
var toSend = escape(mystring);
这不会保护你免受攻击,但会让你走上正轨
url = "comments.php?news="+n+"&text="+text;
您没有逃逸任何要放入URL的数据
某些字符具有特殊含义,例如,&
分隔查询部分,而#
启动片段标识符
在将输入添加到URL之前,需要先运行输入
url = "comments.php?news=" + encodeURIComponent(n) + "&text=" + encodeURIComponent(text);
“我是否遗漏了什么”-将数据与哈希一起放入HTTP请求的代码。危险:您正在使用并且应该使用。你可能也容易受到现代API的影响,因为它会让你更容易使用。我只是写了/*open send等…*/为了让它更快,让我用我理解的完整代码进行编辑,但我不能更改MySQL部分,因为这不是我的选择,它必须保持这样,不过谢谢你的警告!已弃用,不支持unicode。不应该使用它
#
是SQL安全的(至少在这种情况下),'
可能会有问题,但需要在PHP中解决,这不是JS同意的,但它明白了一点,在发送到数据库之前需要对字符串进行转义这里的问题与数据库无关(这是代码遇到的另一个问题)。这与将数据放入URL有关。