1. 程式人生 > >PHP最全防止sql注入方法

PHP最全防止sql注入方法

1mysql_real_escape_string -- 轉義 SQL 語句中使用的字串中的特殊字元,並考慮到連線的當前字符集

使用方法如下:

  1. $sql = "select count(*) as ctr from users where username
  2. ='".mysql_real_escape_string($username)."' and
  3. password='". mysql_real_escape_string($pw)."' limit 1";

    使用mysql_real_escape_string()作為使用者輸入的包裝器,就可以避免使用者輸入中的任何惡意 SQL 注入。

    2開啟magic_quotes_gpc來防止SQL注入

    php.ini中有一個設定:magic_quotes_gpc = Off
      這個預設是關閉的,如果它開啟後將自動把使用者提交對sql的查詢進行轉換,  比如把 ' 轉為 \'等,對於防止sql注射有重大作用。

    如果magic_quotes_gpc=Off,則使用addslashes()函式

    3)自定義函式

  4. function inject_check($sql_str) {
  5. return eregi('select|insert|and|or|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile', $sql_str);
  6. }
  7. function verify_id($id=null) {
  8. if(!$id) {
  9. exit('沒有提交引數!');
  10. } elseif(inject_check($id)) {
  11. exit('提交的引數非法!');
  12. } elseif(!is_numeric($id)) {
  13. exit('提交的引數非法!');
  14. }
  15. $id = intval($id);
  16. return $id;
  17. }
  18. function str_check( $str ) {
  19. if(!get_magic_quotes_gpc()) {
  20. $str = addslashes($str); // 進行過濾
  21. }
  22. $str = str_replace("_", "\_", $str);
  23. $str = str_replace("%", "\%", $str);
  24. return $str;
  25. }
  26. function post_check($post) {
  27. if(!get_magic_quotes_gpc()) {
  28. $post = addslashes($post);
  29. }
  30. $post = str_replace("_", "\_", $post);
  31. $post = str_replace("%", "\%", $post);
  32. $post = nl2br($post);
  33. $post = htmlspecialchars($post);
  34. return $post;