Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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注入的安全性-PDO、mysqli_Php_Mysql_Sql_Pdo_Sql Injection - Fatal编程技术网

Php 针对SQL注入的安全性-PDO、mysqli

Php 针对SQL注入的安全性-PDO、mysqli,php,mysql,sql,pdo,sql-injection,Php,Mysql,Sql,Pdo,Sql Injection,可能重复: 我刚刚发现我的网站是不可攻击的 因为它连接到数据库,并且具有诸如:注册、更改密码、通知等功能。。。而且它是完全脆弱的 为了使代码变得安全,我应该在代码中寻找什么 我的意思是,我做了一些研究,到处都有人谈论安全问题 “使用PDO。” “使用mysql\u real\u escape\u字符串。” “使用添加斜杠。” 我到底应该寻找什么?? "$_POST" and "$_GET" variables?? "$_SESSION" variables? $sql = "select *

可能重复:

我刚刚发现我的网站是不可攻击的

因为它连接到数据库,并且具有诸如:注册、更改密码、通知等功能。。。而且它是完全脆弱的

为了使代码变得安全,我应该在代码中寻找什么

我的意思是,我做了一些研究,到处都有人谈论安全问题

“使用PDO。”

“使用mysql\u real\u escape\u字符串。”

“使用添加斜杠。”

我到底应该寻找什么??

"$_POST" and "$_GET" variables??
"$_SESSION" variables?
$sql = "select * from user";
$sql = "update user set user="new_user_name";
$sql = "insert into user (user) values ('userid')";
SQL查询?

"$_POST" and "$_GET" variables??
"$_SESSION" variables?
$sql = "select * from user";
$sql = "update user set user="new_user_name";
$sql = "insert into user (user) values ('userid')";
在每种情况下我应该怎么做? 请帮我知道我必须去哪里,去什么地方

谢谢。

您应该查找的内容:从客户端/用户发送的任何数据。清理/转义此数据

可以清理查询(使用)并支持多个SQL系统


对于MySQL,使用。是在使用MySQL时用于清理数据的函数。

以下是创建安全php应用程序时需要考虑的要点

  • 使用PDO或mysqli
  • 不要相信任何输入。考虑每一个变量,比如$POST、$YET、$$KOKIE、$YY会话、$Y服务器,好像它们被污染了一样。对这些变量使用适当的过滤措施
  • 为了避免XSS攻击,请使用php的内置函数htmlentities, 在将用户输入数据插入 数据库
  • 在PHP.INI中禁用Register Globals
  • 在PHP.INI中禁用“allow_url_fopen”
  • 不允许用户输入超过要求的数据。验证输入到 允许最大字符数。还要验证每个字段的有效性 相关数据类型
  • 在开发期后禁用错误报告。它可能会 对黑客有用的数据库信息
  • 在发布表单时使用一次性令牌。如果令牌存在并匹配 表单post有效,否则无效
  • 使用参数化数据库查询
  • 使用存储过程
  • 你可以在谷歌上搜索每一点以了解更多细节。
    希望这有帮助

    您提供的SQL查询实际上都不易受SQL注入的攻击

    SQL注入漏洞的发生是因为SQL输入未正确转义

    例如:

    $sql = "select * from users where user_id ="  . $_GET['user_id'];
    
    考虑我是否通过了以下考试:

    http://some_server.com/some_page.php?user_id=123%20or%201=1
    
    执行时的查询将最终为:

    select * from users where user_id = 123 or 1=1
    
    要解决此问题,请使用参数化查询:

    $query = "select * from users where user_id = ?"
    
    将用户id值绑定到查询时,数据访问层将正确转义输入字符串,并执行以下操作:

    select * from users where user_id = '123 or 1=1' which would not return any rows, preventing the injection
    
    如果使用PHP和mysql扩展:

    $sql = "select * from users where user_id = '" . mysql_real_escape_string($_GET['user_id']) . "'";
    
    请记住,您需要转义进入SQL查询的所有输入:

    $sql = "select id_column from some_table where id = 1";
    $stmt = mysqli_query($conn, $sql);
    if($stmt === false) die(mysqli_error($conn) . "\n");
    while($row = mysqli_fetch_assoc($conn, $stmt) {
        $sql = "update some_other_table set some_value = 'new value' where some_column = '" . mysqli_real_escape_string($conn, $row['id_column']) . "'";
        ....
    }
    
    这是因为从数据库中选择的值可能包含在SQL语句中执行不安全的字符,如名称“O'Hara”或示例。 }

    我一直在使用

    在您的案例中,有一个例子:

    <?php
       $stmt = $dbh->prepare("insert into user (user) values (?)");
       $stmt->bindParam(1, $name);
       $name = 'ValueHere';
       $stmt->execute();
    ?>
    
    
    
    在保护自己之前,您需要知道原因。尝试(愚蠢的名字,严肃的话题)-1,建议PDO以某种方式自动清理查询。。。我应该说“PDO可以清理数据库查询”。编辑了我的答案。谢谢你提到@Vatev!您的意思是“PDO自动转义参数字符串(但仅转义参数,如果将它们连接到查询字符串中则不会转义)”#2不应为“不信任任何输入”,句号为。完全可以在没有任何“用户”数据的情况下注入自己。@MarcB,你就在那里,伙计:)你为什么不提到
    mysqli\u real\u escape\u string
    或提供任何东西的链接?@ShaquinTrifonoff,我认为第二点解释了这一点。当然
    mysqli\u real\u escape\u string
    将是“适当的过滤措施”。:-)为了简单起见,我使用了mysql()扩展。同样适用于PDO或mysqli扩展。如果使用PDO,那么请确保您使用的是准备好的语句。MySQLi可以使用预先准备好的语句或MySQLi::real\u escape\u string。在您的示例中,为什么不使用
    MySQLi
    ?从搜索中找到这个的人可能会复制并粘贴代码。我喜欢mysql扩展。我所有的代码仍然使用它,所以我自然地使用它。在PHP mysql的最新版本中,mysqli和PDO都使用mysqlnd驱动程序,因此实际上不同的扩展之间没有区别。不鼓励使用
    mysqli.*
    函数。见和。请使用MySQLi。如果要使用mysqli,请使用mysqli。仅仅因为mysql扩展是“不推荐的”(即不推荐的),并不意味着它不能作为一个简单的例子工作。如果您想更改扩展名,请随意编辑我的答案。