当我从几年前的教程中学习时,我最终得到了以下易于进行SQL注入的代码。
有人可以向我解释如何使用mysql_real_escape_string()
吗?
这是目前的防弹方法吗?
//Function to sanitize values received from the form. Prevents SQL injection
function clean($str) {
$str = @trim($str);
if(get_magic_quotes_gpc()) {
$str = stripslashes($str);
}
return mysql_real_escape_string($str);
}
//Sanitize the POST values
$usr = $_SESSION['usr'];
$live = (isset($_POST['live']))?1:0;
$created = date("F j, Y, g:i a",time()+60*60);
$title= clean($_POST['title']);
$content = clean($_POST['content']);
//Create INSERT query
$qry = "INSERT INTO news( usr, live, created, title, content) VALUES( '$usr', '$live', '$created', '$title', '$content') ";
$result = @mysql_query($qry);
答案 0 :(得分:2)
是的,这个很好。 You can use prepared statements,但
不要使用@来隐藏所有错误!
答案 1 :(得分:2)
您追加查询字符串的所有内容都应使用mysql_real_escape_string
进行转义。它将阻止大多数SQL注入。但最好使用prepared statements
示例:
$pdo = new PDO($dsn,$username,$pass);
$stmt = $pdo->prepare("select * from Table where id=?");
if ($stmt->execute(array(1))){
$content = $stmt->fetchAll();
}
请参阅PDO::__construct以获取参考资料
答案 2 :(得分:1)
在黑客攻击方面没有什么是防弹的;话虽如此,是的.. mysql_real_escape_string()可以防止SQL注入攻击。
答案 3 :(得分:1)
我认为你的方法是sql注入保存。
答案 4 :(得分:1)
我会做像
这样的事情sprintf(" SELECT * from table_name WHERE value = '%s'", mysql_escape_string("$var_value"));
来自sprintf()函数的%s表示该参数被视为字符串并以字符串形式显示。
如果发生了攻击,例如上一个示例中的攻击,则发送的查询将是: 查看源 打印?
SELECT * FROM `members` WHERE username='john' AND password='\' OR \'\'=\''
并返回一个空结果集。 (source)
答案 5 :(得分:1)
是的,确实如此。 在这种情况下。
请注意,没有什么比“普遍消毒”更像。我们称之为引用,因为这就是它的全部内容。
引用时,始终为某些特定输出 引用文字,例如:
like
mysql查询表达式对于每种情况,您需要不同的引用,因为每种用法都存在于不同的语法上下文中。这也意味着引用不应该在PHP的输入中进行,而是在特定的输出!这就是magic_quotes_gpc
等功能被破坏的原因(我建议将其关闭)。
那么,在这些特定情况下,用什么方法来引用? (随意纠正我,可能有更现代的方法,但这些对我有用)
mysql_real_escape_string($str)
mysql_real_escape_string(addcslashes($str, "%_"))
htmlspecialchars($str)
json_encode()
- 仅适用于utf8!我将我的功能用于iso-8859-2 mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}'))
- 在这种情况下你不能使用preg_quote,因为反斜杠会被转义两次!preg_quote()
答案 6 :(得分:1)
你可以使用mysql_real_escape_string来逃避危险的角色......
$sanitized_query = sprintf("SELECT * FROM table WHERE field='%s', mysql_real_escape_string($value));