0

我有 PHP 脚本,它使用 SQL 查询将 JSON 保存在变量中。查询是这样的(我已将列的名称更改为更通用的名称)

$value = $_GET['value'];

SELECT column1 AS 'col1', column2 AS 'col2', column3 AS 'col3', column4 AS 'col4', column5 AS 'col5'
FROM db.dbo.table
WHERE column5 = $value

该变量来自另一个页面,它是一个可能包含也可能不包含空格的字符串。但是,这不会返回任何 JSON,我不确定为什么(它只是返回[])。这个示例脚本在 SQL Server 中运行良好,但是当我尝试在 PHP 中运行它时,它不起作用。如果我去掉这一行WHERE column5 = $value,脚本将返回 JSON。这是在另一个页面上的 JS 脚本中传递变量的行

return '<a href="/script.php?value=' + data + '" target="_blank">Example</a>'

我确定这是小问题,但有人可以告诉我出了什么问题吗?谢谢

4

4 回答 4

2

您的方法有两个问题(除了不使用准备好的语句)。

首先是您信任用户输入:

$value = $_GET['value'];

这应该由某种转义来代替$value,这样就不能执行任意查询(例如在 a 中SUBSELECT)并导致拒绝服务,或者更糟糕的是,如果某些查询允许发出DELETEDROP命令。

第二个问题是该值可能包含空格,除非您添加引号,否则这会破坏 SQL 语法:

SELECT column1 AS 'col1', column2 AS 'col2', column3 AS 'col3', column4 AS 'col4', column5 AS 'col5'
FROM db.dbo.table
WHERE column5 = '$value'

通过明智地使用准备好的语句,您可以一次性解决这两个问题。

第二个问题的另一个方面是,如果通过 URL 传递的值包含 URL 引用的字符(例如 +、% 等),您可能会遇到转义问题,或者如果值跨越编码边界(例如原始页面是,或被自动识别为,或可能被强制识别为ISO-8859-15,而数据库是 UTF-8,反之亦然。最后一个问题没有“一刀切” " 解决方案 - 即使准备好的语句可能help - 并要求您仔细检查变量的编码路径,或强制将所有内容始终转换为 UTF-8。您可以通过在包含链接的页面中的值内放置国际字符(例如“à”)并查看会发生什么来验证您是否有风险。

于 2013-07-15T12:57:28.790 回答
2
$query="SELECT column1 AS 'col1', column2 AS 'col2', column3 AS 'col3', column4 AS 'col4', column5 AS 'col5' FROM db.dbo.table WHERE column5 ='". $_GET['value']."'";
OR
$query="SELECT column1 AS 'col1', column2 AS 'col2', column3 AS 'col3', column4 AS 'col4', column5 AS 'col5' FROM db.dbo.table WHERE column5 ='". $value."'";
于 2013-07-15T12:50:37.227 回答
2

在您的条款中添加引号where:例如where column5 = '$value'

于 2013-07-15T12:47:33.137 回答
0

尝试:

$sql = "SELECT column1 AS 'col1', column2 AS 'col2', column3 AS 'col3', column4 AS 'col4', column5 AS 'col5' FROM db.dbo.table WHERE column5 = '$value'";
于 2013-07-15T12:47:50.190 回答