2013-10-04 85 views
1

这是我第一次参与这个伟大的网站,所以我希望能得到我的问题的第一个很好的答案。 我使用下面的代码将数据插入到MySQL数据库:PDO准备语句安全

if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form2")) 
{ 
$q = $conn->prepare("INSERT INTO client (name, address) VALUES (:name, :address)"); 
$q->bindValue(':name', htmlspecialchars($_POST['name']), PDO::PARAM_STR); 
$q->bindValue(':address', htmlspecialchars($_POST['address']), PDO::PARAM_STR); 
$q->execute(); 
} 

是插入是否足够安全? 我应该使用htmlspecialchars()插入或显示数据的时刻吗?

亲切的问候

+0

我总是对安全性保持谨慎,所以会剥夺输入。您直接从表单插入到数据库中,因此审核输入可能是一个好主意。 – dwjv

+0

@dwjv我很确定没有检查值isset()第一,你会得到一个通知错误。确保设定值并确保其值正确无误。 –

+1

请参阅http://stackoverflow.com/a/60496/760211,即PDO MySQL驱动程序的默认设置是__emulating prepared statement__。你可能想禁用''emulation''以获得更好的安全性。 – Kita

回答

3

是你的代码是安全的,但作为一个经验中性形式一般规则,存储数据。也就是说,不针对任何特定的输出或媒体进行编码。做途中编码出来不。

如果你反其道而行之,通过htmlspecialchars()存储(如你问题你的代码),那么你的数据是专门绑在HTML输出之前通过。如果您想在其他地方输出它(例如XML文档),其中htmlspecialchars()不适用,那么您必须先解码它。

+0

是的! 'htmlspecialchars'用于显示*格式,不用于存储编码。应在内容需要呈现时调用它。 – tadman

+0

非常感谢您的回复,但是您能否告诉我“中性形式”究竟意味着什么? 另外,你有什么建议?我怎样才能改变上面的代码? – Anibel

+0

通过中性形式我的意思只是在原始形式(没有'htmlspecialchars()')的任何处理)。我只是从代码中删除'htmlspecialchars()'调用,并保持原样。当您拉出数据并以HTML格式显示时,请不要忘记执行'htmlspecialchars()'调用。 – MrCode