SQL注入如何工作以及如何防范它

Joh*_*ica 5 php mysql protection sql-injection

可能重复:
什么是SQL注入?

我看到很多php代码在stackoverflow上浮动,而且(也)很少有字符串转义.

任何人都可以

  1. 解释SQL注入是什么;
  2. 解释它对您的服务器,数据和代码的作用;
  3. 举例说明如何执行SQL注入
  4. 给php示例代码如何防止SQL注入

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用户名等于某个值),因此在给定纯文本查询时不会产生混淆.然后数据库知道期望一个值,以及放置它的位置.然后将该值传递给可用于搜索的数据库.这也更好,因为数据库可以优化查询以加快搜索速度.

阅读准备好的陈述,这将更详细地解释这一点.


unc*_*ons 10

我无法抗拒发布这个.

与大多数其他文档相比,1-Sql Injection在一个漫画中得到了更好的解释.

2-主要是它对服务器没有太大作用,只对底层数据有用.结果包括删除,插入,选择记录,删除,创建表.(基于权限等..)

3- 例子.

4-对不起我不懂PHP.但只要您可以从View中抽象出您的数据库图层,就应该没问题.


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 +,你应该使用PDOmysqli扩展,它可以通过准备语句来防止这个问题.