简体   繁体   English

防止 PHP 中的 SQL 注入攻击

[英]Prevent SQL injection attack in PHP

I would like to prevent SQL attacks on this piece of PHP code (this is just a practice exercise in class).我想防止 SQL 对这段 PHP 代码进行攻击(这只是课堂练习)。 This can easily be exploited by setting @mail equal to something like '); DROP TABLE PURCHASE; --这可以通过将@mail设置为类似'); DROP TABLE PURCHASE; --来轻松利用。 '); DROP TABLE PURCHASE; --

$db = new SQLite3 ($db_name);

$sql = sprintf ("INSERT INTO PURCHASE (quantity, name, password, mail) 
                 VALUES ('%s', '%s', '%s', '%s')\n",
                 $Quantity, $Name, $Password, $Mail );

echo $sql;
if (!$db->exec ($sql)) {
    throw new Exception($db->lastErrorMsg());
}

I tried to prevent this by passing parameters like this, but I get 500 Internal Server Error我试图通过传递这样的参数来防止这种情况,但我得到500 Internal Server Error

$db = new SQLite3 ($db_name);

$sql = $db->prepare("INSERT INTO PURCHASE(quantity, name, password, mail)
            VALUES (:Quantity, :Name, :Password, :Mail)");

$sql->bindValue(':Quantity', $Quantity, SQLITE3_TEXT);
$sql->bindValue(':Name', $Name, SQLITE3_TEXT);
$sql->bindValue(':Password', $Password, SQLITE3_TEXT);
$sql->bindValue(':Mail', $Mail, SQLITE3_TEXT);

echo $sql;
if (!$db->exec ($sql)) {
    throw new Exception($db->lastErrorMsg());
}

How can I fix this?我怎样才能解决这个问题?

SQLite3::exec is for executing a query string, not a prepared statement. SQLite3::exec用于执行查询字符串,而不是准备好的语句。 You need to use SQLite3Stmt::execute instead.您需要改用SQLite3Stmt::execute Change:改变:

if (!$db->exec ($sql)) {
    throw new Exception($db->lastErrorMsg());
}

to

if (!$sql->execute()) {
    throw new Exception($db->lastErrorMsg());
}

Note you can't echo $sql as it is an object, not a simple type.请注意,您不能echo $sql ,因为它是 object,而不是简单类型。 If you want to look at what a SQLite3Stmt object looks like, you would need to print_r($sql) or var_dump($sql) .如果您想查看SQLite3Stmt object 的外观,您需要print_r($sql)var_dump($sql)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM