1

SQLクエリに基づいてすべての値を取得し、それらをphpでスケープするメソッドに取り組んでいます。

アイデアは、SQLクエリを実行するときにセキュリティに不注意なプログラマーを取得することです。

だから私がこれを実行しようとすると:

INSERT INTO tabla (a, b,c,d) VALUES ('a','b','c',a,b)

正規表現はキャプチャする必要が'a' 'b' 'c' aあり、b

私はこれに数日取り組んでいました。

これは、2つの正規表現クエリで取得できる範囲でしたが、より良い方法があるかどうかを知りたいです。

VALUES ?\((([\w'"]+).+?)\)

以前のSQLに基づいて、これは一致します。

VALUES ('a','b','c',a,b)

2番目の正規表現

['"]?(\w)['"]?

一致します

a b c a b

VALUESもちろん、以前は削除しました。

この方法は、挿入する多くの値と一致します。

ただし、たとえばJSONでは機能しません。

{a:b, "asd":"ads" ....}

これで何か助けはありますか?

4

1 に答える 1

0

まず、SQLが多くの種類の一重引用符/二重引用符で囲まれた文字列をサポートしていることを知っておく必要があると思います。
'Northwind\'s category name'
'Northwind''s category name'
"Northwind \"category\" name"
"Northwind ""category"" name"
"Northwind category's name"
'Northwind "category" name'
'Northwind \\ category name'
'Northwind \ncategory \nname'

それらを一致させるには、次のパターンを試してください。
"[^\\"]*(?:(?:\\.|"")[^\\"]*)*"
'[^\\']*(?:(?:\\.|'')[^\\']*)*'

パターンを組み合わせる:

VALUES\s*\(\s*(?:"[^\\"]*(?:(?:\\.|"")[^\\"]*)*"|'[^\\']*(?:(?:\\.|'')[^\\']*)*'|\w+)(?:\s*,\s*(?:"[^\\"]*(?:(?:\\.|"")[^\\"]*)*"|'[^\\']*(?:(?:\\.|'')[^\\']*)*'|\w+))*\)

PHP5.4.5サンプルコード:

    <?php
$pat = '/\bVALUES\s*\((\s*(?:"[^\\"]*(?:(?:\\.|"")[^\\"]*)*"|\'[^\\\']*(?:(?:\\.|\'\')[^\\\']*)*\'|\w+)(?:\s*,\s*(?:"[^\\"]*(?:(?:\\.|"")[^\\"]*)*"|\'[^\\\']*(?:(?:\\.|\'\')[^\\\']*)*\'|\w+))*)\)/';
$sql_sample1 = "INSERT INTO tabla (a, b,c,d) VALUES ('a','b','c',a,b)";
if( preg_match($pat, $sql_sample1, $matches) > 0){
    printf("%s\n", $matches[0]);
    printf("%s\n\n", $matches[1]);    
}

$sql_sample2 = 'INSERT INTO tabla (a, b,c,d) VALUES (\'a\',\'{a:b, "asd":"ads"}\',\'c\',a,b)';
if( preg_match($pat, $sql_sample2, $matches) > 0){
    printf("%s\n", $matches[0]);
    printf("%s\n", $matches[1]);    
}

?>

出力:

VALUES ('a','b','c',a,b)
'a','b','c',a,b

VALUES ('a','{a:b, "asd":"ads"}','c',a,b)
'a','{a:b, "asd":"ads"}','c',a,b

結果から各値を取得する必要がある場合は、,(CSVの解析など)で分割します

これがお役に立てば幸いです:)

于 2012-08-05T20:44:49.050 に答える