在PHP中转义字符串

时间:2014-03-13 02:47:00

标签: php escaping

此代码段工作正常,直到它到达带有撇号的数据库条目。我看到我拉它们后我需要逃脱它们。刚接触PHP我不知道如何处理有关PDO和“ - >”的所有信息。和mysqli_real_escape_string()。我对这一切感到有些困惑。如何逃离$ team1rows和$ team2rows所以我可以将它们传递回我的页面?感谢。

$team1rows = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM $page WHERE vote = '$team1'"));
$team2rows = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM $page WHERE vote = '$team2'"));

echo $team1rows . "|" . $team2rows;

回声很好,直到碰到撇号。

3 个答案:

答案 0 :(得分:0)

使用PDO,如果使用正确,则prepare语句会阻止SQL注入。 mysqli_query是不再使用的旧方法。请参阅下面列出的示例:

<?php
$pdo = new PDO('sqlite:users.db');
$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');
$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); // <-- Automatically sanitized by PDO
$stmt->execute();

来源: http://www.phptherightway.com/#databases

- &gt;意味着你正在处理一个对象的方法。 所以:$ pdo是一个对象 然后,您可以使用 - &gt;访问其中的方法(函数)。 $ pdo-&gt;准备例如

答案 1 :(得分:0)

tldr; use placeholders (aka parameterized queries / prepared statements)。这将消除所有 SQL Injection,包括数据包含撇号时意外损坏的查询!

mysqli supports placeholders以来,无需切换到PDO!我已经将代码保留在非OOP mysqli语法中,尽管我建议使用mysqli-object API。以下代码执行任何&#34;转义&#34; - 如果这样做,它只是一个实现细节。

# Create prepared statement, bind parameters - no apostrophe-induced error!
# - With placeholders there is need to worry about quoting at all
# - I recommend explicitly selecting columns
# - $page is NOT data in the query and cannot be bound in a placeholder
$stmt = mysqli_prepare($connection, "SELECT * FROM $page WHERE vote = ?");
mysqli_stmt_bind_param($stmt, "s", $vote);

# Execute prepared statement
$result = mysqli_stmt_execute($stmt);

# Use results somehow;
# Make sure check $result/execution for errors!
# (PDO is nice because it allows escalation of query errors to exceptions.)
$count = mysqli_num_rows($result);

现在,如上所述,$ page无法绑定在占位符中,因为它与查询形状相关,但不是数据。接近这种特殊情况的一种可接受的方法 - 如果不是一般地重新设计模式 - 是use a whitelist approach。例如,

$approvedPages = array("people", "tools", "pageX");
if (!in_array($page, $approvedPages)) {
   # Wasn't a known page - might have been something mischievous!
   # Choose default approved page or throw error or something.
   $page = $approvedPages[0];
}

答案 2 :(得分:-1)

我弄清楚我做错了什么。我的业余错误。我试图逃避查询的结果。但在这种情况下,结果结果是行数。所以逃避结果并不是问题,因为它只是一个数字。我很困惑,因为这个数字与一个撇号的值相关联。我知道所以查询中使用的字符串没有被转义,导致它失败,而不是结果。

所以通过FIRST转义我在查询中使用的变量,就像这样......

$page = mysqli_real_escape_string($connection, $page);
$team1 = mysqli_real_escape_string($connection, $team1);
$team2 = mysqli_real_escape_string($connection, $team2);

这给了我很好的字符串用于以下查询。

$team1number = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM $page WHERE vote = '$team1'"));
$team2number = mysqli_num_rows(mysqli_query($connection,"SELECT * FROM $page WHERE vote = '$team2'"));

echo $team1number . "|" . $team2number;

再次,我把它全部倒退了,并试图逃避结果。 Noob继续我的努力但是由于这一发现而学到了很多东西。谢谢大家。