Php SQL注入在概念上是如何工作的?(简介)
可能的重复项:Php SQL注入在概念上是如何工作的?(简介),php,sql,security,scripting,Php,Sql,Security,Scripting,可能的重复项: 我拥有一家公司,希望了解PHP的Runabout。当我招聘人员维护和扩展其网站的代码时,我正在加强SQL注入的安全性,不太了解这些代码如何影响SQL数据库,因为它们包含在查询的字符串中 如何显示安全漏洞,以便我自己看到发生了什么 mysql_query("SELECT * FROM users WHERE username = '$username'"); 看看当我们将$username变量设置为讨厌的值时会发生什么: $username = "' OR 1"; 查询变成
我拥有一家公司,希望了解PHP的Runabout。当我招聘人员维护和扩展其网站的代码时,我正在加强SQL注入的安全性,不太了解这些代码如何影响SQL数据库,因为它们包含在查询的字符串中 如何显示安全漏洞,以便我自己看到发生了什么
mysql_query("SELECT * FROM users WHERE username = '$username'");
看看当我们将$username
变量设置为讨厌的值时会发生什么:
$username = "' OR 1";
查询变成:
SELECT * FROM users WHERE username = '' OR 1
攻击者可以使用不正确转义的变量将SQL注入到查询中,从而有效绕过您现有的任何(较差的)安全措施
更多信息虽然大部分信息可以在网上解释,但我觉得可以更详细地解释一下 如果您能够想象字符串将变成什么,那么您将了解您正在编写的脚本的潜在风险,因为它将在实际运行之前变成其他内容 一个微不足道的恶意示例:
$fromtheuser = "foo'; DROP TABLE affiliates; --";
$q = "SELECT id FROM affiliates WHERE website = '$fromtheuser'";
你能解释一下这会变成什么样子吗?开发者不能
"SELECT id FROM affiliates WHERE website = 'foo'; DROP TABLE affiliates; --'"
该向量的关键部分是”
结束SQL字符串原语,并-->
注释掉推送的引号
在编写的代码中,您需要的是在将数据放入查询之前对其进行适当的清理和过滤。帮助保护此前端的一个重要工具是某种形式的预处理查询,在这种情况下,您可以将参数绑定到查询,这样就没有什么可操作的了
我们可以通过MySQLi(改进版)或我个人最喜欢的PDO中的语句来实现这一点。他们的长相的简要描述
mysql\u real\u escape\u字符串(可以处理编码和引号)
还值得注意的是,有一些工具可以用来测试您的站点是否容易受到注入攻击
看看
危险来自这样一个事实,即SQL查询是一个程序
因此,可以插入恶意代码来代替某些操作员
由引号分隔的字符串。如果字符串中的分隔符没有被转义,它实际上将关闭字符串语句,其余将是恶意代码
不仅字符串是动态的。如果$amount包含恶意代码,则任何分隔符都不会保护限制$amount
,也不会保护按$ORDER排序
阅读此文,并带着任何特定问题返回。请在询问之前使用。在我看来,将params数组传递给PDO的execute()
方法比通过单独的函数调用绑定params要干净得多。(通过,chriso的示例更好)谢谢,这是一个有趣的东西!我会看一看,这可能是一个伟大的学习经验。
<?php
$clean = mysql_real_escape_string($q)
<?php
$clean = $mysqli->prepare("SELECT id FROM affiliates WHERE website = ?");
$clean->bind_param('s', $website); //'s' for 'string'
<?php
$clean = $pdo->prepare("SELECT id FROM affiliates WHERE website = ?");
$clean->bindParam(1, $website); //you can use :site rather than ? and 1