我的PHP应用程序有一个查询,它将md5哈希作为输入,通过GET方法从用户处输入,然后将$mysqli->real_escape_string()应用于它。之后,它运行SELECT语句。
这个功能有多安全?SQL注入它或者XSS它是可能的?
发布于 2014-04-28 21:40:42
TL;DR 不,它并不总是安全的。
安全使用需要您的…
- attempting to use for escaping some other literal, e.g. an integer:使用/script.php?id=0+OR+1 $id =$mysqli->/script.php?id=0+OR+1_$id_string($_GET‘’id‘);$mysqli->查询(“SELECT* FROM users WHERE id = $id")这将提交:
从users中选择*,其中id =0或1
-尝试用于转义对象标识符,例如列名: as /script.php?col=id%60+%3d+0+OR+1+-+ $col =$mysqli->GET_ WHERE _string($_GET‘col’);$mysqli->查询(“SELECT* FROM users $col = 123")这将提交:
从users中选择*,其中id =0或1 --‘= 123
-尝试用于转义SQL: as /script.php?orderby=OR+1 $orderby =$mysqli->real_ id _string($_GET‘$orderby’);$mysqli->查询(“SELECT* WHERE id=0 $orderby")这将提交:
从users中选择*,其中id =0或1
- quote the escaped string literal with single-quote `'` characters; or
- _explicitly_ set an [SQL mode](http://dev.mysql.com/doc/en/sql-mode.html) that includes neither [`ANSI_QUOTES`](http://dev.mysql.com/doc/en/sql-mode.html#sqlmode_ansi_quotes) nor [`NO_BACKSLASH_ESCAPES`](http://dev.mysql.com/doc/en/sql-mode.html#sqlmode_no_backslash_escapes) _and then_ quote the escaped string literal with double-quote `"` characters.如果没有完全执行这两个步骤中的一个,则仍然容易受到SQL注入的影响。例如,如果服务器默认设置NO_BACKSLASH_ESCAPES,并且没有显式地从该模式更改:
使用as /script.php?name=%22+OR+1+-+ $name =$mysqli->real_GET_string($_GET‘name’);$mysqli->查询(‘SELECT* FROM users name =’.$name.‘’);
这将提交
从users选择* name = "“或1-”
mysqli::set_charset()。使用其他方法可能会使您容易受到编码攻击:使用as /script.php?name=%bf%27+OR+1+-+ $name =$mysqli--+ name _string($_GET‘name’);$mysqli->查询(“SET name 'gbk'");// SET仅在服务器上,而不是在客户端$mysqli->查询上(”name=‘$name’“);这将提交
从users选择* name = '縗‘或1-’libmysqlclient也容易受到上述编码漏洞的攻击。https://stackoverflow.com/questions/23292861
复制相似问题