2012-02-15 53 views
5

我有用戶輸入他們的名字,如:O'riley關於mysql_real_escape_string和strip_slashes的混淆

在我將這些數據輸入MySQL DB之前,我運行了mysql_real_escape_string

問題是,當我選擇這些數據以供顯示和稍後使用時,它會顯示爲:O\'riley

很明顯,這是預期的操作。我想知道的是,如果有人確定我可以將其存儲在數據庫中(仍然可以安全地轉義可能的惡意代碼),那麼在每次我調用整個數據的輸出時,我不必在輸出上使用strip_slashes() Web應用程序?或者,我在這裏錯過了什麼?

謝謝。

UPDATE 請參考Deceze的回答中的意見。

+0

你能從你的'php.ini'中顯示魔術引號嗎? – eggyal 2012-05-30 08:36:58

回答

-1

謝謝大家的答案。我會將+50獎勵出去,但我想告訴我真正的解決方案,所有人都幫助過...

我對所有發佈的數據ASONON執行mysql_real_escape_string(在任何處理之前) 。所以,加了一個斜線以逃避提交的'角色。這,我們知道是正常的。

但是,沒有理由在DB條目中顯示反斜槓\,對吧?逃跑在那裏確保輸入了'

原來,在轉義後,我會保存變量以重新加載到會話中的頁面,以防用戶在驗證所有表單字段時發現錯誤。在這種情況下,用戶的輸入(以前的O'riley現在被打印到他們的屏幕O\'riley。然後,用戶沒有抓住這個 - 所以他們通常會修正PHP在驗證過程中捕獲的錯誤(與名稱域無關)因此O\'riley將在數據庫中的土地,因爲mysql_real_escape_string將逃脫字符

: 當處理形式,FIRST保存形式補充器使用數據的第二驗證表單字段THIRD逸出用於處理的數據。進入數據庫

或更好的是,使用PDO,並避免這=)。

評論歡迎。感謝所有!

+0

你的方法有一個嚴重的錯誤。無論什麼「數據」都不需要轉義,而只需要SQL字符串。對於所有其他數據類型的轉義是無用的,從而使您可以廣泛開放注入。 – 2013-05-09 10:07:46

+0

@YourCommonSense我不理解評論? – Shackrock 2013-05-09 17:35:16

10

不,這不是意向操作存儲字符串爲「O \'riley」;它只應該在查詢中被轉義,但不能以這種方式存儲。我猜測PHP會通過Magic Quotes加入反斜槓,然後你再次逃脫以使它堅持下去。

Disable Magic Quotes

+0

這很奇怪。它在'php.ini'中絕對關閉 - 在WHM中顯示相同。但是用'phpinfo()'將它顯示爲ON。我已經直接編輯了PHP.ini:'配置文件(php.ini)路徑:\t/usr/local/lib' - 但它仍然顯示爲ON。這並不是如此,任何想法? – Shackrock 2012-02-15 01:42:27

+0

可能有不同的.inis用於CLI,Apache和其他場景。檢查它正在使用的'phpinfo()'。 – deceze 2012-02-15 01:50:59

+0

似乎與那個目錄中的一樣......'加載的配置文件\t /usr/local/lib/php.ini'我已經驗證了這在那裏確實是關閉的。我在HTACCESS中設置了它,現在它在php info(local)中顯示,但ON(主值)顯示,這很奇怪。此外,它似乎仍然無法解決問題......並且它們正在用斜線插入到數據庫中。 – Shackrock 2012-02-15 01:57:47

3

使用

var_dump(get_magic_quotes_gpc()); 

附近的某處實際使用發佈的數據,看看魔術行情是真正關閉。

此外,一些奇怪的框架可能會爲您添加所述報價,因此您的代碼爲addslashes和其他類似escape_string的函數。

+0

好的...所以這返回false ....給我一個小時現在跑回來。這是在吹我的心! – Shackrock 2012-05-30 11:40:24

+0

給一些更確切的答案 – 2012-06-04 06:50:46

4

我個人總是關閉魔術引號,因爲它正在做一些我沒有告訴它做的事情。如果您沒有能力關閉它,請考慮將此代碼包含在所有網頁的頂部。

if (get_magic_quotes_gpc()) { 
    function strip_array($var) { 
     return is_array($var)? array_map("strip_array", $var):stripslashes($var); 
    } 

    $_POST = strip_array($_POST); 
    $_SESSION = strip_array($_SESSION); 
    $_GET = strip_array($_GET); 
} 
+0

不是一個好的建議。 – 2012-06-04 06:50:05

+0

要擴展@VIPINJAIN評論,如果你做了這樣的事情,然後以後想要保護MySQL的帖子,將會有額外的斜線。例如,運行'<?php $ test = strip_slashes(「Some'quote」); echo mysql_real_escape_string(); ''你將會有引號轉義和反斜線轉義。從數據庫拉出來會有一個額外的反斜槓。 – teynon 2013-01-19 20:55:08

4

如果已禁用,並在get_magic_quotes_gpc返回1的情況下魔術引號和你不喜歡的東西@Michael節目和這個仍然發生時,魔術引號運行時可啓用。

當執行數據庫查詢甚至寫入文件時,魔術語句運行時會爲字符串添加斜線。要在當前執行腳本禁用此功能,這樣做:

if(function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime()) 
{ 
    set_magic_quotes_runtime(false); 
} 

您還可以禁用這個configuration option through php.ini爲好,如果你能做到這一點。但是,如果您不能通過php.ini永久禁用它,您可能需要在get_magic_quotes_runtimeset_magic_quotes_runtime之前添加@,因爲PHP可能會通過E_DEPRECATED錯誤添加@如果error_reporting被設置爲記錄此類錯誤(並且這會相當惱人)。

2

我會誠實地建議使用PDO。

PDO採用了準備和執行語句,這反過來又增加了安全性並消除了一些額外的頭痛。

$pdo = new PDO(); 
$stm = $pdo->prepare('INSERT... (LastName) VALUES (:LastName)'); 
$stm->execute(array(':LastName' => "O'Rily")); 

$stm->fetchAssoc(PDO::FETCH_ASSOC); 

您不再需要擔心刪除轉義斜槓以及確保基本的sql注入策略。

+0

我很想去,但這是一箇舊的代碼庫。嘗試去取代一切將是瘋狂的。 – Shackrock 2012-06-04 19:41:25

+0

你可以做的一個想法是半覆蓋現有的MySQL函數,如... '$ result = my_mysql_query($ mysql_resource,'INSERT INTO ...「); $ row = my_mysql_fetch_assoc($ result); function my_mysql_query($ mysql_resource,$ query){ \t return mysql_query($ mysql_resource,mysql_real_escape_string($ query,$ mysql_resource)); \t } function my_mysql_fetch_assoc($ resource){ \t $ result = mysql_fetch_assoc($ resource); \t return array_map(「strip_slashes」,$ result); }' – 2012-06-05 16:11:43

4

好的,這裏是你需要做的。首先,根據該意見,從其他問題:

ISOLATE

您需要確定是什麼原因造成的問題。它是服務器嗎?它是否有一些隱藏的代碼?什麼?有些程序員可能包括這樣的代碼配置頁上:

<?php if (isset($_POST)) 
    foreach ($_POST as $key => $value) $_POST[$key] = addslashes($value); 
?> 

因此,這裏有一些檢查,看它是否是服務器。這是儘可能堅實的檢查方式。創建一個新的頁面。將其全部留空並添加以下代碼:

<?php print_r($_POST); ?> 
<form action="" method="POST"> 
<input type="text" name="test" value="O'riley" /> 
<input type="submit" name="submit" value="submit" /> 
</form> 

將其保存並加載到瀏覽器中。點擊提交。看看是否仍然添加斜槓。

如果它仍在添加它,則需要排除服務器/配置的故障。如果它是您付費的服務器,則需要告訴他們修復或推送它。如果它是你自己的服務器,那麼你將需要做一些搞亂/谷歌搜索來弄清楚如何關閉魔術引號。

如果沒有引號出現,那肯定會有一些代碼在你的帖子變量中加斜線。但是,它可能不像上面的代碼那麼明顯。您需要在您的代碼上運行「addslashes」,「mysql_real_escape_string」和可能的「str_replace」搜索。如果您發現其中之一,則需要禁用它。但是請注意,這可能會破壞您的網站的其他正在發生此行爲的部分。將數據存儲在數據庫中的其他選擇是執行類似於上述代碼的功能,但是可以在其上運行stripslashes。然後你可以稍後運行mysql_real_escape_string。 (有點不必要的開銷。)

0

這可能是在您的httpd.conf或虛擬主機聲明中啓用了魔術引號。

確切的位置和文件將取決於操作系統和發行版。我會檢查Apache配置文件的php_flag設置。

+0

'php_flag magic_quotes_gpc On'也可以在.htaccess文件中設置。 – Eric 2012-06-05 08:18:02

-1

只要用乾淨的數據插入到數據庫之前,

function check_input($value) 
{ 
    if(get_magic_quotes_gpc()) 
    { 
     $value = stripslashes($value); 
    } 

    //check if this function exists 
    if(function_exists("mysql_real_escape_string")) 
    { 
     $value = mysql_real_escape_string($value); 
    } 

    //for PHP version < 4.3.0 use addslashes 
    else 
    { 
     $value = addslashes($value); 
    } 

    return $value; 
} 


$cleandata = check_input($value); 

$sql = "INSERT INTO `table_name` SET `field_name`='".$cleandata."'"; 

雖然獲取數據並顯示到它使用stripslashes($val)