2013-05-06 18 views
1

我目前正在使用3dCart高级API,它使用SOAP请求和SQL来查询数据库。PHP Soap - 远程SQL

我很担心安全。什么是使远程查询安全的选项?

下面是一些示例代码:

class Data { 
    private $db; 
    public function __construct(){ 
     $this->db = new soapclient('http://api.3dcart.com/cart_advanced.asmx?WSDL',array('trace'=>1,'soap_version'=>SOAP_1_1)); 
    } 

    public function query($sql = "SELECT TOP 20 * FROM category"){ 
     $param = array(
      'storeUrl'=>"example.com", 
      'userKey'=>"supersecretcode", 
      'sqlStatement'=>$sql 
     ); 
     $result = $this->db->runQuery($param); 
     $match = $result->runQueryResult->any; 
     $sxe = new SimpleXMLElement($match); 
     return $sxe->runQueryRecord; 
    } 
} 

我运行查询像这样:

$db = new Data() 
$query = $db->query("SELECT id, category_name FROM category WHERE category_name LIKE '%".$search_term."%' AND isFilter = 0 AND hide = 0"); 
//WORK WITH QUERY DATA HERE 

如何保护呢? 因为我没有直接连接到SQL服务器有什么办法来防止SQL注入?

回答

1

如果没有数据库连接,您无法安全地转义字符串,因为转义取决于数据库类型以及可能的数据库设置。他们的API是否接受参数化查询?

如果不是这样,对于像ints你可以检查它们的类型,并确保他们是逸岸ints但对于字符串,所有我能想到的是addslashes这是不是很安全。已弃用的mysql_escape_string,但又不是很安全,是为MySQL。

你可以做的最好的事情是问他们怎么做,他们的API可能有一些逃避字符串的方法。

+0

如果我运行一个正则表达式来返回true,那么只有字符串是字母数字时,如果有或没有空格,该怎么办? – bottens 2013-05-07 13:14:10

+0

像这样:$ search_term =(preg_match('/^[A-Za-z0-9 _] * $ /',$ search_term))?$ search_term:“默认搜索词”; – bottens 2013-05-07 13:15:02

+0

是的,只要你不需要别的东西就可以工作。白名单是安全的,但用字符串你需要非常小心你允许的。我[发现这个问题](http://stackoverflow.com/questions/1162491/alternative-to-mysql-real-escape-string-without-connecting-to-db)有一些答案,可能会有所帮助。 – Sam 2013-05-07 14:08:34

1

防止SQL注入是关于清理输入的。我通常在可能和可行的情况下推荐以下方法。

  1. 创建允许字符的白名单。 递归地使用白名单对输入应用过滤器,删除所有不允许的字符。只要用户不需要的特定字符(意思是不要将它们放在白名单中)是<,>,'"如果可能,列举所有有效用例并禁止其他所有用例。如果你有很多可能的输入空间,可以使用黑名单,但是要明白你会忘记一些让你容易受到攻击的东西。

  2. 任何可能修改SQL语句的字符都应该正确转义。

  3. 每次访问数据时,无论是从用户输入还是从数据库访问数据,都要通过白名单和递归转义过滤器来运行,直到输出与输入匹配(表示禁止所有可能的禁用字符实例被删除。如果您筛选出<scipt>但不递归应用它<sc<script>ript>会发生什么。

  4. 使用参数时,它是可用的。这件事会解决很多你的问题。一个参数化API并不总是可用然而,这样了解其他技术很重要。

有许多API提供此功能,因此在您推出自己的应用程序之前,请尝试找到一个。注意提供过滤/验证但不是出于安全目的而设计的API。这些将工作99.99%的时间,直到你被一个1337的目标。