2014-05-22 49 views
0

有没有办法限制php pdo execute()只运行第一个sql语句?限制php pdo execute()只运行第一个sql语句

例如运行

SELECT * FROM customer;DROP TABLE invoice

将返回所有客户,但它也将删除发票上的表。

我有一种情况,我需要从用户的一个完整的SQL语句,但它必须是一个SELECT,没有额外的东西。

我的例子只是许多可能被恶意输入的例子之一。它可能包含额外的DROP,UPDATE,DELETE语句等。

准备好的语句将简单地用值替换?它不会阻止传递给它的危险的SQL语句。

如果有限制php pdo execute()只运行第一个sql语句的方法,这不会有问题吗?

+0

为什么你把那个声明那里,如果你不需要它?如果你担心注入,那么如果你的查询包含drop查询,并且如果你在某个变量中有这个查询,那么'preg_replace(“/(。)就是PDO中的Prepared语句会自己处理 –

+0

。 *?)DROP(。*)/“,”$ 1“,”SELECT * FROM customer; DROP TABLE invoice “);'如果删除查询出现在该查询中,将删除查询 –

+0

@ user790454 - 如果选择子字符串或者插入一个包含单词drop的子串。 – Scopey

回答

0

如果你试图防止SQL注入,准备语句可以处理它。

你可以使用这样的事情来防止SQL注入

$stmt = $db->prepare("SELECT * FROM table WHERE id=? AND name=?"); 
$stmt->bindValue(1, $id, PDO::PARAM_INT); 
$stmt->bindValue(2, $name, PDO::PARAM_STR); 
$stmt->execute(); 
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 
+0

感谢您的回复,但我实际上并没有用值来取代?这是一种情况,我需要接受来自用户的sql字符串,而不仅仅是值,它必须是一个SELECT语句,否则可能会损坏系统。 – user1397366

+1

在这种情况下,您需要关键字黑名单,或者干脆更改数据库prevellage,以便其不可能删除表; – Saqueib