除了性能问题外,base64_encode()是否是防止SQL注入的“好”做法?
当然不是适用于所有字段(列),仅适用于一个TEXT字段(例如:在联系表单中)。
我们知道,base64_encode()函数返回的字符是“安全”的,甚至不需要转义(如果我错了,请纠正我),但我想知道它在每种情况下是否都是“安全”的(字符集编码或类似情况)。
简单实用的例子:
$dbc = new mysqli( DBHOSTNAME, DBUSERNAME, DBPASSWORD );
$name = preg_replace( "#[^A-Za-z0-9@_]#", "", $_POST[ "name" ] );
$phone = preg_replace( "#[^0-9 +]#", "", $_POST[ "phone" ] );
/*
Assuming this function check and sanitize a valid email
*/
$email = is_email( $_POST[ "email" ] );
$dbc->query( "INSERT INTO `testdb`.`testtable`
( `name`, `email`,`phone`,`message` )
VALUES ( '$name', '$email', '$phone', '" . base64_encode( $_POST[ "message" ] ) . "' )" );
另一方面,预处理语句:
$dbc = new mysqli( DBHOSTNAME, DBUSERNAME, DBPASSWORD );
$name = preg_replace( "#[^A-Za-z0-9@_]#", "", $_POST[ "name" ] );
$phone = preg_replace( "#[^0-9 +]#", "", $_POST[ "phone" ] );
/*
Assuming this function check and sanitize a valid email
*/
$email = is_email( $_POST[ "email" ] );
$stmt = $dbc->prepare( " INSERT INTO `testdb`.`testtable`
( `name`, `email `phone`, `message` )
VALUES( '$name', '$email', '$phone', ? ) " );
$stmt->bind_param( 's', $_POST[ "message" ] );
$stmt->execute();
我们每天都需要处理各种不同类型的黑客攻击和注入技术。
从逻辑上讲,PDO或mysqli(使用预处理语句)是安全的。但在我的情况下,输出(消息)会被转换成base64格式(项目的其他部分要求这样做),所以为什么不在存储之前进行转换呢?(数据库需要一些额外的空间)