Mic*_*rdt 20 php security sql-injection
为什么我们需要特定于数据库的函数,如mysql_real_escape_string()?它能做什么,addslashes()不是吗?
暂时忽略参数化查询的优越替代方案,是一个使用addslashes()的webapp,它仍然容易受到SQL注入的攻击,如果是,如何?
Óla*_*age 19
它添加了斜杠:
\x00, \n, \r, \, ', " and \x1a. characters.
Run Code Online (Sandbox Code Playgroud)
addslashes只添加斜杠
' \ and NUL
Run Code Online (Sandbox Code Playgroud)
伊利亚斯的文章也非常详细地介绍了它的功能
Chr*_* KL 19
在处理多字节编码字符串时,Addslashes通常不够好.
gs苛刻的低调回答实际上是对的.
标准SQL使用加倍来逃避文字撇号.MySQL的非标准反斜杠用于转义是默认设置,但它可以被禁用,通常是,特别是在sql_mode ANSI中.
在这种情况下,只有doubled语法才能工作,并且您使用addslashes(或其他ad-hoc转义方法)的任何应用程序都将中断.mysql_real_escape_string将使用最适合连接的sql_mode的转义方法.
如果您仍在使用那些重复使用较低128个字符的令人讨厌的东亚编码,那么多字节编码问题也很重要,但实际上您想要使用UTF-8.另一方面,由于MySQL可以完全愉快地处理声明中的原始换行符,因此无需担心.
mysql_real_escape_string 的作用远不止于此addslashes。
addslashes 在纯 ascii 上运行,无需了解任何有关数据库的信息。它逃脱了:
\n\n\'\xe2\x86\x92\\\'"\xe2\x86\x92\\"\\\xe2\x86\x92\\\\0\xe2\x86\x92 \\0。mysql_real_escape_string的目的是“创建一个可以在 SQL 语句中使用的合法 SQL 字符串”。mysql_real_escape_string 考虑连接的当前字符集(这就是为什么您必须始终传递有效的 $mysql 对象)。
\n\n它执行以下操作(摘自 MySQL C API 文档):
\n\n\\、\'、"、 ASCII 0、\\n、\\r、 和Control+Z以不会引起问题的方式0字节终止字符串(在 C api 中)我真的不知道 PHP 如何在内部存储字符串,但重点是当您使用mysql_real_escape_string. 我想主要的区别是mysql_real_escape_string 考虑连接的字符集,而addslashes不能(它甚至不知道您连接到哪个数据库)。
| 归档时间: |
|
| 查看次数: |
12328 次 |
| 最近记录: |