php - 用于简单sql注入(inject)的Base64编码字符串

标签 php mysql base64 sql-injection

除了性能问题,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/

相关文章:

php - 我被困在 mysql 中的一个查询上

mysql - 在 HANA DB 之上转换 MySQL 模式?

ios - 在 IOS 中使用 AES 加密

php - 如何将字符串函数应用于表列?

如果 Div 不可见,用于更新数据库的 PHP/JQuery/AJAX

php - 为什么我不能在子域之间传递用户 session ?

php - 即使我重定向到另一个 URL,我也需要保持 PHP 进程在后台运行

amazon-ec2 - 无法对 AWS RDS 执行 mysqldump

iOS 将 base64 编码图像上传到 RESTful 服务器时获取 http 400

javascript - 如何在 react-dropzone 中将图像转换为 base64?