在PHP函数中避免SQL注入

时间:2014-03-21 20:35:27

标签: php mysql sql sql-injection

此代码是否容易受到SQL注入?

function SaveUser($usu,$pass,$name){
    $sql="insert into usuarios(USU,PASS,NOMBRE,ESTADO)
    values('$usu',md5('$pass'),'$name','$apellido2','A')";

    ...
}

6 个答案:

答案 0 :(得分:2)

如果要停止sql注入,最安全的方法是不使用sql。虽然,PDO是最好的选项准备好的陈述。我将留下一个连接/插入脚本的示例。文档位于http://php.net/pdo。此外,您应该使用bcrypt或password_hash(仅当您使用的是PHP 5.5时)才能使用散列密码。 MD5不安全。

<?php
$connect = new PDO("mysql:host=localhost;dbname=db", "username", "password");
$connect->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
$query = $connect->prepare("insert into usuarios(USU,PASS,NOMBRE,ESTADO)
values(?, ?, ?, ?)");
$query->bindValue(1, $usu);
$query->bindValue(2, md5('$pass'));
$query->bindValue(3, $name);
$query->bindValue(4, $apellido2);
try {
     $query->execute();
} catch (PDOException $e) {
     die($e->getMessage());
}
?>

答案 1 :(得分:1)

是的,如果你想停止sql注入,请使用pdo。在插入数据库之前,输入数据的清理非常重要。

检查一下:     How does PHP PDO's prepared statements prevent sql injection? What are other benefits of using PDO? Does using PDO reduce efficiency?

以下是有关如何使用pdo的链接:http://www.php.net/manual/en/book.pdo.php

答案 2 :(得分:1)

ANY 将dymamic数据(例如变量)插入SQL查询的时间,查询变为可注入。即使这些变量不是来自“外部”系统。你可以自己注射自己。 e.g。

$name = "Miles O'Brien";
$sql = "SELECT * FROM users WHERE name='$name'";

看起来完全无辜。没有恶意用户提交的“外部”数据。它纯粹是您编写的代码+数据,但' - 名称中的引用现在已经破坏了您的陈述并导致了注入攻击。攻击失败,因为它实际上并不是真正的攻击,但它仍然引入了SQL语法错误:

SELECT * FROM users WHERE name='Miles O'Brien';
                               ^^^^^^^^^---- string
                                        ^^^^^^--dangling unknown field/keyword.

答案 3 :(得分:0)

是的,在插入查询之前不会过滤变量,从而可以在那里包含注入。有关如何预防注射的更多信息,请参见How can I prevent SQL injection in PHP?

除此之外,您似乎正在尝试使用md5作为密码加密。我建议查看散列密码的其他方法,因为md5不符合安全标准。

答案 4 :(得分:0)

是的。你应该看一下准备好的陈述 http://www.php.net/pdo.prepared-statements
准备好的陈述的参数不需要引用;驱动程序自动处理这个。如果应用程序专门使用预准备语句,开发人员可以确定不会发生SQL注入(但是,如果使用非转义输入构建查询的其他部分,仍然可以进行SQL注入)。

答案 5 :(得分:0)

是的,该语句易受SQL注入攻击。

此外,您绝不应该使用md5来加密密码。改为使用bcrypt

见这里:How do you use bcrypt for hashing passwords in PHP?