处理数据库时使用PHP的安全性和PDO。我理解正确吗?

时间:2013-11-17 16:06:32

标签: php mysql pdo

我对PHP和编程很新。我遇到过一篇关于安全性的文章,虽然在我的案例中还不是问题,但我相信它会在某些时候出现。

有问题的文章是关于数据库输入的。

我在处理数据库时大部分时间都在使用PDO,但是我对某些部分感到困惑。也许某人可以对一些事情有所了解。

据我了解,在PDO中编写了一些语句,例如:

SELECT <column> FROM <table name> WHERE <something>

不立即执行(很明显),但只有在execute()时才执行;叫做。并按原样解释。 所以有点像

"SELECT <column> FROM <table name> WHERE" . <userinput> OR 1=1;

假设userinput是用户名

<userinput> OR 1=1

是通过表单或其他内容的用户输入变量,将被解释为完全相同,意味着用户名将是

userinput OR 1=1

显然,数据库中不存在用户名OR 1 = 1,因此将返回错误。

这是否意味着PDO从SQL注入等方面是安全的(我知道这个词很有用)?还是其他“黑客”方法?

一般来说,我可以使用/做什么来消毒用户输入?

2 个答案:

答案 0 :(得分:0)

是的,它是安全的,您可以将其视为沙箱,如果您有像SELECT FROM books这样的SQL,它保证用户的输入不会超出界限(比如修改sql查询),所以从1开始就是安全的订单注入,但不是从第二个。

我的意思?那么PDO PREPARED语句(因为你可以使用pdo而不用在php中编写语句)保证你的SQL查询是安全的,但它不会过滤实际值。

考虑一下示例:假设我们从表单中获取了一些值,值为1); DROP TABLE books,我们将使用我们准备好的语句INSERT INTO books VALUES(<value1>, ...)将其保存在我们的数据库中,这样查询就会成功执行,值1); DROP TABLE books将保存在我们的数据库中,但不会执行恶意代码,也不会丢弃值。但是,如果您在标准查询中使用我们的存储值,则不准备一个。你会受伤的。但如果你到处都使用PDO准备好的声明你是安全的。但无论如何我建议过滤价值。

答案 1 :(得分:-1)

在PDO上使用 Prepared Statements ,您可以不再担心SQL注入。

我很抱歉,因为这是我能为这个问题提供的最简单的答案。

Source

编辑:

在SO

上找到了这个答案
Statement stmt = conn.prepareStatement("INSERT INTO student VALUES(?)");
stmt.setString(1, user);
stmt.execute();

如果“user”来自用户输入且用户输入为

Robert'); DROP TABLE students; --

然后在第一个例子中,你会受到冲击。在第二个,你会安全,小Bobby表将在你的学校注册。