Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.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/MySQLi:如何防止插入时的SQL注入(代码部分工作)_Php_Mysql_Mysqli_Sql Injection_Sql Insert - Fatal编程技术网

PHP/MySQLi:如何防止插入时的SQL注入(代码部分工作)

PHP/MySQLi:如何防止插入时的SQL注入(代码部分工作),php,mysql,mysqli,sql-injection,sql-insert,Php,Mysql,Mysqli,Sql Injection,Sql Insert,我我想使用PHP在MySQL数据库中存储两个值(一个电子邮件和一个密码)。输入通过jQuery中的Ajax传递到PHP页面(通过网站上的onclick事件) 现在,我想保护这个PHP查询不受SQL注入的影响——我说的是一个标准网站,所以我不想做得太过分,但我认为一些标准保护不会太坏 下面是我之前所做的,只是为了确保一般程序能够正常工作。 然后,我尝试通过使用密码加密和语句来提高安全性,但我不确定我的方法是否正确+我不知道这是否需要以及如何应用于所选部分(我正在检查电子邮件是否已经存在) 我看过很

我想使用PHP在MySQL数据库中存储两个值(一个电子邮件和一个密码)。输入通过jQuery中的Ajax传递到PHP页面(通过网站上的onclick事件)

现在,我想保护这个PHP查询不受SQL注入的影响——我说的是一个标准网站,所以我不想做得太过分,但我认为一些标准保护不会太坏

下面是我之前所做的,只是为了确保一般程序能够正常工作。 然后,我尝试通过使用密码加密语句来提高安全性,但我不确定我的方法是否正确+我不知道这是否需要以及如何应用于所选部分(我正在检查电子邮件是否已经存在)

我看过很多关于这个话题的文章,但作为一个初学者,这正是我的问题。 有人能举个例子说明这里应该修改或添加什么,并提供一些简短的解释吗?如果可能的话,我想继续使用MySQLi

旧PHP:

$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset("utf8");
if($conn->connect_error){
    die("Connection failed: " . $conn->connect_error);
}
$email = $_POST["email"];
$pw = $_POST["pw"]; 

$sql = "SELECT email FROM Users WHERE email = '" . $email . "'";
$query = $conn->query($sql);
if(mysqli_num_rows($query) > 0){
    echo "Record already exists";
}else{
    $sql = "INSERT INTO Users (email, pw) VALUES ('" . $email . "', '" . $pw . "')";
    if($conn->query($sql)){
        echo "Update successful";
    }else{
        echo "Update failed";
    };
}
$conn->close();
$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset("utf8");
if($conn->connect_error){
    die("Connection failed: " . $conn->connect_error);
}
$email = $_POST["email"];
$pw = password_hash($_POST["pw"], PASSWORD_BCRYPT); 

$sql = "SELECT email FROM Users WHERE email = '" . $email . "'";
$query = $conn->query($sql);
if(mysqli_num_rows($query) > 0){
    echo "Record already exists";
}else{
    $sql = $conn->prepare("INSERT INTO Users (email, pw) VALUES ('" . $email . "', '" . $pw . "')");
    $sql->bind_param('s', $name);
    $sql->execute();
    $result = $sql->get_result();
    if($result){
        echo "Update successful";
    }else{
        echo "Update failed";
    };
}
$conn->close();
新PHP:

$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset("utf8");
if($conn->connect_error){
    die("Connection failed: " . $conn->connect_error);
}
$email = $_POST["email"];
$pw = $_POST["pw"]; 

$sql = "SELECT email FROM Users WHERE email = '" . $email . "'";
$query = $conn->query($sql);
if(mysqli_num_rows($query) > 0){
    echo "Record already exists";
}else{
    $sql = "INSERT INTO Users (email, pw) VALUES ('" . $email . "', '" . $pw . "')";
    if($conn->query($sql)){
        echo "Update successful";
    }else{
        echo "Update failed";
    };
}
$conn->close();
$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset("utf8");
if($conn->connect_error){
    die("Connection failed: " . $conn->connect_error);
}
$email = $_POST["email"];
$pw = password_hash($_POST["pw"], PASSWORD_BCRYPT); 

$sql = "SELECT email FROM Users WHERE email = '" . $email . "'";
$query = $conn->query($sql);
if(mysqli_num_rows($query) > 0){
    echo "Record already exists";
}else{
    $sql = $conn->prepare("INSERT INTO Users (email, pw) VALUES ('" . $email . "', '" . $pw . "')");
    $sql->bind_param('s', $name);
    $sql->execute();
    $result = $sql->get_result();
    if($result){
        echo "Update successful";
    }else{
        echo "Update failed";
    };
}
$conn->close();

在新的PHP代码片段中,您仍然容易受到注入的攻击。
您在插入零件中使用的是准备好的语句,但实际使用的准备工作并不正确

创建准备好的语句时,可以创建一个查询,在其中添加占位符而不是原始值:

$stmt = $conn->prepare("INSERT INTO Users (email, pw) VALUES (?, ?)");
问号是占位符,稍后使用
bind_param
方法替换:

$stmt->bind_param('ss', $email, $pw);
bind调用的
ss
部分告诉mysql db它传递给数据库的两个字符串(s表示
string
,i表示
int
等)。
您正在绑定一个参数(
$name
),但它在查询中没有占位符或任何类型的引用

另一方面,您的select语句仍然不安全,存在漏洞。
我可能会使用一个事先准备好的语句,就像插入部分一样

您总是希望确保来自用户的输入对于数据库来说是“安全的”,如果您输入一个查询字符串并向其中添加用户输入,那么数据库将不会转义这些字符串,而只是运行它


当您自己编写完整的查询时,仅使用标准的
query
方法调用,而不使用任何输入参数,尤其是用户没有传递任何输入参数

在新的PHP代码片段中,您仍然容易受到注入的攻击。
$query = $mysqli->prepare("INSERT INTO `table` (`col1`, `col2`) VALUES (?, ?)");
$col1 = 100;
$col2 = 14;
$query->bind_param('ii', $col1, $col2);
$query->execute();
$query->close();
您在插入零件中使用的是准备好的语句,但实际使用的准备工作并不正确

创建准备好的语句时,可以创建一个查询,在其中添加占位符而不是原始值:

$stmt = $conn->prepare("INSERT INTO Users (email, pw) VALUES (?, ?)");
问号是占位符,稍后使用
bind_param
方法替换:

$stmt->bind_param('ss', $email, $pw);
bind调用的
ss
部分告诉mysql db它传递给数据库的两个字符串(s表示
string
,i表示
int
等)。
您正在绑定一个参数(
$name
),但它在查询中没有占位符或任何类型的引用

另一方面,您的select语句仍然不安全,存在漏洞。
我可能会使用一个事先准备好的语句,就像插入部分一样

您总是希望确保来自用户的输入对于数据库来说是“安全的”,如果您输入一个查询字符串并向其中添加用户输入,那么数据库将不会转义这些字符串,而只是运行它


当您自己编写完整的查询时,仅使用标准的
query
方法调用,而不使用任何输入参数,尤其是用户没有传递任何输入参数

在新的PHP代码片段中,您仍然容易受到注入的攻击。
$query = $mysqli->prepare("INSERT INTO `table` (`col1`, `col2`) VALUES (?, ?)");
$col1 = 100;
$col2 = 14;
$query->bind_param('ii', $col1, $col2);
$query->execute();
$query->close();
您在插入零件中使用的是准备好的语句,但实际使用的准备工作并不正确

创建准备好的语句时,可以创建一个查询,在其中添加占位符而不是原始值:

$stmt = $conn->prepare("INSERT INTO Users (email, pw) VALUES (?, ?)");
问号是占位符,稍后使用
bind_param
方法替换:

$stmt->bind_param('ss', $email, $pw);
bind调用的
ss
部分告诉mysql db它传递给数据库的两个字符串(s表示
string
,i表示
int
等)。
您正在绑定一个参数(
$name
),但它在查询中没有占位符或任何类型的引用

另一方面,您的select语句仍然不安全,存在漏洞。
我可能会使用一个事先准备好的语句,就像插入部分一样

您总是希望确保来自用户的输入对于数据库来说是“安全的”,如果您输入一个查询字符串并向其中添加用户输入,那么数据库将不会转义这些字符串,而只是运行它


当您自己编写完整的查询时,仅使用标准的
query
方法调用,而不使用任何输入参数,尤其是用户没有传递任何输入参数

在新的PHP代码片段中,您仍然容易受到注入的攻击。
$query = $mysqli->prepare("INSERT INTO `table` (`col1`, `col2`) VALUES (?, ?)");
$col1 = 100;
$col2 = 14;
$query->bind_param('ii', $col1, $col2);
$query->execute();
$query->close();
您在插入零件中使用的是准备好的语句,但实际使用的准备工作并不正确

创建准备好的语句时,可以创建一个查询,在其中添加占位符而不是原始值:

$stmt = $conn->prepare("INSERT INTO Users (email, pw) VALUES (?, ?)");
问号是占位符,稍后使用
bind_param
方法替换:

$stmt->bind_param('ss', $email, $pw);
bind调用的
ss
部分告诉mysql db它传递给数据库的两个字符串(s表示
string
,i表示
int
等)。
您正在绑定一个参数(
$name
),但它在查询中没有占位符或任何类型的引用

另一方面,您的select语句仍然不安全,并且对v开放