我目前正在为我的应用程序设置php脚本,我对如何获得安全级别以防止注入sql server感到无能为力。
有一些脚本可以从应用程序接收输入,而不是直接从用户接收输入,例如内容浏览和内容分级,尽管它最终是输入。
接收用户直接输入为“name
”和“creator name
”的脚本是:
$utc_str = gmdate("M d Y H:i:s", time());
$TIMESTAMP = strtotime($utc_str);
$DATA = $_POST['DATA'];
$NAME = $_POST['NAME'];
$CREATOR = $_POST['CREATOR'];
if(strlen($NAME) > 15 || strlen($CREATOR) > 15) exit("Error 2");
$stmt = $connect->prepare("INSERT INTO `ugcl` (`DATA`,`NAME`,`CREATOR`,`CREATEDSTAMP`)
VALUES (?, ?, ?, ". $TIMESTAMP .")");
$stmt->bind_param("sss", $DATA, $NAME, $CREATOR);
if($stmt->execute())
{
echo "Successs";
}
else
{
echo "Error";
}
我应该在接收输入的所有脚本中使用bind params吗? 还有其他推荐的东西吗?
答案 0 :(得分:1)
是的,每当进行输入或输出时,你都应该在php中使用 PREPARED STATEMENTS 。
始终绑定参数,以便服务器始终知道所期望的数据类型。这将确保您为应用程序增加安全性。您输入的所有内容都应在原始语句中用作?
,并使用适当的数据类型绑定变量。
您直接进入我不会亲自推荐的$TIMESTAMP
。通过bind_param
运行它不会花费太多精力。
此外,一旦查询语句完成,请始终使用$stmt->close()
和$conn->close()
关闭您的连接。如果页面中有多个查询,请在查询开头启动连接,并在完成所有查询后结束查询。
另外,关于安全性的另一个注意事项 - 始终首先验证和清理用户输入。绝不信任用户数据。永远不要让它们有效。
编辑:还要考虑使用 PDO 进行数据库交互。