我的PHP应用程序有一个查询,它将md5哈希作为输入,通过GET方法从用户处输入,然后将$mysqli->real_escape_string()应用于它。之后,它运行SELECT语句。
这个功能有多安全?SQL注入它或者XSS它是可能的?
发布于 2014-04-25 12:18:05
这里很安全。如果你觉得不安全,它只有字符和整数,你可以很容易地测试它是一个md5字符串(见下面的例子)。但同样,
另一种选择是准备好的陈述。它们比较复杂,但很安全:
$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)");
$stmt->bind_param("s", 'a1b2c3'); // s stands for String, i would be Integer
$stmt->execute();这是一个非常简单的例子,代码块上方的url解释了更多。请记住,准备好的语句有开销!每次查询执行1次额外操作将减慢速度。
小示例,以检查字符串是否可以是md5散列
function isMd5($string){
/// md5 strings are 32chars* long. Simple test, do that first:
if( strlen($string)!==32){ return false; }
// It only has chars (A-F) and integers, if any other character->not md5
elseif( preg_match("^[0-9a-f]", $string) ){ return false; }
// No errors, return true:
return true;
}
// *rawmode ha 16 chars, but when you work with that, you'll know 这不是一个非常有用的功能,因为它不会真的安全很多,这只是为了向您展示如何验证信息。您可以阅读文档以查看结果,并进行检查以测试其是否与可能的结果匹配。
发布于 2014-04-25 12:21:17
这是安全的。但是如果您想要更安全,而不能使用预先准备好的语句,这是使用任何等式(而不仅仅是MD5:http://php.net/manual/en/mysqli.prepare.php )创建查询的最安全的方法。
发布于 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
复制相似问题