PHP的mysqli防止SQL注入[复制](PHP MySQLI Prevent SQL Injec

2019-09-01 08:58发布

这个问题已经在这里有一个答案:

  • 如何防止在PHP中SQL注入? 28个回答

我已经建立一个网站,将很快上线,只是有关于防止SQL注入,我知道如何使用几个问题mysqli_real_escape_string ,但我只是想知道如果我要使用上我得到了所有变量我的SQL语句,我必须使用它时,我做的select语句也或者只是在插入更新和删除? 还什么其他的安全,你会建议我实现之前,我把网站直播,在此先感谢您的帮助!

Answer 1:

任何查询可注入无论是读或写,持久或短暂的。 注射可以通过结束一个查询和运行的单独一个(可能与被执行mysqli ),这使得预定的查询不相关。

从外部源是否是从用户或甚至内部,应考虑的一个参数查询,在查询的上下文参数的任何输入到查询。 在查询中的任何参数需要进行参数设置。 这导致您可以创建一个准备好的声明,并与参数执行适当的参数化查询。 例如:

SELECT col1 FROM t1 WHERE col2 = ?

? 是一个参数的占位符。 使用mysqli ,你可以创建一个使用准备好的声明prepare ,使用绑定变量(参数)的参数bind_param ,并运行与查询execute 。 您不必在所有消毒参数(其实这是不利于这样做)。 mysqli这是否为您服务。 完整的过程是:

$stmt = mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();

还有一个参数化查询事先准备好的声明之间的一个重要区别。 这种说法,而准备的,是不是参数,因此容易注入:

$stmt = mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");

总结:

  • 所有查询应适当参数(除非他们有没有参数)
  • 所有参数的查询应被视为敌对尽可能不论其来源


Answer 2:

它会在几秒钟内关闭,而只是为了让事情直

我知道如何使用mysqli_real_escape_string

恐怕你不是。

如果我要使用的所有变量。我得到我的SQL语句

当然不。
此功能必须使用格式化只有 SQL字符串

我一定要使用它时,我做的select语句也或者只是在插入更新和删除?

任何 SQL语句。 但同样,没有“使用mysqli_real_escape_string”,但完全正确地格式化你的文字

还什么其他安全你会推荐

关于SQL安全-你必须正确地格式化不仅字符串,但是任何形式的文字。 每个需要不同的一套格式规则



文章来源: PHP MySQLI Prevent SQL Injection [duplicate]