0

SQL クエリを使用して JSON を変数に保存する PHP スクリプトがあります。クエリは次のようなものです(列の名前をより一般的な名前に変更しました)

$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

あなたのアプローチには2つの問題があります(準備されたステートメントを使用しないことを除いて)。

1 つ目は、ユーザー入力を信頼することです。

$value = $_GET['value'];

これは、任意のクエリ (たとえば a 内) を実行してサービス拒否を引き起こす$valueことができないようにするために、ある種の のエスケープに置き換える必要があります。SUBSELECTDELETEDROP

2 つ目の問題は、値にスペースが含まれている可能性があり、引用符を追加しない限り、SQL 構文が壊れる可能性があることです。

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

準備済みステートメントを賢明に使用することで、両方の問題を一度に解決できます。

同じ 2 番目の問題のもう 1 つの側面は、URL を介して渡された値に URL で引用された文字 (+、% など) が含まれている場合、または値がエンコーディングの境界を超えている場合 (たとえば、元のページがISO-8859-15 であるか、自動的に認識されるか、強制的に認識される可能性があり、データベースが UTF-8 であるか、またはその逆です。 " 解決策 - 準備されたステートメントhelp - 変数のエンコーディング パスを注意深く確認するか、すべてを常に UTF-8 に変換するように強制する必要があります。リンクを含むページの値の中に国際文字 (「à」など) を挿入し、何が起こるかを確認することで、危険にさらされているかどうかを確認できます。

于 2013-07-15T12:57:28.790 に答える
2

where句に引用符を追加します:例where column5 = '$value'

于 2013-07-15T12:47:33.137 に答える
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 に答える
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 に答える