我尝试过尝试通过在firefox之外向服务器进行自定义查询来实现SQL注入。
在php中,所有变量都以这样的字符串传递给查询。
注意,在此阶段,尚未触及$ _POST。
mysql_query('INSERT INTO users (password, username) VALUES(' . sha1($_POST['password']) . ',' . $_POST['username'] . '));
这是一种安全的改变方式吗?
答案 0 :(得分:3)
您绝对应该使用mysql_real_escape_string转义用户名。
当然,最好的解决方案是使用准备好的陈述。这样,查询语法和数据的分离就在mysql API级别上进行。
而且,正如其他人所指出的那样,价值观绝对应该用引号括起来。特别是文本。
答案 1 :(得分:3)
你在做什么是危险的,因为有人可以发送带有邪恶用户名的POST请求。 你可以检查每个参数并将其转义, 另外你可以使用mysqli(http://php.net/manual/en/book.mysqli.php), 并使用prepare + bind绑定参数。
第一步是避免对其他用户的攻击, 而第二个对你的服务器端安全有好处。
还要查看此问题:How do you prevent SQL injection in LAMP applications?
答案 2 :(得分:2)
查看http://php.net/mysqli.real-escape-string,将其添加到所有传入的值应该有助于使其更安全。
答案 3 :(得分:2)
在检查你的代码时,我很惊讶当你不引用你插入的文字时它会起作用 - 你将生成如下代码:
INSERT INTO user (password, username) VALUES (abc1234fg00000, admin);
所以每次都会出错。假设这只是一个错字......
mysql扩展通过每次调用仅允许一个查询来限制您执行注入攻击的能力。此外,对INSERT语句的注入攻击的范围有限。除此之外,在拼接到insert语句之前将表示更改为中性格式这一事实意味着它不是此类攻击的潜在途径。但是,如果有人POST一个包含单引号的用户名,那么你的代码应该会失败(如果没有,那么你启用了magic_quotes,这已被弃用)。
OTOH如果您使用相同的方法验证帐户,那么您对注射攻击持开放态度 - 考虑
"SELECT 1
FROM users
WHERE username='" . $_POST['username'] . "'
AND password='" . sha1($_POST['username'] . "';";
如果$ _POST ['username']包含“admin'OR 1”,那么您的系统会受到损害。
你应该总是使用mysql_real_escape_string(),除非你使用不同的函数使数据安全(例如sha1,bas64_encode ....但不是addslashes)
下进行。
答案 4 :(得分:1)
这是不安全的,除非启用了magic_quotes_gpc
配置指令
var_dump(ini_get('magic_quotes_gpc'));
或phpinfo();
可以显示实际值
请注意,此指令是脏的,已弃用且非常讨厌。并且会使一些密码无效。
答案 5 :(得分:0)
我有时想知道他们是否会在老人家中找到我,在护士们走过时尖叫着“BIND VARIABLES”。
这是2010年的人,而不是1995年。
BIND VARIABLES!
BIND VARIABLES!