Mysql 真实转义字符串的正确用法
Correct usage of Mysql real escape strings
我是 SQL 注入的新手,想知道我是否正确使用了 mysql_real_escape_string?我应该为数据库和密码制作字符串以确保安全吗?如果有任何建议,我们将不胜感激!
<html>
<body>
<img src="searchlogo.png" style="PADDING-TOP: 50px">
<form action='./search.php' method='get' >
<label>Search Our Archives</label>
<input type="text" name="k" size="50" value='<?php echo $_GET['k'];?>'/ >
<button type="submit">Search</button>
</form>
<hr/>
<?php
$k = $_GET['k'];
$terms = explode(" ", $k);
$query ="SELECT * FROM search WHERE ";
foreach ($terms as $each){
$i++;
if ($i == 1)
$query .= "keywords LIKE'%$each%'";
else
$query .= "OR keywords LIKE'%$each%'";
}
$db = mysql_connect("**host***","***database***","***password***",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
if (!$db) {
die("Database connection failed: " . mysql_error());
}
$db_select = mysql_select_db("***database***",$db);
if (!$db_select) {
die("Database selection also failed: " . mysql_error());
}
$result = mysql_query("SELECT * FROM search", $db);
if (!$result) {
die("Database query failed: " . mysql_error());
}
while ($row = mysql_fetch_assoc($result)){
$id = $row['id'];
$title = $row['title'];
$description = $row['description'];
$keywords = $row['keywords'];
$link = $row['link'];
echo "<h2><a href='$link'>$title</a></h2>$description<br /><br />";
}
mysql_close($db);
$query = mysql_query($query);
$numrows = mysql_num_rows($query);
if ($numrows >0){
}
else
echo "No results found for \"<b>$k</b>\"";
?>
</body>
</html>
没有。在包含在 SQL 文本之前,您错过了转义 $each
的内容,此处:
$query .= "keywords LIKE'%$each%'";
我们的偏好是避免使用已弃用的 mysql_
函数,并使用 PDO 或 mysqli 接口。我们更愿意使用带有绑定占位符的准备好的语句。他们真的没那么难。
如果我要 "escape" 包含在 SQL 文本中的潜在不安全值,我会首先分解该分配,看起来像这样。
$query .= "keywords LIKE '%" . $each . "%'";
现在,我们可以 "wrap" 在函数调用中引用该变量,如下所示:
$query .= "keywords LIKE '%" . mysql_real_escape_string($each) . "%'";
无论您将可能不安全的值作为 SQL 文本的一部分,您都需要重复该模式。
并且没有必要在连接参数中包含 $username
和 $password
。这不是 SQL 声明。需要 "escaped" 的是包含在 SQL 语句文本中的值。
同样,我们的首选是使用 PDO 或 mysqli,并使用带有绑定占位符的准备好的语句。例如:
$query .= " keywords LIKE CONCAT('%', ? , '%')";
此外,您在 HTML 中包含的值可能包含一些具有潜在危险的内容。通过适当的转义 运行 是一个很好的做法。在某些情况下 http://php.net/manual/en/function.htmlspecialchars.php 就足够了。
顺便说一句,当动态附加到包含 SQL 文本的字符串时,我的偏好是在 beginning 包含所需的分隔符 space我要添加的内容,而不必记住在要附加的字符串末尾包含一个额外的 space 。这只是个人喜好。
我是 SQL 注入的新手,想知道我是否正确使用了 mysql_real_escape_string?我应该为数据库和密码制作字符串以确保安全吗?如果有任何建议,我们将不胜感激!
<html>
<body>
<img src="searchlogo.png" style="PADDING-TOP: 50px">
<form action='./search.php' method='get' >
<label>Search Our Archives</label>
<input type="text" name="k" size="50" value='<?php echo $_GET['k'];?>'/ >
<button type="submit">Search</button>
</form>
<hr/>
<?php
$k = $_GET['k'];
$terms = explode(" ", $k);
$query ="SELECT * FROM search WHERE ";
foreach ($terms as $each){
$i++;
if ($i == 1)
$query .= "keywords LIKE'%$each%'";
else
$query .= "OR keywords LIKE'%$each%'";
}
$db = mysql_connect("**host***","***database***","***password***",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
if (!$db) {
die("Database connection failed: " . mysql_error());
}
$db_select = mysql_select_db("***database***",$db);
if (!$db_select) {
die("Database selection also failed: " . mysql_error());
}
$result = mysql_query("SELECT * FROM search", $db);
if (!$result) {
die("Database query failed: " . mysql_error());
}
while ($row = mysql_fetch_assoc($result)){
$id = $row['id'];
$title = $row['title'];
$description = $row['description'];
$keywords = $row['keywords'];
$link = $row['link'];
echo "<h2><a href='$link'>$title</a></h2>$description<br /><br />";
}
mysql_close($db);
$query = mysql_query($query);
$numrows = mysql_num_rows($query);
if ($numrows >0){
}
else
echo "No results found for \"<b>$k</b>\"";
?>
</body>
</html>
没有。在包含在 SQL 文本之前,您错过了转义 $each
的内容,此处:
$query .= "keywords LIKE'%$each%'";
我们的偏好是避免使用已弃用的 mysql_
函数,并使用 PDO 或 mysqli 接口。我们更愿意使用带有绑定占位符的准备好的语句。他们真的没那么难。
如果我要 "escape" 包含在 SQL 文本中的潜在不安全值,我会首先分解该分配,看起来像这样。
$query .= "keywords LIKE '%" . $each . "%'";
现在,我们可以 "wrap" 在函数调用中引用该变量,如下所示:
$query .= "keywords LIKE '%" . mysql_real_escape_string($each) . "%'";
无论您将可能不安全的值作为 SQL 文本的一部分,您都需要重复该模式。
并且没有必要在连接参数中包含 $username
和 $password
。这不是 SQL 声明。需要 "escaped" 的是包含在 SQL 语句文本中的值。
同样,我们的首选是使用 PDO 或 mysqli,并使用带有绑定占位符的准备好的语句。例如:
$query .= " keywords LIKE CONCAT('%', ? , '%')";
此外,您在 HTML 中包含的值可能包含一些具有潜在危险的内容。通过适当的转义 运行 是一个很好的做法。在某些情况下 http://php.net/manual/en/function.htmlspecialchars.php 就足够了。
顺便说一句,当动态附加到包含 SQL 文本的字符串时,我的偏好是在 beginning 包含所需的分隔符 space我要添加的内容,而不必记住在要附加的字符串末尾包含一个额外的 space 。这只是个人喜好。