除了性能问题,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中转换(项目的其他部分需要),所以为什么不在存储之前进行转换(以及数据库上的一些额外空间)
答案 0 :(得分:3)
由于base64_encode()函数的性质(使二进制数据在通过非8位干净的传输层传输时仍然存在),您不必逃避任何事情!
返回的字符是[0-9a-zA-Z /]
但我强烈建议你使用预备语句(使用mysqli或PDO)。稍微慢一些,但每次处理表结构时都不会更改清理逻辑。
而且,同样重要的是,未来您可能需要索引表中的数据(也许是使用LIKE或FULLSEARCH进行搜索)。
您的第二个示例是正确的(绑定所有参数)
答案 1 :(得分:2)
base64_encode函数不是为了转义字符串,即不保证特定的SQL方言不会将任何base64编码的字符视为分隔符;你应该总是依赖专用的逃生功能。 但是我们不知道任何将base64字符视为分隔符的SQL方言,所以无论如何它都是安全的。