我尝试查询名称为“ 5”的mysql列.这将输出名称为“ 22”的错误列.
这是我的PHP代码,$pid是我从android应用程序获取的变量,并且始终是数字.当我使用$pid = 5搜索时,而不是使用artist1获取列“ 5”,而是使用eternal1获取列“ 22”.
基本上,它会使第一个打印屏幕中的列名与#混淆.如果#不存在,则可以正确搜索;所以如果我用16搜索,我将得到列16.如何解决此问题?
$pid = $_GET["pid"];
$result=MysqL_query("SELECT * FROM TableComments WHERE `$pid` IS NOT NULL ");
解决方法:
这是我可以想到的sql方言中的设计.我知道有些人出于习惯将0降序或1降序添加到临时查询中,第一个选择通常是ID列,第二个通常选择“名称”列或类似名称.他们根据查询中字段的顺序位置(或模式,在*的情况下)进行查询
为了获得名为5的列,您需要为方言和配置使用适当的sql引用机制.例如,Microsoft sql和Access通常会在[5] = 5的表注释中使用select *.在Postgres和Oracle中,您将在tablecomments中使用select *,其中“ 5” = 5,而在MysqL中,带引号的引号中带有反引号select * from在tablecomments中,其中“ 5” = 5.在Microsoft sql中,如果您的会话将SET QUOTED_IDENTIFIER ON,则还可以使它更像Oracle和Postgres,在这种情况下,您将使用引号而不是方括号.
顺便说一句,但非常重要的是,您不应接受用户输入并将其直接嵌入sql中.如果有人拦截了您的Android应用程序和PHP应用程序之间的HTTP传输(对于像Charles或fiddler这样的代理来说很简单),他们将能够使用注入的任意sql来重播http请求.正如其他评论者所指出的那样,请改用参数化查询.
由于您尝试修改查询本身而不是参数,因此您可能需要考虑将允许的字段名称列入白名单(或将发送的字符串与模式中表示的字段进行比较).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。