避免PHP函数中的SQL注入

避免PHP函数中的SQL注入,php,mysql,sql,sql-injection,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')"; ... } 是的,在将变量插入查询之前,不会对其进行过滤,因此可能会在其中包含注入。有关如何防止注射的更多信息,请参阅 除此之外,您似乎正在尝试使用m

这段代码容易受到SQL注入的影响吗

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

    ...
}

是的,在将变量插入查询之前,不会对其进行过滤,因此可能会在其中包含注入。有关如何防止注射的更多信息,请参阅


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

是的,在插入查询之前,变量不会被过滤,因此可能会包含注入。有关如何防止注射的更多信息,请参阅


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

是的。您应该查看准备好的报表


编制报表的参数不需要引用;司机会自动处理这个问题。如果应用程序专门使用预先准备好的语句,开发人员可以确保不会发生SQL注入(但是,如果查询的其他部分是使用未经转换的输入构建的,则仍然可以进行SQL注入)。

是的。您应该查看准备好的报表


编制报表的参数不需要引用;司机会自动处理这个问题。如果应用程序专门使用预先准备好的语句,开发人员可以确保不会发生SQL注入(但是,如果查询的其他部分是使用未经转换的输入构建的,则仍然可以进行SQL注入)。

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

选中此项:


下面是关于如何使用pdo的链接:

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

选中此项:


下面是关于如何使用pdo的链接:

是的,该语句可用于SQL注入

此外,永远不要使用md5加密密码。改用bcrypt


请参见此处:

是的,该语句可用于SQL注入

此外,永远不要使用md5加密密码。改用bcrypt


请参见此处:

在将动态数据(例如变量)插入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.

当您将动态数据(例如变量)插入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.

如果要停止sql注入,最安全的方法是不使用sql。尽管如此,PDO是最好的选择,它具有预先准备好的语句。我将留下一个连接/插入脚本的示例。文件载于。此外,您应该使用bcrypt或password_散列(仅当您使用PHP5.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());
}
?>

如果要停止sql注入,最安全的方法是不使用sql。尽管如此,PDO是最好的选择,它具有预先准备好的语句。我将留下一个连接/插入脚本的示例。文件载于。此外,您应该使用bcrypt或password_散列(仅当您使用PHP5.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());
}
?>


这取决于变量
$usu
$pass
$name
的来源。我的猜测是,它们来自用户输入,这很容易受到影响。见简短回答:是的。稍长一点的回答:这取决于变量的来源。@MikeW你基本上是错的。@YourCommonSense并不是完全错的。如果变量在传递到函数之前被过滤,那么它应该是好的。@你的常识你是说这段代码不易受影响吗?如果是这样,我会说你完全错了。这取决于变量
$usu
$pass
$name
来自何处。我的猜测是,它们来自用户输入,这很容易受到影响。见简短回答:是的。稍长一点的回答:这取决于变量的来源。@MikeW你基本上是错的。@YourCommonSense并不是完全错的。如果变量在传递到函数之前被过滤,那么它应该是好的。@你的常识你是说这段代码不易受影响吗?如果是这样,我会说你完全错了。我看到有人对这个问题投了反对票。请解释你这样做的动机,告诉别人和我为什么这是错误的。我看到有人否决了这个问题。请解释您这样做的动机,以告知他人和我这是错误的。我认为OP希望关注注入部分而不是加密。我认为OP希望关注注入部分而不是加密。