如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)
这是因为用户可以输入类似的内容value'); DROP TABLE table;--,查询变为:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)
可以采取哪些措施来防止这种情况发生?
即使使用mysql_real_escape_string()函数,是否存在SQL注入的可能性?
考虑这个示例情况.SQL是用PHP构造的,如下所示:
$login = mysql_real_escape_string(GetFromPost('login'));
$password = mysql_real_escape_string(GetFromPost('password'));
$sql = "SELECT * FROM table WHERE login='$login' AND password='$password'";
Run Code Online (Sandbox Code Playgroud)
我听过很多人对我说,这样的代码仍然很危险,即使使用了mysql_real_escape_string()函数也可以破解.但我想不出任何可能的漏洞?
像这样的经典注射:
aaa' OR 1=1 --
Run Code Online (Sandbox Code Playgroud)
不工作.
你知道任何可能通过上面的PHP代码注入的注入吗?
在http://www.justinshattuck.com/2007/01/18/mysql-injection-cheat-sheet/?akst_action=share-this上,有一节声称可以绕过某些亚洲字符编码的mysql_real_escape_string
用BIG5或GBK绕过mysql_real_escape_string()
"注入字符串"
に关する追加情报:上面的字符是中文Big5
这是真的吗?如果是这样,如果您无法访问预先准备好的声明,您将如何保护您的网站不受此影响?
我正在使用php开发我的个人网站.一切都还可以,但我只是mysql_real_escape_string在php.net上阅读手册,发现了两件事:
- 在向MySQL发送查询之前,必须始终使用此函数(少数例外)使数据安全.
- mysql_real_escape_string()不会转义%和_.如果与LIKE,GRANT或REVOKE结合使用,这些是MySQL中的通配符.
我有两个问题:
1 - 这些例外是什么?
2-如何逃避这些角色?