首页 > 解决方案 > 我可以使用 mysqli_prepare() 阻止在我的 php 网站上运行 javascript 作为输入吗

问题描述

我正在使用 mysql_prepare() 函数来避免我的网站上的 SQL 注入。我想知道它是否有效!

当我<script>alert("something")</script>用作其中一个字段的输入时,脚本会进入我的数据库,我想知道它是否正常!?!

我错过了什么吗?

或者准备函数只是避免 SQL 注入。

标签: phpprepared-statementsql-injection

解决方案


不,您不能通过使用参数化查询来阻止在您的页面上执行 JavaScript。

使用参数化查询的全部目的是防止您的 SQL 在提供意外输入时中断。当您将数据与 SQL 分开绑定时,数据不会影响 SQL。例如:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$mysqli->set_charset('utf8mb4'); // always set the charset

$email = '1 or 1=1';
$stmt = $mysqli->prepare('SELECT user FROM users WHERE email=?');
$stmt->bind_param('s', $email);
$stmt->execute();

在此示例中,电子邮件看起来像 SQL,但 MySQL 服务器永远不会将其视为 SQL。它是单独绑定的,因此 MySQL 在解析 SQL 后已经接收到它。这有助于防止 SQL 注入。永远不要逃避您绑定的数据!

如您所见,准备好的语句仅保护 SQL。它们不会保护用户将 JavaScript 或 HTML 代码提交到您的数据库中。您需要添加额外的验证规则或简单地将其视为任何其他数据。

为了防止 JavaScript 或 HTML 或任何其他数据破坏您的网站,您需要确保在输出方面始终遵循最佳实践。您必须始终正确格式化数据。


推荐阅读