2012-09-24 82 views
2

我非常困惑,因爲要正確驗證我的URL。我嘗試了幾個選項,但我無法正確理解。有人可以看看我的代碼,並告訴我我做錯了什麼嗎?Url驗證我的腳本

$url=filter_input(INPUT_GET, 'url', FILTER_VALIDATE_URL); 
if (!$url) { 
    echo The url address is not valid 
} 

if(strpos($url,'http://')===false) 
    $url='http://'.$url; 
$query="INSERT INTO `aa_aa`.`article` VALUES ('', '".$url."', '".$_POST['description']."', '".$_POST['type']."',NOW());"; 
$result=mysql_query($query); 
if(!$result) 
    // echo 'Error While Inserting Article!'; 
    echo $query; 
else 
    header('Location: http://aa.aa'); 

編輯 對不起埃裏克這裏。 @Brad我的朋友幫助了我所有的腳本,所以我不太瞭解我在使用這個腳本的風險。

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 
SET time_zone = "+00:00"; 


/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 

-- 
-- Database: 
-- 

-- -------------------------------------------------------- 


-- Table structure for table `article` 
-- 

CREATE TABLE IF NOT EXISTS `article` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `url` varchar(100) NOT NULL, 
    `description` text NOT NULL, 
    `type` varchar(40) NOT NULL, 
    `title` varchar(80) NOT NULL, 
    `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=137 ; 

/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; 
/*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; 
/*!40101 SET [email protected]_COLLATION_CONNECTION */; 
+5

你是**開放**到SQL注入。如果你還沒有,你**將被黑客攻擊**。學習使用PDO或類似的準備好的查詢來完全避免這個問題。 – Brad

+0

你可以提供你的表格佈局/創建腳本嗎? – Erik

+0

究竟是什麼事? –

回答

0

我不知道如果這是你的錯誤,但正是基於表格的佈局則需要SQL查詢從

"INSERT INTO `aa_aa`.`article` VALUES ('', '".$url."', '".$_POST['description']."', '".$_POST['type']."',NOW());" 

"INSERT INTO aa_aa.article 
    (url,description,type,title,time) 
VALUES 
    ('". mysql_real_escape_string($url). "', 
    '". mysql_real_escape_string($_POST['description']). "', 
    '". mysql_real_escape_string($_POST['type']). "', 
    '". mysql_real_escape_string($_POST['title']). "', 
    NOW())" 

注意改變我由於它從原始查詢中丟失,但存在於表中創建腳本中,因此構成$_POST['title']。你也必須使用mysql_real_escape_string纔能有一定的安全性。理想情況下,你會想使用PDO。

+0

Nope沒有工作,但我更擔心這個安全問題。也許我應該付錢去重寫一切,而不是去找我的朋友。 –

+0

是的,它看起來好像你的朋友不知道他們提供給你的代碼的安全含義,或者他們希望你的網站被暴露。 –

1

幾件事情:

$url=filter_input(INPUT_GET, 'url', FILTER_VALIDATE_URL); 

這是優秀。使用filter_input()是最佳做法。

if (!$url) { 
    echo The url address is not valid 
} 

有幾件事情錯了位:

  1. 養成使用$foo === FALSE代替!$foo的習慣,當你明確檢查值FALSE,除非被檢查的值保證成爲布爾值。在這種特殊情況下,我不相信有可能被強制爲布爾FALSE任何有效的URL,所以你可能安全,但它仍然是很好的進入的習慣。
  2. 您正在回顯的字符串缺少引號和終止分號,因此這些將產生語法錯誤。
  3. 沒有任何東西阻止腳本繼續。這意味着無效的URL仍然會進入您的數據庫。您應該在echo之後使用exit;,或者重構您的邏輯,以便您的錯誤條件實際防止添加無效URL並繼續執行腳本。

    if(strpos($ url,'http://')=== false) $ url ='http://'.$url;

這裏有幾件事情,還有:

  1. 始終使用大括號{}周圍代碼塊。
  2. FILTER_VALIDATE_URL將不驗證沒有方案的URL。這意味着這段代碼是多餘的,應該刪除,因爲任何通過filter_input()調用的URL都會保證有一個方案(例如http://)。
  3. 只通過檢查http://,您沒有考慮使用其他方案的網址,例如https://。然而,這並不是什麼大問題,因爲正如我上面指出的那樣,這個代碼塊應該被刪除,這要歸功於FILTER_VALIDATE_URL全部爲您處理。 $ _ POST ['type']。$ _ POST ['description']。'','「。$ _ POST ['type' ]。「',現在());」;

這是廣泛開放的SQL注入。永遠不要直接將用戶輸入嵌入到查詢字符串中。只要有可能,請使用參數綁定和準備好的語句。由於您使用Mysql擴展名,因此這是不可能的,您的最佳選擇是使用mysql_real_escape_string()

$result=mysql_query($query); 

不推薦使用Mysql擴展名。您應該使用PDOMysqli

if(!$result) 
    // echo 'Error While Inserting Article!'; 
    echo $query; 
else 
    header('Location: http://aa.aa'); 

再次,總是圍繞代碼塊使用大括號{}