Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.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 Injection - Fatal编程技术网

Php 我应该采取哪些步骤来防止SQL注入?

Php 我应该采取哪些步骤来防止SQL注入?,php,sql-injection,Php,Sql Injection,作为对一个消息的响应,有一个响应是我正在打开我的数据库以进行SQL注入。代码如下: <?php $firstname = stripslashes(strip_tags($_POST['firstname'])); $lastname = stripslashes(strip_tags($_POST['lastname'])); $email = stripslashes(strip_tags($_POST['email']))

作为对一个消息的响应,有一个响应是我正在打开我的数据库以进行SQL注入。代码如下:

    <?php


        $firstname = stripslashes(strip_tags($_POST['firstname']));

        $lastname = stripslashes(strip_tags($_POST['lastname']));
        $email = stripslashes(strip_tags($_POST['email']));
        $title = stripslashes(strip_tags($_POST['title']));
        $organization = stripslashes(strip_tags($_POST['organization']));


    $pdbHost = "localhost";
    $pdbUserName = "******";
    $pdbPassword = "******";
    $pdbName     = "db1080824_emails";



    //  Connect to mySQL
    $conlink = mysql_connect($pdbHost, $pdbUserName, $pdbPassword);
    if(!$conlink) {die('Unable to connect to '.$pdbHost);}
    if (!mysql_select_db($pdbName, $conlink)){die('Cannot find database '.$pdbName);}

    //SQL query

        $SQL2="INSERT INTO  `db1080824_emails`.`emails` (`record_id` ,`firstname`,`lastname`,`email`,`title`,`organization`)VALUES (NULL ,  '".$firstname."',  '".$lastname."',  '".$email."',  '".$title."',  '".$organization."')";

        mysql_query($SQL2);
    //  Connect to Closing the connection
    mysql_close($conlink);
?>

使用准备好的语句。认真地一种简单的方法是使用PHP的数据库包装器


使用事先准备好的陈述。认真地一种简单的方法是使用PHP的数据库包装器

用于防止SQL注入。只有这个功能就足够了

而且,正如@knittl所说,使用预先准备好的语句也是一种很好的预防方法。但是普通的mysql库不支持这一点。你需要一个像PDO或MySQLi这样的图书馆。我建议您切换到PDO或MySQLi,因为在更高的PHP版本中,mysql库将被弃用

改进代码的其他一些技巧:

  • 不要使用
    die()
    。如果你犯了一个错误,你不会死,那为什么要用电脑呢?最好妥善处理错误,并把它们放在你想要的地方
  • 不需要使用mysql\u close()
。PHP在执行结束时关闭每个连接
  • 对查询使用错误处理,如果查询返回false,则会出现问题。还要检查查询是否执行了某些操作

  • 我要回答关于这个答案的评论。您应该仅对字符串使用mysql\u real\u escape\ustrong>string。如果您使用的是
    mysql\u real\u escape\u string()
    请确保在查询中的字符串周围加上引号(
    ):

    $query = "SELECT foo FROM bar WHERE name = '".mysql_real_escape_string($_POST['name'])."'";
    
    如果使用整数或任何其他数字,则应使用而不是转义函数:

    $query = "SELECT foo FROM bar WHERE id = ".(int) $_POST['id'];
    
    用于防止SQL注入。只有这个功能就足够了

    而且,正如@knittl所说,使用预先准备好的语句也是一种很好的预防方法。但是普通的mysql库不支持这一点。你需要一个像PDO或MySQLi这样的图书馆。我建议您切换到PDO或MySQLi,因为在更高的PHP版本中,mysql库将被弃用

    改进代码的其他一些技巧:

    • 不要使用
      die()
      。如果你犯了一个错误,你不会死,那为什么要用电脑呢?最好妥善处理错误,并把它们放在你想要的地方
    • 不需要使用mysql\u close()。PHP在执行结束时关闭每个连接
    • 对查询使用错误处理,如果查询返回false,则会出现问题。还要检查查询是否执行了某些操作

    我要回答关于这个答案的评论。您应该仅对字符串使用mysql\u real\u escape\ustrong>string。如果您使用的是
    mysql\u real\u escape\u string()
    请确保在查询中的字符串周围加上引号(
    ):

    $query = "SELECT foo FROM bar WHERE name = '".mysql_real_escape_string($_POST['name'])."'";
    
    如果使用整数或任何其他数字,则应使用而不是转义函数:

    $query = "SELECT foo FROM bar WHERE id = ".(int) $_POST['id'];
    

    我一直在使用PDO,我相信这可以防止注射:

    $db_user = "****";
    $db_pass= "****";
    $dsn = "mysql:dbname=yourdatabasename; host=localhost";
    $dbh = new PDO($dsn, $db_user, $db_pass);
    
    $sql = 'INSERT INTO
            emails(firstname, lastname, email, title, organization)
            VALUES(:firstname,:lastname,:email,:title,:organization)';
    $data = array(':firstname'=>$firstname,
                  ':lastname'=>$lastname,
                  ':email'=>$email,
                  ':title'=>$title,
                  ':organization'=>$organization);
    
    $sth = $dbh->prepare($sql);
    $sth->execute($data);
    

    我一直在使用PDO,我相信这可以防止注射:

    $db_user = "****";
    $db_pass= "****";
    $dsn = "mysql:dbname=yourdatabasename; host=localhost";
    $dbh = new PDO($dsn, $db_user, $db_pass);
    
    $sql = 'INSERT INTO
            emails(firstname, lastname, email, title, organization)
            VALUES(:firstname,:lastname,:email,:title,:organization)';
    $data = array(':firstname'=>$firstname,
                  ':lastname'=>$lastname,
                  ':email'=>$email,
                  ':title'=>$title,
                  ':organization'=>$organization);
    
    $sth = $dbh->prepare($sql);
    $sth->execute($data);
    

    -阅读更多关于如何操作以及如何“撤销”仅使用事先准备好的语句的信息。第一步:停止使用mysql_查询,使用PDO或mysqli等现代API。这两种方法都支持预处理语句——如果使用得当,这将大大有助于防止SQL注入。但是,当信息来自表单时,如何使用预处理语句呢?与以前完全相同——阅读更多关于如何执行预处理语句以及如何“撤消”仅使用预处理语句的内容。第一步:停止使用mysql_查询,使用PDO或mysqli等现代API。这两种方法都支持预处理语句——如果使用得当,可以大大防止SQL注入。但是,当信息来自表单时,如何使用预处理语句呢?与以前完全相同,您可以使用mysql\u real\u escape\u string,但前提是您知道自己在做什么。i、 e.仅将其用于引号中的值(但对于每一个这样的值),在客户端(PHP)和服务器/连接端(mysql)上设置正确的编码。有太多的地方你可能错过一件小事,然后再次被拧上。这个功能不是为了防止任何注射。我已经用一些信息更新了我的答案@为什么这个函数不是为了防止SQL注入?从php.net:
    如果此函数不用于转义数据,则查询容易受到SQL注入攻击。
    您可以使用mysql\u real\u escape\u string,但前提是您知道自己在做什么。i、 e.仅将其用于引号中的值(但对于每一个这样的值),在客户端(PHP)和服务器/连接端(mysql)上设置正确的编码。有太多的地方你可能错过一件小事,然后再次被拧上。这个功能不是为了防止任何注射。我已经用一些信息更新了我的答案@为什么这个函数不是为了防止SQL注入?从php.net:
    如果此函数不用于转义数据,则查询容易受到SQL注入攻击。