Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL注入在概念上是如何工作的?(简介)_Php_Sql_Security_Scripting - Fatal编程技术网

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