1

我目前正在使用 3dCart 高级 API,它使用 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 server 有什么办法可以防止 sql 注入?

4

2 回答 2

1

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

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

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

  3. 每次访问数据时,无论是从用户的输入还是从您的数据库,都通过白名单运行它并递归地转义过滤器,直到输出与输入匹配(这意味着所有可能的禁止字符实例都被消除了。考虑如果过滤会发生什么情况out<scipt>但不要将其递归应用于<sc<script>ript>.

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

提供此功能的 API 有很多,因此请在推出自己的 API 之前尝试找到一个。请注意提供过滤/验证但并非出于安全目的而设计的 API。这些将在 99.99% 的时间内有效,直到您成为 1337 的目标。

于 2013-05-07T03:51:08.847 回答
1

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

如果不是,对于像你这样的东西,ints你可以检查它们的类型并确保它们是事实上ints的,但是对于字符串,我能想到的只是addslashes这不是很安全。有一个已弃用mysql_escape_string,但又不是很安全,适用于 MySQL。

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

于 2013-05-06T21:12:34.720 回答