![](/img/trans.png)
[英]SQL injection vulnerable code even when we are sanitizing the input mysql_real_escape_string
[英]PHP code vulnerable to SQL injection: how to work with `mysql_real_escape_string()`?
当我从几年前的教程中学习时,我最终得到了以下代码,这些代码易受 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);
是的,这个很好。 不过,您可以使用准备好的语句
不要使用@来隐藏所有错误!
您 append 查询字符串的所有内容都应该使用mysql_real_escape_string
进行转义。 它将阻止大多数 SQL 注射。 但最好使用准备好的语句
例子:
$pdo = new PDO($dsn,$username,$pass);
$stmt = $pdo->prepare("select * from Table where id=?");
if ($stmt->execute(array(1))){
$content = $stmt->fetchAll();
}
请参阅PDO::__construct以供参考
黑客攻击没有什么是万无一失的。 话虽如此,是的.. mysql_real_escape_string() 可以防止 SQL 注入攻击。
我认为你的方法是 sql 注入保存。
我会做类似的事情
sprintf(" SELECT * from table_name WHERE value = '%s'", mysql_escape_string("$var_value"));
sprintf() function 中的 %s 表示该参数被视为字符串并显示为字符串。
如果进行攻击,例如上一个示例中的攻击,发送的查询将是:查看源打印?
SELECT * FROM `members` WHERE username='john' AND password='\' OR \'\'=\''
并将返回一个空的结果集。 (资源)
是的。 在这种情况下。
请注意,没有什么比得上“通用消毒”。 让我们称之为引用,因为这就是它的全部内容。
引用时,您总是引用某些特定 output的文本,例如:
like
表达式对于每种情况,您需要不同的引用,因为每种用法都存在于不同的语法上下文中。 这也意味着不应在 PHP 的输入处进行引用,而应在特定的 output 处进行引用! 这就是诸如magic_quotes_gpc
之类的功能被破坏的原因(我建议将其关闭)。
那么,在这些特定情况下引用什么方法? (请随时纠正我,可能有更现代的方法,但这些对我有用)
mysql_real_escape_string($str)
mysql_real_escape_string(addcslashes($str, "%_"))
htmlspecialchars($str)
json_encode()
- 仅适用于 utf8! 我将我的 function 用于 iso-8859-2mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}'))
- 在这种情况下你不能使用 preg_quote 因为反斜杠会被转义两次!preg_quote()
您可以使用 mysql_real_escape_string 来转义危险字符...
$sanitized_query = sprintf("SELECT * FROM table WHERE field='%s', mysql_real_escape_string($value));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.