PHP Soap - 远程SQL
我目前正在使用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注入?
如果没有数据库连接,您无法安全地转义字符串,因为转义取决于数据库类型以及可能的数据库设置。他们的API是否接受参数化查询?
如果不是这样,对于像ints
你可以检查它们的类型,并确保他们是逸岸ints
但对于字符串,所有我能想到的是addslashes
这是不是很安全。已弃用的mysql_escape_string
,但又不是很安全,是为MySQL。
你可以做的最好的事情是问他们怎么做,他们的API可能有一些逃避字符串的方法。
防止SQL注入是关于清理输入的。我通常在可能和可行的情况下推荐以下方法。
创建允许字符的白名单。 递归地使用白名单对输入应用过滤器,删除所有不允许的字符。只要用户不需要的特定字符(意思是不要将它们放在白名单中)是
<
,>
,'
和"
如果可能,列举所有有效用例并禁止其他所有用例。如果你有很多可能的输入空间,可以使用黑名单,但是要明白你会忘记一些让你容易受到攻击的东西。任何可能修改SQL语句的字符都应该正确转义。
每次访问数据时,无论是从用户输入还是从数据库访问数据,都要通过白名单和递归转义过滤器来运行,直到输出与输入匹配(表示禁止所有可能的禁用字符实例被删除。如果您筛选出
<scipt>
但不递归应用它<sc<script>ript>
会发生什么。使用参数时,它是可用的。这件事会解决很多你的问题。一个参数化API并不总是可用然而,这样了解其他技术很重要。
有许多API提供此功能,因此在您推出自己的应用程序之前,请尝试找到一个。注意提供过滤/验证但不是出于安全目的而设计的API。这些将工作99.99%的时间,直到你被一个1337的目标。
如果我运行一个正则表达式来返回true,那么只有字符串是字母数字时,如果有或没有空格,该怎么办? – bottens 2013-05-07 13:14:10
像这样:$ search_term =(preg_match('/^[A-Za-z0-9 _] * $ /',$ search_term))?$ search_term:“默认搜索词”; – bottens 2013-05-07 13:15:02
是的,只要你不需要别的东西就可以工作。白名单是安全的,但用字符串你需要非常小心你允许的。我[发现这个问题](http://stackoverflow.com/questions/1162491/alternative-to-mysql-real-escape-string-without-connecting-to-db)有一些答案,可能会有所帮助。 – Sam 2013-05-07 14:08:34