我是否需要转义/过滤来自数据库的数据?即使所述数据已经“转义”一次(在将其插入数据库的时间点)。
例如,假设我允许用户通过具有标题输入和文本区域输入的表单提交博客文章。
恶意用户提交博客文章
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/