PHP 和 PostgreSQL:避免跨站点脚本和 SQL 注入攻击
PHP and PostgreSQL: Avoiding cross-site scripting and SQL injection attacks
当通过 PHP 将数据插入 PostgreSQL 数据库时,我应该将数据嵌入到函数 pg_query
中的 sql INSERT
语句中,还是通过数据通过数组进入pg_insert
函数?
我的猜测是 pg_insert
,因为它只是将数据直接插入 table 而不是查询 table 然后插入它。
请访问http://php.net/manual/en/book.pgsql.php以参考这两个功能。
为了避免 SQL 注入,您希望调用接受 SQL 参数作为方法参数的方法。这样,您的 SQL 库 可以确保参数被正确转义。切勿通过 "appending" 字符串片段构建自己的 SQL 语句。如果这样做,您有责任对参数进行 SQL 转义。这很难做对。
因此,您应该更喜欢 pg_query_params
(或 pg_insert
)而不是 pg_query
。
这是错误的(因为你 必须记住转义 $arg1 参数。这很难。):
pg_query("INSERT INTO TABLE ... VALUES " . $arg1 . ";");
正确(因为 PostgresQL 的聪明人知道如何转义您的参数):
pg_query_params("INSERT INTO TABLE ... VALUES ", "FooBar");
当通过 PHP 将数据插入 PostgreSQL 数据库时,我应该将数据嵌入到函数 pg_query
中的 sql INSERT
语句中,还是通过数据通过数组进入pg_insert
函数?
我的猜测是 pg_insert
,因为它只是将数据直接插入 table 而不是查询 table 然后插入它。
请访问http://php.net/manual/en/book.pgsql.php以参考这两个功能。
为了避免 SQL 注入,您希望调用接受 SQL 参数作为方法参数的方法。这样,您的 SQL 库 可以确保参数被正确转义。切勿通过 "appending" 字符串片段构建自己的 SQL 语句。如果这样做,您有责任对参数进行 SQL 转义。这很难做对。
因此,您应该更喜欢 pg_query_params
(或 pg_insert
)而不是 pg_query
。
这是错误的(因为你 必须记住转义 $arg1 参数。这很难。):
pg_query("INSERT INTO TABLE ... VALUES " . $arg1 . ";");
正确(因为 PostgresQL 的聪明人知道如何转义您的参数):
pg_query_params("INSERT INTO TABLE ... VALUES ", "FooBar");