2009-11-13 64 views
4

我有一個第三方服務器,它有一個傳統的ASP頁面,它接受表單數據。在我的網頁上,我有一個使用curl將字段發送到ASP頁面的PHP腳本。除非用戶在文本中包含撇號字符,否則一切正常。在後端收到「\」。更奇怪的是,它只是從我的託管網站上做到這一點。當我在本地測試時,它工作正常。PHP Curl將''添加到發送到ASP的撇號字符頁面

這裏是PHP代碼片段,它發送的數據:

$datatopost = array(); 
foreach($_POST as $key => $data) { 
    $datatopost[$key] = $data; 
} 

$ch = curl_init("http://my.server.com/validate.asp"); 
curl_setopt($ch, CURLOPT_POST,1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $datatopost); 
$result = curl_exec($ch); 
+1

聽起來像字符串轉義出錯了。 – 2009-11-13 20:00:45

回答

5

你可能需要禁用魔術在那個特定的服務器行情:http://php.net/manual/en/security.magicquotes.php

此外,您可以將此代碼添加到頂部您腳本(更好,但在庫您在每一頁)所以無論環境,您總能獲得神奇的逆轉行情:

<?php 
if (get_magic_quotes_gpc()) { 
    function stripslashes_deep($value) 
    { 
     $value = is_array($value) ? 
        array_map('stripslashes_deep', $value) : 
        stripslashes($value); 

     return $value; 
    } 

    $_POST = array_map('stripslashes_deep', $_POST); 
    $_GET = array_map('stripslashes_deep', $_GET); 
    $_COOKIE = array_map('stripslashes_deep', $_COOKIE); 
    $_REQUEST = array_map('stripslashes_deep', $_REQUEST); 
} 
?> 

取自http://php.net/manual/en/security.magicquotes.disabling.php

+2

謝謝!這固定了它。我只需要將該腳本添加到頂部。 – BlueVoid 2009-11-13 20:05:33

+0

-1用於處理未經過濾的輸入。惡意用戶可能會導致此代碼遞歸到任意深度。 – 2009-11-13 20:24:25

+1

@Ben Dunlap:Curl自己處理。除非你指的是stripslashes_deep,在這種情況下我會指出addslashes已經在輸入上運行(否則get_magic_quotes_gpc()將返回false)。 – Powerlord 2009-11-13 20:47:28

4

確保你禁用了魔術引號。看到你的數據來自$_POST,這是最可能的罪魁禍首。

1

使用PHP的filter_input()來獲取POST變量。如果啓用它,將繞過magic_quotes,並會鼓勵您根據需要驗證或清理您的輸入。

此方法將要求您提前知道POST變量的名稱,但這是件好事。以下是它的外觀:

$expected_keys = array(
    'foo', 
    'bar', 
    // etc. 
); 

$datatopost = array(); 

foreach ($expected_keys as $expected_key) { 
    $value = filter_input(INPUT_POST, $expected_key, <filter>, [<options>]); 

    if ($value !== FALSE && !is_null($value)) { 
     $datatopost[$expected_key] = $value; 
    } 
} 

// CURL code here 
+0

順便說一下,這是隻適用於PHP> = 5.2.0 – Seb 2009-11-16 21:02:29

+0

好點,但然後再次發佈PHP 5.2.0 3年前。更多在@ Seb的回答的評論。 – 2009-11-16 22:36:15