2012-03-28 99 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