【发布时间】:2013-11-30 04:53:10
【问题描述】:
以下代码有问题:
# Connection:
require('config.php');
$MyConnection = new PDO('mysql:host=x;dbname=x', $dbusername, $dbpassword);
$MyConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
# Collecting:
$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);
$lastname = htmlspecialchars($_POST['lastname']);
$email = htmlspecialchars($_POST['email']);
# Checking:
$findUser = $MyConnection->prepare("SELECT * FROM Users WHERE
Username = :username OR Email = :email LIMIT 2");
$findUser->bindParam(':username', $username);
$findUser->bindParam(':email', $email);
$findUser->execute();
$foundUser = $findUser->fetch(PDO::FETCH_OBJ);
if($foundUser->Username == $username) {
echo '
<div id="pop-up" class="error">
This username is already in use. Please choose another one.
</div>
';
}
elseif ($foundUser->Email == $email) {
echo '
<div id="pop-up" class="error">
This email address is already in use. Please choose another one. <br />
If you think this is impossible, please
<a href="http://www.askmephilosophy.co.nf/contact.php">contact us</a>.
</div>
';
每当我尝试注册一个新帐户时,我都会被发送到一个由主机预设的错误页面。所以我得到一个404错误。我很确定问题出在
$findUser = $MyConnection->prepare("SELECT * FROM Users WHERE Username = :username OR Email = :email LIMIT 2");
那段代码我做错了什么?
【问题讨论】:
-
该代码显然没有问题。当然不会导致 404 错误(未找到 HTTP)
-
似乎不对的是
htmlspecialchars()的使用。如果数据库中的用户名是user&lt;abc,则发送到SELECT 查询的结果将是user&lt;abc,这很可能是错误的。希望您不要在INSERT之前调用htmlspecialchars()。 -
您有可以在主机上查看的错误日志吗?如果出于某种奇怪的原因,他们将 PHP 错误发送到 404 而不是 500,希望您能在那里找到它。
-
@JesseDijkstra 这是绕过 XSS 的合适方法,但只能用于输出,绝不可用于输入。数据应以其原始状态存储在数据库中。
-
这里没有 XSS 危险。唯一的危险可能是 SQL 注入,但是当你使用 PDO 和准备好的语句时,你没问题。
标签: php database pdo prepared-statement prepare