因名称而导致pg_query错误:'kill'em all'

时间:2016-01-17 03:15:52

标签: php sql postgresql pg-query

pg_query无法在name ='Kill'em all'的情况下执行'错误指向“em”之前的“'”,这是问题,但我找不到解决方案。

module

1 个答案:

答案 0 :(得分:1)

现在你正在传递字符串

INSERT INTO order (foodid,name) VALUES (1,' Kill 'em all')

到postgresql服务器,它没有机会确定'in 'em是字符串文字的一部分而不是它的分隔符。
您必须确保您的有效负载参数不会“破坏”sql语句。

您可以使用appropriate encoding/escaping function for string literals将有效负载直接放入sql语句

// <--- test whether $food_id contains only digits here, e.g. via ctype_digit
$query = sprintf('
    INSERT INTO
        order (foodid,name)
    VALUES
        (%s,%s)',
    $food_id, pg_escape_literal($conn, $food)
);

$result = pg_query($conn,$query) or die("Query cannot be executed");

或使用prepared statement + parameters,实际上将实际的sql语句与有效负载数据分开:

// Prepare a query for execution
$result = pg_prepare($conn, '', '
    INSERT INTO
        order (foodid,name)
    VALUES
        ($1,$2)
');
if ( !$result ) {
    yourErrorHandler();
}
$result = pg_execute($conn, '', array($food_id, $foo));
if ( !$result ) {
    yourErrorHandler();
}

另见:http://php.net/security.database.sql-injection