2012-03-28 103 views
0

作爲一個新手,我認爲我從安全的角度理解要做什麼,但我仍然需要一些幫助。php安全與Joomla

我有一個窗體,需要了解相機的詳細信息。如相機名稱和一些其他選項,它們是html select的一部分。我在PHP程序如下:

$db = &JFactory::getDBO(); 

if (isset($_POST['addcamera'])) { 

    //process changes to camera options 
    if (!empty($_POST['camera_type']) && !empty($_POST['camera_status']) && !empty($_POST['camera_name']) && !empty($_POST['camera_quality']) && !empty($_POST['email_notice'])) 
    {  
     $add_name = JRequest::getVar('camera_name', 'Default Camera', 'post', 'STRING'); 
     $add_quality = JRequest::getVar('camera_quality', '', 'post', 'STRING'); 
     $add_motion_detection = JRequest::getVar('camera_status', '', 'post', 'STRING'); 
     $add_email_notice = JRequest::getVar('email_notice', '', 'post', 'STRING'); 
     $camera_type = JRequest::getVar('camera_type', '', 'post', 'STRING'); 
     //and so on... 

     //then I add to DB 
     $query_insert_camera = "INSERT INTO #__cameras (camera_status, camera_name, camera_quality, email_notice, camera_type, camera_hash, camera_sensitivity, user_id) VALUES ('".$add_motion_detection."','".$add_name."','".$add_quality."','".$add_email_notice."','".$camera_type."','".$add_camera_hash."','".$add_sensitivity."','".$user->id."')"; 
     $db->setQuery($query_insert_camera); 
     $db->query(); 

我使用jQuery驗證我的形式和對事物的PHP端因爲我使用Joomla我使用getVar:http://docs.joomla.org/Retrieving_and_Filtering_GET_and_POST_requests_with_JRequest::getVar。我相信我是在掩飾自己對XSS和SQL的攻擊,但是有人可以證實這是正確的做法嗎?

還有什麼我失蹤?

+0

注射:HTTP://en.wikipedia.org/wiki/SQL_injection,手冊:HTTP://docs.joomla.org/Accessing_the_database_using_JDatabase - 「準備查詢」標題。 – 2012-03-28 18:32:09

回答

1

在我看來,只要你保持你的joomla核心是最新的,風險就會降低。

這些鏈接可能會給你一個想法,不僅是在的Joomla的XSS和SQL攻擊,爲您的擴展:

您可以使用這些插件作爲一個以加強對這些攻擊的安全性:

而這裏的getVar的代碼,你可以看到如何保護您的網站是針對SQL注入和XSS:

2

像你大開看來,我SQL注入 - 或者我錯過了一些東西。

如果有人在攝像頭名一起傳遞的

foo';EVIL_SQL_HERE; 

線,據我可以看到你將執行SQL有符合STRING的標準會發生什麼。

我想你需要圍繞每個由用戶輸入(假設Joomla 1.6+)生成的變量,然後$ db-> Quote()將變量包圍在變量周圍來使用$ db-> getEscaped存儲在數據庫中。

下面是從一個相當典型的模型的行:

$search = $db->Quote('%'.$db->getEscaped($search, true).'%'); 
+1

我開始在Joomla 1.7上使用'$ db-> quote()'。我想我應該使用'$ db-> getEscaped()'來代替?根據本指南中的SQL部分:http://docs.joomla.org/Secure_coding_guidelines它顯示'$ db-> quote()'是所需的嗎?雖然Joomla文件傾向於嚴重過時。 – Tom 2012-03-31 13:49:26

+0

我剛回來糾正我的帖子。你應該使用兩者的變體。退出輸入,然後在存儲之前/期間引用它。我剛剛開始編寫J2的代碼。5,所以我沒有完全瞭解具體細節 - 並且似乎有兩種數據庫類的變體(或兩種使用方式),一種向後兼容舊J1.5的做事方式和一個新對象定向的方式。 – 2012-03-31 15:55:13

+0

它看起來像你的雙重代碼逃脫?在技​​術上,這是它的等效'$ search ='''''。$ db-> getEscaped($ search,true)。'%\''' – 2013-02-15 10:23:20