php - 直接来自数据库的值是否需要转义?

标签 php mysql security sql-injection

我是否需要转义/过滤来自数据库的数据?即使所述数据已经“转义”一次(在将其插入数据库的时间点)。

例如,假设我允许用户通过具有标题输入和文本区域输入的表单提交博客文章。

恶意用户提交博客文章

title: Attackposttitle');DROP TABLE posts;--

textarea:哈哈哈核爆了你的网站 noobzors!

现在,当它被插入到我的数据库中时,我将使用 mysql_real_escape_string 对它进行转义,但是一旦它进入数据库,我稍后将在我的 php 博客应用程序中使用如下内容引用该数据:

sql="SELECT posttitle FROM posts WHERE id=50";
$posttitlearray = mysql_fetch_array(mysql_query($sql));

这就是我关心的地方,例如,如果我运行以下查询来获取帖子内容会怎样:

sql="SELECT postcontent FROM posts WHERE posttitle=$posttitlearray[posttitle]";

理论上我不是在给自己注入(inject)sql吗? IE,我没有有效地运行查询吗:

sql="SELECT postcontent FROM posts WHERE posttitle=Attackposttitle');DROP TABLE posts;--";

或者 "Attackposttitle');DROP TABLE posts;--"数据一旦进入数据库就继续被转义?

我是否需要像这样不断地逃避它:

sql="SELECT postcontent FROM posts WHERE posttitle=msql_real_escape_string($posttitlearray[posttitle])";

或者数据在首次插入数据库时​​经过最初转义后是否安全?

谢谢堆栈!

最佳答案

一旦入库就不会继续转义了。你将不得不再次逃脱它。

$sql="SELECT postcontent FROM posts WHERE posttitle='".mysql_real_escape_string($posttitlearray[posttitle])."'";

关于php - 直接来自数据库的值是否需要转义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7437668/

相关文章:

php - 如何计算特定组的多个时间戳值的时间差?

php - Varnish/NGINX 基于时间的限制

php - 如何使用 preg_match() 或其他方式找到确切的数字或单词

PHP get_headers 不适用于本地 Apache URL

mysql - 如何在 MySQL 数据库中选择日期时间为今天 - 2 天的行?

MySQL AVG 基于另一列的值

java - 尝试使用 JSch java 连接到 sftp 服务器时禁用对known_hosts的检查是否安全

mysql - 如何将新列添加到现有的复合主键

Codeigniter 和多个并发登录

c++ - RC4-128 位是否比 AES-128 位安全?