用于简单sql注入的Base64编码字符串

时间:2014-11-07 00:17:05

标签: php mysql base64 sql-injection

除了性能问题,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中转换(项目的其他部分需要),所以为什么不在存储之前进行转换(以及数据库上的一些额外空间)

2 个答案:

答案 0 :(得分:3)

由于base64_encode()函数的性质(使二进制数据在通过非8位干净的传输层传输时仍然存在),您不必逃避任何事情!

返回的字符是[0-9a-zA-Z /]

但我强烈建议你使用预备语句(使用mysqli或PDO)。稍微慢一些,但每次处理表结构时都不会更改清理逻辑

而且,同样重要的是,未来您可能需要索引表中的数据(也许是使用LIKE或FULLSEARCH进行搜索)。

您的第二个示例是正确的(绑定所有参数)

答案 1 :(得分:2)

base64_encode函数不是为了转义字符串,即不保证特定的SQL方言不会将任何base64编码的字符视为分隔符;你应该总是依赖专用的逃生功能。 但是我们不知道任何将base64字符视为分隔符的SQL方言,所以无论如何它都是安全的。