在我之前的帖子PHP Looping through elements and adding to Database
之后我回到了绘图板,因为我对注射感到害怕,并希望得到一些建议。以下是"安全":
$stmt = $conn->prepare("INSERT INTO responses (skey, rtext) VALUES (?, ?)");
$stmt->bind_param("is", $skey, $rtext);
$skey = 1;
$rtext = mysqli_real_escape_string($conn,$_POST['Q1Answer']);
if(!$stmt->execute()){trigger_error("there was an error....".$con->error, E_USER_WARNING);}
$skey = 2;
$rtext = "Hello";
if(!$stmt->execute()){trigger_error("there was an error....".$con->error, E_USER_WARNING);}
$stmt->close();
$conn->close();
我还可以调用以下函数:
function SanitizeForSQL($str)
{
if( function_exists( "mysql_real_escape_string" ) )
{
$ret_str = mysql_real_escape_string( $str );
}
else
{
$ret_str = addslashes( $str );
}
return $ret_str;
}
以上任何一项都有助于预防注射吗?
答案 0 :(得分:2)
将变量绑定到占位符值时,您的工作就完成了。 mysqli
或PDO或您正在使用的任何数据库驱动程序负责从那时起安全地对其进行编码。
除此之外绝对不需要添加更多的消毒功能,其中许多功能弊大于利。最重要的是确保您永远不会在查询中放入未转义的数据,最安全的方法是对使用占位符值进行极为严格的处理。
如果你预先逃脱了事情,你将不得不在以后取消它们。当你将API添加到某个东西时,你假设的数据将在HTML中使用可能很好地出现在JSON文档中,所以现在必须在正确的JSON转义之前对其进行去HTML转义。这真是令人讨厌。
使数据库中的数据尽可能保持中立。也就是说,尽可能原始,你可以管理。例如,如果您正在使用Markdown,请将原始markdown保留在数据库中。如果您允许使用某些HTML标记,请输入用户放入的内容并稍后使用白名单进行清理。您可能希望将来更改您的规则以更轻松,如果您已经清除了该内容,它将永远消失。
答案 1 :(得分:-1)
我强烈推荐PDO。 PDO在使用之前评估任何代码,防止任何注入。
此外,您应该在任何输入上使用htmlentities();
。
使用htmlentities()
的示例:
$foo = htmlentities($_POST['foo']);
这将是任何可能的HTML注入。
答案 2 :(得分:-2)
您应该使用访问令牌。对于每个数据库访问,您应该为客户端定义访问令牌,而不会执行令牌查询。 您可以像这样定义您的函数:
foo(bar)