这个问题已经在这里有一个答案:
- 如何防止在PHP中SQL注入? 28个回答
我已经建立一个网站,将很快上线,只是有关于防止SQL注入,我知道如何使用几个问题mysqli_real_escape_string
,但我只是想知道如果我要使用上我得到了所有变量我的SQL语句,我必须使用它时,我做的select语句也或者只是在插入更新和删除? 还什么其他的安全,你会建议我实现之前,我把网站直播,在此先感谢您的帮助!
这个问题已经在这里有一个答案:
我已经建立一个网站,将很快上线,只是有关于防止SQL注入,我知道如何使用几个问题mysqli_real_escape_string
,但我只是想知道如果我要使用上我得到了所有变量我的SQL语句,我必须使用它时,我做的select语句也或者只是在插入更新和删除? 还什么其他的安全,你会建议我实现之前,我把网站直播,在此先感谢您的帮助!
任何查询可注入无论是读或写,持久或短暂的。 注射可以通过结束一个查询和运行的单独一个(可能与被执行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])");
总结:
它会在几秒钟内关闭,而只是为了让事情直
我知道如何使用mysqli_real_escape_string
恐怕你不是。
如果我要使用的所有变量。我得到我的SQL语句
当然不。
此功能必须使用格式化只有 SQL字符串
我一定要使用它时,我做的select语句也或者只是在插入更新和删除?
任何 SQL语句。 但同样,没有“使用mysqli_real_escape_string”,但完全正确地格式化你的文字
还什么其他安全你会推荐
关于SQL安全-你必须正确地格式化不仅字符串,但是任何形式的文字。 每个需要不同的一套格式规则