我对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注入等方面是安全的(我知道这个词很有用)?还是其他“黑客”方法?
一般来说,我可以使用/做什么来消毒用户输入?
答案 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注入。
我很抱歉,因为这是我能为这个问题提供的最简单的答案。
编辑:
在SO
上找到了这个答案Statement stmt = conn.prepareStatement("INSERT INTO student VALUES(?)");
stmt.setString(1, user);
stmt.execute();
如果“user”来自用户输入且用户输入为
Robert'); DROP TABLE students; --
然后在第一个例子中,你会受到冲击。在第二个,你会安全,小Bobby表将在你的学校注册。