2012-05-18 64 views
3

我一直在使用base64_encode<textarea>窗体保存html并将数据存储在数据库中。检索时使用base64_decode并将数据放入文本区。如果不使用mysql_real_escape_string(),安全吗?使用base64_encode而不是mysql_real_escape_string安全吗?

我在使用mysql_real_escape_string时,检索模板id$_GET参数。

templates.php?id=4

但是使用Base64保存HTML还保留任何恶意SQL代码人们可能会在textarea的补充。到目前为止,我没有遇到任何问题。

这是不好的做法,使用base64而不是mysql_real_escape_string()

“错误的工具”?

注:我使用htmlspecialchars($text, ENT_QUOTES);为xss。

+2

请不要使用古老的'mysql_ *'函数编写新代码。他们不再被维护,社区已经开始[弃用流程](http://news.php.net/php.internals/53799)。相反,您应该了解准备好的语句并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/mysqli)。如果你关心学习,[这里是一个很好的PDO相关教程](http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers)。 –

+1

你真的想要在你的数据库中存储base64 blob吗?它不仅浪费空间,还会阻止您对数据库中的数据执行任何操作。 – deceze

+0

@deceze没关系。我不会在存储的html上运行查询,但是其他部分是我逃过mysql的。 – Kyle

回答

3

技术上base64_encode将永远不会输出任何可用于SQL注入的东西。就目前而言,这是安全的。

不过,我想使它成为一个习惯,总是SQL逃生任何查询中使用任何参数或总是使用参数化查询来开始(实际上,顺应时代!)。它更简单,它很直接,当你改变你的代码时,它不会让你后来遇到问题。

+0

虽然,如果你透过文本/ html透明地像OP一样,你必须注意xss漏洞。 – nos

2

是的,base64字符串可安全地在数据库中使用。但它有一些缺点。

  • 每次进入/存在数据库时,都需要对字符串进行编码和解码,而当您转义/准备数据库时,您只需要执行一次。
  • 你在浪费空间。 base64字符串比原始字符串大33%左右。

最好的选择是转移到更新的MySQL驱动程序(如mysqliPDO),并使用预准备语句。如果无论出于何种原因都无法实现,请坚持使用mysql_real_escape_string

相关问题