如果与prepare语句一起使用,没有输入验证的PHP联系表单是否安全



我的网站上有一个联系我们的表格,我尽量不限制用户使用的字符,因为我们希望支持多语言名称。我们只检查姓名/电子邮件等的长度和结构。

我知道如果将变量直接插入到查询语句中可能会很危险,但我使用的是准备好的语句,如下所示。

$stmt = $conn->prepare("INSERT INTO contact_us_form (id,available_id,user_id,foreName,surName,mail,message) VALUES (?,?,?,?,?,?,?)");
$stmt->bind_param("iiissss",$num,$availableID,$userID,$foreName,$surName,$mail,$message);    
$stmt->execute();
$stmt->close();
$conn->close();

这是在我的mysql数据库中保存原始数据的正确方法吗?我也会给自己发一封电子邮件,但在这样做之前,我会转义特殊字符。[UTF-8]

使用准备好的语句可以很好地抵御SQL注入攻击。然而,这还不足以抵御其他类型的攻击。如何使用这些数据?

如果此消息显示在网页中(例如,显示给将要阅读该消息的人(,则需要使用HTML实体对其进行转义。

如果此邮件是作为电子邮件发送的,则需要从电子邮件地址、名称和其他放入电子邮件标题的字段中删除对电子邮件标题不安全的换行符等字符。

基本上,任何时候在任何地方使用这些数据,都需要确保它被视为用户提交的、不受信任的数据。它总是需要以适合其插入的特定上下文的方式进行转义或消毒。

输入验证实际上与安全性无关,但它可以被视为深度防御。输入验证还可以防止其他滥用媒介。例如,有人可能会向你的联系人表单提交1GB的数据。这是你的应用程序所期望的并且可以处理的吗?您的数据库列能够存储这么多数据吗?如果不验证输入,应用程序可能会崩溃。拒绝无效输入。

如果使用正确,准备好的语句将阻止SQL注入。你不需要";消毒";或者对数据做任何类似的事情。没有";特殊字符";使用准备好的语句时。您的数据库也没有将任何字符定义为特殊字符;它会保存你给它的任何东西。但你必须确保你把数据保存在正确的字符集中,并告诉mysqli连接那个字符集是什么。

当然,在HTML中显示数据时,请确保正确格式化数据,这样数据就不会破坏HTML结构。为此使用htmlspecialchars()

最新更新