除了性能问题,base64_encode() 是防止 SQL 注入(inject)的“好”做法吗?
当然不是针对所有字段(列),而是针对一个 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();
我们每天都要面对各种各样的黑客攻击和注入(inject)技术。
逻辑上 PDO 或 mysqli(使用准备好的语句)是安全的,但在我的例子中,输出(消息)无论如何都会在 base64 中转换(项目的其他部分需要)所以为什么不在存储之前转换(还有一些额外的数据库空间)
最佳答案
由于 base64_encode() 函数的性质(使二进制数据在通过非 8 位干净的传输层传输后仍然存在),您不必转义任何内容!
返回的字符是[0-9a-zA-Z/]
但我强烈建议您使用准备好的语句(使用 mysqli 或 PDO)。稍微慢一点,但您不会在每次处理表结构时都更改清理逻辑。
同样重要的是,将来您可能需要为表中的数据编制索引(可能用于使用 LIKE 或 FULLSEARCH 进行搜索)。
你的第二个例子是正确的(绑定(bind)你所有的参数)
关于php - 用于简单sql注入(inject)的Base64编码字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26791906/