繁体   English   中英

避免在PHP函数中进行SQL注入

[英]Avoiding SQL injection in PHP function

此代码容易受到SQL注入的攻击吗?

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

    ...
}

如果要停止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());
}
?>

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

检查一下: PHP PDO的准备好的语句如何防止sql注入? 使用PDO的其他好处是什么? 使用PDO是否会降低效率?

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

你将dymamic数据(例如变量)到一个SQL查询的任何时间,查询变得注射。 即使这些变量不是来自系统“外部”。 您可以尝试自己注射。 例如

$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.

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

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

是的。 您应该查看准备好的语句
http://www.php.net/pdo.prepared-statements
准备好的语句的参数不需要用引号引起来。 驱动程序会自动处理。 如果应用程序仅使用准备好的语句,则开发人员可以确保不会发生SQL注入 (但是,如果使用未转义的输入来构建查询的其他部分,则仍然可以进行SQL注入)。

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

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

请参阅此处: 如何使用bcrypt在PHP中对密码进行哈希处理?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM