Php Can';如果记录包含撇号,则不要将记录添加到MySQL

Php Can';如果记录包含撇号,则不要将记录添加到MySQL,php,mysql,Php,Mysql,更新版本 <?php $link = mysqli_connect("localhost", "root", "root", "metadata"); mysqli_set_charset($link, "utf8"); // Check connection if($link === false){ die("ERROR: Could not connect. " . mysqli_connect_error()); } // my form located in index.ph

更新版本

<?php
$link = mysqli_connect("localhost", "root", "root", "metadata");
mysqli_set_charset($link, "utf8");
// Check connection
if($link === false){
  die("ERROR: Could not connect. " . mysqli_connect_error());
}

// my form located in index.php posts the data here.

$add_movie_original_name = $_POST['movie_original_name'];
$add_movie_tr_name = $_POST['movie_tr_name'];
$add_movie_year = $_POST['movie_year'];

$sql = "INSERT INTO movie(movie_original_name,movie_tr_name,movie_year) VALUES('$add_movie_original_name','$add_movie_tr_name','$add_movie_year')";

if(mysqli_query($link, $sql)){
  echo "Records added successfully.";
} else{
  echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
}

// close connection
mysqli_close($link);
?>

您需要准备您的语句,这样您就不会受到攻击。要做到这一点,您应该使用。您当前的代码看起来像是一个准备好的语句

$mysqli = new Mysqli("localhost", "root", "root", "metadata");
$statement = $mysqli->prepare("INSERT INTO movie(movie_original_name,movie_tr_name,movie_year) VALUES('?','?','?')");
$statement->bind_param('sss', $add_movie_original_name, $add_movie_tr_name, add_movie_year);
$statement->execute();
注意,在实际的SQL中,我将变量替换为?,这让我们稍后对它们进行绑定。在我的bind_param方法中,第一个参数是要绑定多少个变量,以及它们是什么数据类型。每个变量有一个字符,它们都是字符串,所以字符是“s”。如果要绑定整数和字符串,可以使用

$statement->bind_param('sis', $string1, $int1, $string2);
注意“sis”的顺序如何匹配传递给它的内容的顺序,然后是string,然后是integer,然后是string。根据,您可以传入四种不同的类型,每种类型都有自己的字符

  • s代表字符串
  • i表示整数
  • 双d
  • b代表水滴
这是对绑定参数的简短解释。您遇到的问题来自这样一个事实,即您的变量没有被转义或绑定,从而使它们可以被注入。这将解决您的问题,并使您的代码更加安全


注意:正如@bcintegrity所指出的,这并不是安全性的全部目的。您需要在回显用户输入的数据时考虑使用,以便停止不修补可能非常危险的操作。

您需要准备语句,以免受到攻击。要做到这一点,您应该使用。您当前的代码看起来像是一个准备好的语句

$mysqli = new Mysqli("localhost", "root", "root", "metadata");
$statement = $mysqli->prepare("INSERT INTO movie(movie_original_name,movie_tr_name,movie_year) VALUES('?','?','?')");
$statement->bind_param('sss', $add_movie_original_name, $add_movie_tr_name, add_movie_year);
$statement->execute();
注意,在实际的SQL中,我将变量替换为?,这让我们稍后对它们进行绑定。在我的bind_param方法中,第一个参数是要绑定多少个变量,以及它们是什么数据类型。每个变量有一个字符,它们都是字符串,所以字符是“s”。如果要绑定整数和字符串,可以使用

$statement->bind_param('sis', $string1, $int1, $string2);
注意“sis”的顺序如何匹配传递给它的内容的顺序,然后是string,然后是integer,然后是string。根据,您可以传入四种不同的类型,每种类型都有自己的字符

  • s代表字符串
  • i表示整数
  • 双d
  • b代表水滴
这是对绑定参数的简短解释。您遇到的问题来自这样一个事实,即您的变量没有被转义或绑定,从而使它们可以被注入。这将解决您的问题,并使您的代码更加安全


注意:正如@bcintegrity所指出的,这并不是安全性的全部目的。您需要在回显用户输入的数据时考虑使用,以便停止不修补可能非常危险的操作。

您需要准备语句,以免受到攻击。要做到这一点,您应该使用。您当前的代码看起来像是一个准备好的语句

$mysqli = new Mysqli("localhost", "root", "root", "metadata");
$statement = $mysqli->prepare("INSERT INTO movie(movie_original_name,movie_tr_name,movie_year) VALUES('?','?','?')");
$statement->bind_param('sss', $add_movie_original_name, $add_movie_tr_name, add_movie_year);
$statement->execute();
注意,在实际的SQL中,我将变量替换为?,这让我们稍后对它们进行绑定。在我的bind_param方法中,第一个参数是要绑定多少个变量,以及它们是什么数据类型。每个变量有一个字符,它们都是字符串,所以字符是“s”。如果要绑定整数和字符串,可以使用

$statement->bind_param('sis', $string1, $int1, $string2);
注意“sis”的顺序如何匹配传递给它的内容的顺序,然后是string,然后是integer,然后是string。根据,您可以传入四种不同的类型,每种类型都有自己的字符

  • s代表字符串
  • i表示整数
  • 双d
  • b代表水滴
这是对绑定参数的简短解释。您遇到的问题来自这样一个事实,即您的变量没有被转义或绑定,从而使它们可以被注入。这将解决您的问题,并使您的代码更加安全


注意:正如@bcintegrity所指出的,这并不是安全性的全部目的。您需要在回显用户输入的数据时考虑使用,以便停止不修补可能非常危险的操作。

您需要准备语句,以免受到攻击。要做到这一点,您应该使用。您当前的代码看起来像是一个准备好的语句

$mysqli = new Mysqli("localhost", "root", "root", "metadata");
$statement = $mysqli->prepare("INSERT INTO movie(movie_original_name,movie_tr_name,movie_year) VALUES('?','?','?')");
$statement->bind_param('sss', $add_movie_original_name, $add_movie_tr_name, add_movie_year);
$statement->execute();
注意,在实际的SQL中,我将变量替换为?,这让我们稍后对它们进行绑定。在我的bind_param方法中,第一个参数是要绑定多少个变量,以及它们是什么数据类型。每个变量有一个字符,它们都是字符串,所以字符是“s”。如果要绑定整数和字符串,可以使用

$statement->bind_param('sis', $string1, $int1, $string2);
注意“sis”的顺序如何匹配传递给它的内容的顺序,然后是string,然后是integer,然后是string。根据,您可以传入四种不同的类型,每种类型都有自己的字符

  • s代表字符串
  • i表示整数
  • 双d
  • b代表水滴
这是对绑定参数的简短解释。您遇到的问题来自这样一个事实,即您的变量没有被转义或绑定,从而使它们可以被注入。这将解决您的问题,并使您的代码更加安全


注意:正如@bcintegrity所指出的,这并不是安全性的全部目的。在回显用户输入的数据时,您需要考虑使用,以便停止不修补可能非常危险的操作。

优先使用准备好的语句。准备好的语句只是将查询与值分开发送,因此db知道这些值不会作为代码运行。准备好的语句自动转义值:)

以下是一个例子:

$sqli = @mysqli_connect("localhost", "root", "root","metadata");
if (!$sqli) {die("Can not connect to the database: " . mysqli_connect_error());}

$result = "INSERT INTO `movie`(movie_original_name,movie_tr_name,movie_year) VALUES (?,?,?)";
$stmt = mysqli_prepare($sqli, $result);
mysqli_stmt_bind_param($stmt,"sss",$_POST['movie_original_name'],$_POST['movie_tr_name'],$_POST['movie_year']);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
如果在页面上回显值以防止XSS,请确保使用htmlspecialchars()

$original_name_onscreen = htmlspecialchars($_POST['movie_original_name']);
$tr_name_onscreen = htmlspecialchars($_POST['movie_tr_name']);
$year_onscreen = htmlspecialchars($_POST['movie_year']);
注:@Gareth Parker的示例是面向对象的