PHP无参数绑定预防SQL注入

发布于 2024-10-31 09:28:56 字数 374 浏览 3 评论 0原文

可能的重复:
如何防止 PHP 中的 SQL 注入?

我正在制作一个视频我的大学图书馆的流媒体网站。我正在使用 PHP 和 MySql。我在这个项目中没有使用任何参数化查询。

最近我开始了解SQL注入。现在我的代码已经快完成了,过两天就要提交项目了,那么我现在如何确保我的代码不会出现SQL注入呢?

我现在无法将整个事情转换为参数化接口。我现在应该怎么做才能避免我的网站上出现 SQL 注入?

Possible Duplicate:
How to prevent SQL injection in PHP?

I am working for a video streaming website for my college library. I am using PHP and MySql. I have not used any parameterized queries in this project.

Recently I came to know about SQL injections. Now that my code is almost done and I have to submit the project in the next two days, how can I now ensure that my code is not SQL injection prone?

Converting the whole thing in to a parameterized interface is what I can't do now. What should I do now to avoid SQL Injections on my website?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

臻嫒无言 2024-11-07 09:28:56

防止 SQL 注入(如果不使用准备语句)的基本思想是转义数据

当您将一些预期的整数值注入 SQL 查询时,请使用 intval 确保它是一个整数()

当表中有小数/数字字段时,请使用 floatval()

当表中有字符串 (char, varchar, text) 字段时,请使用 API 提供的函数来转义字符串:

The basic idea to prevent SQL injections (if not using Prepared Statements) is to escape your data.

When you inject some expected integer value into an SQL query, make sure it's an integer, using intval().

When you have a decimal/numeric field in your table, use floatval().

And when you have a string (char, varchar, text) field in your table, use the function provided by your API to escape strings :

小瓶盖 2024-11-07 09:28:56

我真的建议您返回并使用参数化查询正确执行此操作。这是实现安全的唯一坚实道路。一旦开始,完成此操作可能不会花费太长时间。

您还应该知道网站永远不会“完成”。当您启动网站时,您的工作才刚刚开始。当您了解安全问题时解决它们是其中的一部分,这也不例外。

I really recommend that you go back and do it right with parameterized queries. It is the only solid path towards security. It likely won't take too long to do this once you get started.

You should also know that websites are never "finished". When you launch a site, your work has just begun. Fixing security troubles as you learn about them is part of it, and this is no different.

梦途 2024-11-07 09:28:56

您需要确保使用 PHP 函数 mysql_real_escape_string 对 SQL 查询中使用的任何用户提供的输入进行转义,并且如果您允许人们提交文本来运行 htmlentities提供的文本,因此 XXS 是不可能的。如果可能,白名单用户提供输入并丢弃其他任何内容

这只是触及您可以做的事情的表面,但要研究查询转义和防止跨站点脚本编写。

You'll want to make sure any user provided inputs that get used in SQL queries are escaped using the PHP function mysql_real_escape_string and if you are letting people submit text to run htmlentities on the provided text so XXS isn't possible. If possible, white-list user provided input and discard anything else

This is just touching the surface of what you can do but look into query escaping and preventing cross site scripting.

末蓝 2024-11-07 09:28:56

使用 PDO(或者 mysqli 或一些抽象层)和准备好的语句。

简单示例:

$pdo = new PDO($dsn);
$stmt = $pdo->prepare("SELECT name FROM users WHERE id = ?");
$stmt->execute(array($unsafe_id));
$name = $stmt->fetchColumn();

在此示例中,$unsafe_id 可以安全使用。引用手册页:

调用 PDO::prepare() 并
PDOStatement::execute() for 语句
将多次发布
具有不同的参数值
优化您的性能
应用程序允许驾驶员
协商客户端和/或服务器端
查询计划和元的缓存
信息,并有助于防止 SQL
通过消除注入攻击
需要手动引用参数。

PDO 将模拟准备好的
语句/绑定参数
本身不支持的驱动程序
他们,也可以重写命名或
问号样式参数标记
到更合适的东西,如果
驱动程序支持一种样式,但不支持
其他。

Use PDO (or alternatively mysqli or some abstraction layer) and prepared statements.

Quick example:

$pdo = new PDO($dsn);
$stmt = $pdo->prepare("SELECT name FROM users WHERE id = ?");
$stmt->execute(array($unsafe_id));
$name = $stmt->fetchColumn();

In this example, $unsafe_id will be safe to use. To quote the manual page:

Calling PDO::prepare() and
PDOStatement::execute() for statements
that will be issued multiple times
with different parameter values
optimizes the performance of your
application by allowing the driver to
negotiate client and/or server side
caching of the query plan and meta
information, and helps to prevent SQL
injection attacks by eliminating the
need to manually quote the parameters.

PDO will emulate prepared
statements/bound parameters for
drivers that do not natively support
them, and can also rewrite named or
question mark style parameter markers
to something more appropriate, if the
driver supports one style but not the
other.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文