2012-10-22 44 views
0

我对PHP还有很多新的PDO,所以我不完全知道在从SQL注入以外访问数据库时应该避免(并且包括)什么。 (仅供参考,在“用户”表下面的示例中也包含密码),但是使用下面的函数访问数据库以获取安全信息?是否容易受到攻击?使用函数访问数据库值是否安全?

,如果你不明白为什么我这样做是因为我发现它更快,链接表:)

<?php 
    require("access/common.php"); 
    function getval($username, $column, $table, $datab){ 
    $query = " 
    SELECT 
    id, 
    username, 
    email 
    FROM ".$table." 
    WHERE 
    username = :username 
    "; 
    $query_params = array( 
    ':username' => $username, 
    ); 
    try 
    { 
     $stmt = $datab->prepare($query); 
     $result = $stmt->execute($query_params); 
    } 
    catch(PDOException $ex) 
    { 
     die(); 
    } 
    $row = $stmt->fetch(); 
    if($row) 
    { 
     return $row[$column]; 
    } 
    } 
    echo getval("USERNAME", "email", "users", $db); 
?> 
+0

看起来你正在编写某种数据库访问层。你有没有考虑过使用一个[已经写好](http://stackoverflow.com/questions/108699/good-php-orm-library)? – tadman

回答

1

你问的问题是非常开放的。用户输入(用户可以通过$ _GET或$ _POST变量向应用程序/网站提交的任何内容),您的最大攻击向量始终是您用做的事情。当然,PHP语言结构没有安全威胁,例如。功能。

在你的例子中,我可以看到你绑定了“:username”参数,而不是“:table”参数,如果你接受unsanitized用户输入并将它用作“$ table”值。

一定要小心你如何使用$ _GET和$ _POST值......当这变得单调乏味时,寻找一个框架来自动完成一些工作。

+0

'$ table'不能用占位符转义,否则会以文字字符串结尾,因此会导致查询无效。在一般的实践中,你应该确定'$ table'不能包含敌对值,例如,如果它是由用户提供的,或者通过确保它只在内部提供,则通过将其与可接受值的已知白名单进行审核,而不是从' $ _GET','$ _POST'或'$ _SESSION'。 – tadman

+0

是真的。感谢您的更正。 – stephenfrank

0

函数是没有安全或小于安全时,它会更容易代码之外的函数。如果这是你将要使用超过一次或两次,肯定把它放在一个函数。只要你正确使用PDO,你就会好起来的。也就是说,您可能希望将所有数据库函数放在一个类中,然后实例化该类的$ db对象,然后可以从中调用所需的任何数据库函数。有很多方法可以组织代码,使事情更容易处理。

+0

thankyou :)我只是想到了这一点,但如果这个陈述会被重复执行,它会不会也有点广泛? –

+1

广泛的如何?函数意味着被多次调用。但是,如果您要一遍又一遍地运行某些查询,则可能需要查看MySQL中的存储过程。 – sgroves

相关问题