2014-12-23 31 views
2

我正在寫簡單的AJAX函數來向服務器發送註釋並將它們保存在使用php的mySQL數據庫中。用哈希標記保存文本(Javascript - PHP - MySQL)

下面的代碼似乎工作得很好,我的目的,基本的,但他的工作,直到我試圖把一個哈希符號(#)在評論。 插入到文本「崩潰」我的功能,而不保存在數據庫中的書面文字,並基本上返回一個空的div。

這是AJAX調用:

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對象,驗證是用於檢查等<很多符號的函數,>,=,(,), |用正則表達式。

這是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); 
} 

它只是連接,節省了評論,並返回與之呼應的HTML代碼,使JavaScript函數可以打印。

這顯然適用於任何文本,但我不能讓它與哈希一起工作,我錯過了什麼? Sidenotes,我可以簡單地將符號添加到驗證常規expr中,但我的觀點是「打印」它,而不僅僅是排除它。提前致謝! Sidenote 2,javascript將註釋附加到一個靜態元素。

+0

「我是否錯過了什麼」 - 將數據與散列並將其放入HTTP請求中的代碼。 – Quentin

+0

**危險**:您正在使用[一個**過時的**數據庫API](http://stackoverflow.com/q/12859942/19068)並應使用[現代替換](http:// php。淨/手動/ EN/mysqlinfo.api.choosing.php)。你可能也容易受到[SQL注入攻擊](http://bobby-tables.com/)**,現代的API會更容易[防衛](http://stackoverflow.com/questions/) 60174/best-way-to-prevent-sql -injection-in-php)自己從。 – Quentin

+0

我簡單地寫了/ *打開發送等。* /讓它更快,讓我編輯完整的代碼 –

回答

2
url = "comments.php?news="+n+"&text="+text; 

您不會轉義您放入您網址的任何數據。

某些字符具有特殊含義,例如&分隔查詢部分,並且#開始分段標識符。

在將URL添加到URL之前,您需要通過encodeURIComponent()運行您的輸入。

url = "comments.php?news=" + encodeURIComponent(n) + "&text=" + encodeURIComponent(text); 
-2

許多字符(如#)並不是SQL安全需要轉義 在你需要使用

var toSend = escape(mystring); 

這並不會攻擊保護,但將讓你在路上最起碼的。

+0

['escape'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape)已棄用,且不是unicode安全的。它不應該被使用。 '#'是SQL安全的(至少在這種情況下),'''會有問題,但需要在PHP中解決而不是JS。 – Quentin

+0

表示同意,但它跨越獲取點,字符串需要發送到DB – Shooky

+0

這裏的問題無關,與數據庫(即另一問題的代碼患有)之前逃脫。它將數據放入網址中。 – Quentin