Joh*_*ica 5 php mysql protection sql-injection
可能重复:
什么是SQL注入?
我看到很多php代码在stackoverflow上浮动,而且(也)很少有字符串转义.
任何人都可以
shm*_*eps 11
SQL注入是一种恶意形成的SQL查询,用于"混淆"SQL数据库以提供它不应该提供的内容.例如,请考虑以下查询
"SELECT * FROM `users` WHERE `username` = '$name'";
Run Code Online (Sandbox Code Playgroud)
在正常情况下,这将起作用.如果我们向此提交"Jack",它将返回名为Jack的所有用户.但是,如果用户输入,例如"'OR 1 = 1",则结果查询将是
"SELECT * FROM `users` WHERE `username` = '' OR 1=1";
Run Code Online (Sandbox Code Playgroud)
因为1总是等于1,并且组合子句是OR,所以每行都会返回true,这反过来会向恶意用户显示每一行.使用此技术,有人可以查看整个数据库.还要考虑是否有人提交类似"'; DROP TABLE users
"; - 的结果
"SELECT * FROM `users` WHERE `username` = ''; DROP TABLE `users`";--";
Run Code Online (Sandbox Code Playgroud)
哪两个查询,一个什么都不做,第二个将删除整个用户数据库,导致数据丢失.
防止SQL注入的最佳方法是使用预准备语句.通过这些,您可以向SQL数据库发送一个类似的查询
"SELECT * FROM `users` WHERE `username` = '?'";
Run Code Online (Sandbox Code Playgroud)
这使数据库知道查询的格式(WHERE用户名等于某个值),因此在给定纯文本查询时不会产生混淆.然后数据库知道期望一个值,以及放置它的位置.然后将该值传递给可用于搜索的数据库.这也更好,因为数据库可以优化查询以加快搜索速度.
阅读准备好的陈述,这将更详细地解释这一点.
Sho*_*hoe 10
我无法抗拒.
SQL Injection是"利用应用程序数据库层中发生的安全漏洞的代码注入技术".换句话说,它是作为查询中的用户输入注入的SQL代码.
SQL注入可以操纵数据(删除,更新,添加ecc ...)以及损坏或删除数据库的表.我不知道SQL Injections操作脚本.
假设您在PHP脚本中期望(作为用户输入)登录表单中的用户名和密码,以后在查询中使用,例如:
SELECT Id FROM Users WHERE Name = $name AND Password = $password;
Run Code Online (Sandbox Code Playgroud)
用户可以插入内部$name
和$password
任何他喜欢的内容(例如,通过<input>
).让我们假设他添加了一个名称,如" 1 OR 1 = 1; --
",查询现在看起来像:
SELECT Id FROM Users WHERE Name = 1 OR 1 = 1; -- AND Password = $password;
Run Code Online (Sandbox Code Playgroud)
然后,在;
我可以添加另一个查询或使脚本认为用户名和密码实际存在之后.
请注意,这-- AND Password = $password;
是一个SQL注释,因此将被忽略.
如果您使用PHP <5,那么mysql_real_escape_string()
在将其嵌入查询之前,您应该查找并使用它来转义用户输入.
如果你使用PHP5 +,你应该使用PDO或mysqli扩展,它可以通过预准备语句来防止这个问题.