2012-11-04 86 views
-2

可能重複:
apostrophes are breaking my mysql query in PHP撇號不會在MySQL/PHP工作

我的Android應用程序在發送郵件到我的服務器(PHP腳本) 的PHP腳本編寫消息到MySQL。

它工作正常,但所有包含撇號的消息(例如他要去學校)都不會寫入數據庫。

這裏的PHP腳本:

function deq($s) 
{ 
    if($s == null) 
     return null; 
    return 
     get_magic_quotes_gpc() ? 
     stripslashes($s) : $s; 
} 

    if(md5(deq($_REQUEST['blub']).deq($_REQUEST['blub'])."blabla") == $_REQUEST['hash']){ 
    mysql_connect("localhost", "blub", "blub") or die(mysql_error()); 
    mysql_select_db("blub") or die(mysql_error()); 

    // mysql_set_charset('UTF8'); // does not work as too old php 
    mysql_query("SET NAMES 'utf8'"); 
mysql_query("SET CHARACTER SET utf8"); 
mysql_query("SET COLLATION_CONNECTION = 'utf8_unicode_ci'"); 

    $mysqldate = gmdate('Y-m-d H:i:s'); 

    $language = (int) $_REQUEST['language']; 

    $device = $_REQUEST['device']; 

    $ipaddress = $_SERVER['REMOTE_ADDR']; 


    mysql_query("INSERT INTO test(username, text, language, rating, checked, date) 
    VALUES('".$_REQUEST['username']."', '".$_REQUEST['text']."', '".$language."', '0' , 'false', '".$mysqldate."') ") 
    or die(mysql_error()); 

    mysql_close(); 
+0

閱讀:[大逃避現實(或:你需要知道什麼工作用文本中的文本)](http://kunststube.net/escapism/) – deceze

+2

您正在使用[一個過時的數據庫API](http://stackoverflow.com/q/12859942/19068),應該使用[現代替換](http: //php.net/manual/en/mysqlinfo.api.choosing.php)。你也暴露了自己[SQL注入攻擊](http://bobby-tables.com/),一個現代的API會使[防禦]更容易(http://stackoverflow.com/questions/60174/best-防止 - 注入 - 在PHP中)自己從。 – Quentin

回答

2

所有你需要逃避'像下面

$_REQUEST['text'] = mysql_real_escape_string($_REQUEST['text']); 
1

您已發現SQL injections:輸入中的撇號「離開」您放入查詢中的撇號。這會導致一些輸入被視爲查詢的一部分。在查詢中使用它之前,您可以使用mysql_real_escape_string來保護輸入。但總的來說,這有更好的解決方案(例如準備好的陳述)。

你是,順便說一下,使用PHP過時mysql_功能(見http://php.net/mysql_query大紅色的警告)

+0

Thx尋求幫助!我應該用什麼來代替mysql_?這是一個問題嗎?安全風險? – tobias

+1

請參閱http://php.net/manual/en/mysqlinfo.api.choosing.php - PDO可能是最現代化的API(允許您以統一的方式與MySQL以外的其他系統一起使用)。 mysqli和PDO都允許您使用準備好的語句,這樣可以更輕鬆地避免安全風險,並且還可以提高性能。我不認爲'mysql'本身就是一個安全風險,但是它太容易編程不安全。 – vicvicvic

1

看着上面的描述,你需要使用mysql_real_escape_string功能

逃生用斜槓輸入數據

撇號輸入數據時,在SQL查詢利用將打破SQL查詢得到的成SQL注入

所以總是利用到前淨化輸入數據與mysql_real_escape_string()函數SQL查詢

約mysql_real_escape_string更多的文檔()函數,請參閱以下網址中提到的文檔

http://php.net/manual/en/function.mysql-real-escape-string.php